使用 AVCaptureMovieFileOutput 立即开始视频录制

rgo*_*gov 2 video-capture avfoundation ios

AVCaptureMovieFileOutput当我的应用程序启动时,我试图使用将设备摄像头录制到视频文件中。令我非常沮丧的是,我无法让它工作:

  • 我可以AVCaptureVideoPreviewLayer很好地查看视频源,所以我的会话连接正确。

  • 它将输出到的文件尚不存在,并且位于可写目录中。

  • API 调用或AVCaptureSessionRuntimeError通知未返回任何错误。

  • 我的AVCaptureFileOutputRecordingDelegate方法根本没有被调用。

我在示例代码之后尝试了示例代码,更令人抓狂的是其中一些似乎确实有效。

rgo*_*gov 5

事实证明,您不能像这样立即开始录制到文件中:

let session = AVCaptureSession() 
session.beginConfiguration()
// add inputs, outputs
session.commitConfiguration()
videoFileOutput.startRecording(to: filePath, recordingDelegate: self)
Run Code Online (Sandbox Code Playgroud)

这将默默地失败并且什么都不做!

相反,您需要通过注册AVCaptureSessionDidStartRunning通知来等待会话开始:

NotificationCenter.default.addObserver(self, selector: #selector(sessionDidStartRunning), name: .AVCaptureSessionDidStartRunning, object: session)
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式实现此方法,以便在会话开始后立即开始录制到临时文件:

@objc
func sessionDidStartRunning(notification: NSNotification) {
    let session = notification.object as! AVCaptureSession
    for output in session.outputs {
        if let output = output as? AVCaptureMovieFileOutput {
            let filePath = URL(fileURLWithPath: NSTemporaryDirectory() + "recording.mov")
            try? FileManager.default.removeItem(at: filePath)
            output.startRecording(to: filePath, recordingDelegate: self)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)