AVCaptureSession задержка стабилизации видео - PullRequest
1 голос
/ 16 марта 2019

Ранее я добавлял AVCaptureMovieFileOutput к своему AVCaptureSession и включал кинематографический preferredVideoStabilizationMode, получая отличные, ожидаемые результаты.

Я только что переключился на AVCaptureVideoDataOutput, и кинематографическая стабилизация вызываетчрезвычайно заметная задержка - примерно полная секунда задержки перед обновлением предварительного просмотра изображения.

Настройка:

//  Video data output
let outputSettings: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]
videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput?.videoSettings = outputSettings
let videoSessionQueue = DispatchQueue(label: "video_capture_session_queue")
videoDataOutput?.setSampleBufferDelegate(self, queue: videoSessionQueue)
videoDataOutput?.alwaysDiscardsLateVideoFrames = true

//  Audio data output
let audioDataOutput = AVCaptureAudioDataOutput()
let audioSessionQueue = DispatchQueue(label: "audio_capture_session_queue")
audioDataOutput.setSampleBufferDelegate(self, queue: audioSessionQueue)

//  Configure session
captureSession.beginConfiguration()

let videoInput = try AVCaptureDeviceInput(device: currentCameraDevice)
captureSession.addInput(videoInput)
captureSession.addOutput(videoDataOutput!)

if let videoDataOutputConnection = videoDataOutput?.connection(with: .video), videoDataOutputConnection.isVideoStabilizationSupported {
    videoDataOutputConnection.preferredVideoStabilizationMode = .cinematic
}

if let audioInput = AVCaptureDevice.default(for: .audio) {
    try captureSession.addInput(AVCaptureDeviceInput(device: audioInput))
    captureSession.addOutput(audioDataOutput)
}

captureSession.commitConfiguration()

captureSession.startRunning()

У кого-нибудь есть понимание или решение?Заранее спасибо.

1 Ответ

0 голосов
/ 21 марта 2019

Для всех, кто интересуется, вот что я узнал после нескольких дней копания:

Нельзя избежать задержки при рендеринге в не-AVCaptureVideoPreviewLayer - что, по сути, всегда, когда вызапуск AVCaptureVideoDataOutput для обработки отдельных кадров (и true для установок CI и Metal).

Режим стабилизации .cinematic приводит к наиболее заметному отставанию - ~ 1 секунда.Переключение на .standard сокращает это до ~ 1/10 секунды и дает лучшие результаты, чем вообще отсутствие стабилизации.

...