【问题标题】:Starting video recording immediately with AVCaptureMovieFileOutput使用 AVCaptureMovieFileOutput 立即开始视频录制
【发布时间】:2017-12-21 18:36:25
【问题描述】:

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

  • 我可以使用 AVCaptureVideoPreviewLayer 观看视频源就好了,所以我的会话连接正确。

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

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

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

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

【问题讨论】:

    标签: ios avfoundation video-capture


    【解决方案1】:

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

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

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

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

    NotificationCenter.default.addObserver(self, selector: #selector(sessionDidStartRunning), name: .AVCaptureSessionDidStartRunning, object: session)
    

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

    @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)
            }
        }
    }
    

    【讨论】:

    • 5 小时后:这里的线索是正确的。开始会话并不意味着它已经开始。如果您尝试录制屏幕,Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(startPushingData), userInfo: nil, repeats: false) 实际上是一个修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多