【问题标题】:iOS: captureOutput function isn't called using AVCaptureMovieFileOutput and AVCaptureVideoDataOutputiOS:使用 AVCaptureMovieFileOutput 和 AVCaptureVideoDataOutput 调用 captureOutput 函数
【发布时间】:2018-12-10 09:18:33
【问题描述】:

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

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)

【问题讨论】:

    标签: ios video avfoundation capture avcaptureoutput


    【解决方案1】:

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

    movieOutputAVCaptureMovieFileOutput,它是AVCaptureFileOutput 的子类。

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

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

    【讨论】:

    • 是的,我正在调用:videoDataOutput.setSampleBufferDelegate(self, queue: queue) 并且工作正常,问题是当我将第二个输出添加到捕获会话时:captureSession.addOutput(movieOutput)跨度>
    • 还有一位代表参与,请参阅编辑后的答案。
    • 我收到“'AVCaptureMovieFileOutput' 类型的值没有成员'delegate'”。如果我删除 captureSession.addOutput(videoDataOutput),则此实现有效。如果我删除另一个输出,则每个输出都有效
    • 你试过这样做吗? movieOutput.setSampleBufferDelegate(self, queue: queue) 与 videoDataOutput.setSampleBufferDelegate(self, queue: queue) 一起执行。不是任何一种方式。
    • 是的,但是 movieOutput 是 AVCaptureMovieFileOutput 并且没有名为 setSampleBufferDelegate 的成员
    猜你喜欢
    • 2016-10-19
    • 2011-04-27
    • 2011-06-24
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2012-12-06
    相关资源
    最近更新 更多