AVCaptureSession 视频稳定滞后
AVCaptureSession video stabilization lag
之前我在我的 AVCaptureSession
中添加了一个 AVCaptureMovieFileOutput
并启用了电影 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()
有没有人有任何见解或解决方案?提前致谢。
对于任何感兴趣的人,这是我经过几天的挖掘后学到的东西:
渲染到非 AVCaptureVideoPreviewLayer
时无法避免延迟 — 这基本上是任何时候你 运行 和 AVCaptureVideoDataOutput
处理单个帧(并且是真实的对于 CI 和 Metal 设置)。
稳定模式 .cinematic
导致最明显的延迟 — ~1 秒。切换到 .standard
可将其减少到约 1/10 秒,并且产生的结果比根本没有稳定性要好。
之前我在我的 AVCaptureSession
中添加了一个 AVCaptureMovieFileOutput
并启用了电影 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()
有没有人有任何见解或解决方案?提前致谢。
对于任何感兴趣的人,这是我经过几天的挖掘后学到的东西:
渲染到非 AVCaptureVideoPreviewLayer
时无法避免延迟 — 这基本上是任何时候你 运行 和 AVCaptureVideoDataOutput
处理单个帧(并且是真实的对于 CI 和 Metal 设置)。
稳定模式 .cinematic
导致最明显的延迟 — ~1 秒。切换到 .standard
可将其减少到约 1/10 秒,并且产生的结果比根本没有稳定性要好。