如何同时录制视频和播放音频(快速教程) [英] How to record video and play audio at the same time (swift tutorial)

查看:880
本文介绍了如何同时录制视频和播放音频(快速教程)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此您想同时录制来自用户库中的视频播放音乐 吗?别再看了.下面是答案.

So you want to record a video and play music from the user's library at the same time? Look no further. Below is the answer.

推荐答案

对于音频播放,您将使用AVAudioPlayer.您要做的就是将AVAudioPlayer声明为全局变量(我将其命名为 audioPlayer )并实现以下代码.

For the audio playback you will use AVAudioPlayer. All you have to do is to declare the AVAudioPlayer as a global variable (I named it audioPlayer) and implement the code below.

在用户选择要播放的歌曲之后使用此功能:

Use this in after the user chose the song he/she wants to play:

func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
    let pickerItem: MPMediaItem = mediaItemCollection.items[0]
    let songURL = pickerItem.valueForProperty(MPMediaItemPropertyAssetURL)
    if let sURL = songURL as? NSURL
    {
        songTitle = pickerItem.title!
        do
        {
            audioPlayer = try AVAudioPlayer(contentsOfURL: sURL)
        }
        catch
        {
            print("Can't Create Audio Player: \(error)")
        }
    }
    dismissViewControllerAnimated(true, completion: { () -> Void in
        audioPlayer.play()
    })
}

您还需要设置音频会话(在viewDidLoad中).如果要在录制时播放音频,这一点至关重要:

You will also need to set up the audio session(in viewDidLoad). It's crucial if you want audio to play while recording:

 // Audio Session Setup
    do
    {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    }
    catch
    {
        print("Can't Set Audio Session Category: \(error)")
    }
    AVAudioSessionCategoryOptions.MixWithOthers
    do
    {
        try audioSession.setMode(AVAudioSessionModeVideoRecording)
    }
    catch
    {
        print("Can't Set Audio Session Mode: \(error)")
    }
    // Start Session
    do
    {
        try audioSession.setActive(true)
    }
    catch
    {
        print("Can't Start Audio Session: \(error)")
    }

现在开始录像.您将使用AVCaptureSession.将以下内容声明为全局变量:

Now for the video recording. You will use AVCaptureSession. Declare the following as global variables:

let captureSession = AVCaptureSession()
var currentDevice: AVCaptureDevice?
var videoFileOutput: AVCaptureMovieFileOutput?
var cameraPreviewLayer: AVCaptureVideoPreviewLayer?

然后在viewDidLoad中配置会话.注意:视频预览位于容器中,而与视频相关的整个代码位于不同的视图控制器中,但是仅使用视图代替容器就可以了:

Then configure the session in viewDidLoad. Note: The video preview is in a container and the entire video related code is in a different view controller but just using a view instead of a container should work just as fine:

// Preset For 720p
captureSession.sessionPreset = AVCaptureSessionPreset1280x720

// Get Available Devices Capable Of Recording Video
let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice]

// Get Back Camera
for device in devices
{
    if device.position == AVCaptureDevicePosition.Back
    {
        currentDevice = device
    }
}
let camera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

// Audio Input
let audioInputDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)

do
{
    let audioInput = try AVCaptureDeviceInput(device: audioInputDevice)

    // Add Audio Input
    if captureSession.canAddInput(audioInput)
    {
        captureSession.addInput(audioInput)
    }
    else
    {
        NSLog("Can't Add Audio Input")
    }
}
catch let error
{
    NSLog("Error Getting Input Device: \(error)")
}

// Video Input
let videoInput: AVCaptureDeviceInput
do
{
    videoInput = try AVCaptureDeviceInput(device: camera)

    // Add Video Input
    if captureSession.canAddInput(videoInput)
    {
        captureSession.addInput(videoInput)
    }
    else
    {
        NSLog("ERROR: Can't add video input")
    }
}
catch let error
{
    NSLog("ERROR: Getting input device: \(error)")
}

// Video Output
videoFileOutput = AVCaptureMovieFileOutput()
captureSession.addOutput(videoFileOutput)

// Show Camera Preview
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(cameraPreviewLayer!)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
let width = view.bounds.width
cameraPreviewLayer?.frame = CGRectMake(0, 0, width, width)

// Bring Record Button To Front & Start Session
view.bringSubviewToFront(recordButton)
captureSession.startRunning()
print(captureSession.inputs)

然后您创建一个@IBAction,以便在用户按下记录按钮时进行处理(我只是使用了一个简单的按钮,将其制成红色和圆形):

Then you create an @IBAction for handling when the user presses the record button (I just used a simple button which I made red and round):

@IBAction func capture(sender: AnyObject) {
    do
    {
        initialOutputURL = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true).URLByAppendingPathComponent("output").URLByAppendingPathExtension("mov")
    }
    catch
    {
        print(error)
    }
    if !isRecording
    {
        isRecording = true

        UIView.animateWithDuration(0.5, delay: 0.0, options: [.Repeat, .Autoreverse, .AllowUserInteraction], animations: { () -> Void in
            self.recordButton.transform = CGAffineTransformMakeScale(0.75, 0.75)
            }, completion: nil)

        videoFileOutput?.startRecordingToOutputFileURL(initialOutputURL, recordingDelegate: self)
    }
    else
    {
        isRecording = false

        UIView.animateWithDuration(0.5, delay: 0, options: [], animations: { () -> Void in
            self.recordButton.transform = CGAffineTransformMakeScale(1.0, 1.0)
            }, completion: nil)
        recordButton.layer.removeAllAnimations()
        videoFileOutput?.stopRecording()
    }
}

那么剩下要做的就是将视频保存到(大概)相机胶卷中.但是我不会包括在内.您必须自己付出一些努力. (提示:UISaveVideoAtPathToSavedPhotosAlbum)

Then all there is left for you to do is to save the video to (presumably) the camera roll. But I won't include that. You must put in some effort yourselves. (hint: UISaveVideoAtPathToSavedPhotosAlbum)

就是这样.这就是您使用AVFoundation录制视频并同时从库中播放音乐的方式.

So that's it folks. That's how you use AVFoundation to record a video and play music from the library at the same time.

这篇关于如何同时录制视频和播放音频(快速教程)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆