iOS:使用AVCaptureMovieFileOutput和AVCaptureVideoDataOutput

时间:2018-07-02 07:38:11

标签: ios video avfoundation capture avcaptureoutput

我正在尝试实现一个View,该View可以显示后置摄像头的预览视频并处理捕获的帧。 我想使用两个输出:一个用于保存视频,另一个用于处理每一帧。

let movieOutput = AVCaptureMovieFileOutput()
let videoDataOutput = AVCaptureVideoDataOutput()

我已将委托添加到我的视图控制器中:

class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate, AVCaptureVideoDataOutputSampleBufferDelegate

我也将输出添加到AVCaptureSession中:

do {
    videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable as! String: NSNumber(value: kCVPixelFormatType_32BGRA)]
    videoDataOutput.alwaysDiscardsLateVideoFrames = true
    let queue = DispatchQueue(label: "videosamplequeue")
    videoDataOutput.setSampleBufferDelegate(self, queue: queue)
    guard captureSession.canAddOutput(videoDataOutput) else {
        fatalError()
    }
    if captureSession.canAddOutput(videoDataOutput){
        captureSession.addOutput(videoDataOutput)
    }

    videoConnection = videoDataOutput.connection(withMediaType:AVMediaTypeVideo)
}

if captureSession.canAddOutput(movieOutput) {
    captureSession.addOutput(movieOutput)
}

我的预览层运行良好,并且可以在UI视图中看到图片显示。但是从来没有调用captureOutput。如果我发表评论:

//if captureSession.canAddOutput(movieOutput) {
//        captureSession.addOutput(movieOutput)
//    }

然后,我的captureOutput被调用并且工作正常,但是我想将视频保存在文件中。 我正在使用Swift 3,因此我在使用:

func captureOutput(_ output: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)

1 个答案:

答案 0 :(得分:0)

当前,当您删除另一个源时,它仍在使用伪数据调用captureOutput,但仍对videoDataOutput进行调用,因为您为其设置了sampleBufferDelegate。但是captureOutput并不适合movieOutput

movieOutputAVCaptureMovieFileOutput,它是AVCaptureFileOutput的子类。

AVCaptureFileOutput实现两种协议:AVCaptureFileOutputDelegate and AVCaptureFileOutputRecordingDelegate

您应该实现其中的一种(阅读文档以确定哪种适合您的要求),并实现其方法,并期望它们被调用,而不是captureOutput被调用两次。