iOS: функция captureOutput не вызывается с использованием AVCaptureMovieFileOutput и AVCaptureVideoDataOutput - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь реализовать вид, который может показать видео предварительного просмотра задней камеры и обработать захваченные кадры. Я хотел бы использовать два выхода: один для сохранения видео и один для обработки каждого кадра.

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

Мой слой предварительного просмотра работает отлично, и я вижу изображение на экране в моем пользовательском интерфейсе. Но captureOutput никогда не вызывается. Если я прокомментирую:

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

тогда мой captureOutput вызывается и работает нормально, но я хотел бы сохранить мое видео в файл. Я работаю со Swift 3, поэтому я использую:

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

1 Ответ

0 голосов
/ 02 июля 2018

В настоящее время, когда вы удаляете другой источник, он все еще вызывает captureOutput, возможно, с поддельными данными, но все же для videoDataOutput, потому что вы установили для него sampleBufferDelegate. Но captureOutput не предназначен для movieOutput.

movieOutput - это AVCaptureMovieFileOutput, который является подклассом AVCaptureFileOutput.

AVCaptureFileOutput реализует два протокола: AVCaptureFileOutputDelegate и AVCaptureFileOutputRecordingDelegate

Вам следует реализовать один из них (прочитайте документацию, чтобы решить, какой из них соответствует вашим требованиям), и реализовать их методы и ожидать, что они будут вызваны, а не captureOutput, который будет вызываться дважды.

...