2

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

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)
4

1 回答 1

0

目前,当您删除另一个源时,它仍然captureOutput可能使用假数据调用,但仍然是 videoDataOutput,因为您sampleBufferDelegate为它设置了。但captureOutput不是为了movieOutput.

movieOutputAVCaptureMovieFileOutput,它是 的子类AVCaptureFileOutput

AVCaptureFileOutput实现了两个协议:AVCaptureFileOutputDelegate 和 AVCaptureFileOutputRecordingDelegate

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

于 2018-07-02T07:44:41.937 回答