Я пытаюсь реализовать вид, который может показать видео предварительного просмотра задней камеры и обработать захваченные кадры.
Я хотел бы использовать два выхода: один для сохранения видео и один для обработки каждого кадра.
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)