我正在尝试实现一个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)
答案 0 :(得分:0)
当前,当您删除另一个源时,它仍在使用伪数据调用captureOutput
,但仍对videoDataOutput进行调用,因为您为其设置了sampleBufferDelegate
。但是captureOutput
并不适合movieOutput
。
movieOutput
是AVCaptureMovieFileOutput
,它是AVCaptureFileOutput
的子类。
AVCaptureFileOutput
实现两种协议:AVCaptureFileOutputDelegate and AVCaptureFileOutputRecordingDelegate
您应该实现其中的一种(阅读文档以确定哪种适合您的要求),并实现其方法,并期望它们被调用,而不是captureOutput
被调用两次。