AVCaptureVideoDataOutput 在 iOS 14 后停止传送帧
AVCaptureVideoDataOutput stops delivering frames in iOS 14
我有以下设置:
- 一个
AVCaptureSession
和一个 AVCaptureVideoDataOutput
从相机传送视频帧。
- OpenGL 纹理是使用
CVOpenGLESTextureCache
. 从 CVPixelBuffers
创建的
- 一些基于 OpenGL 的图像处理是在单独队列中的帧上执行的(具有许多中间步骤)。
- 处理管道的最终纹理在主线程上渲染到
CAEAGLLayer
(具有适当的上下文和共享组处理)。
这在 iOS 13 之前工作得很好。现在在 iOS 14 中,AVCaptureVideoDataOutput
在大约 4 秒后突然停止向代理发送新帧。捕获——没有任何警告或日志消息。
一些观察:
AVCaptureSession
仍然是运行(isRunning
是true
,isInterrupted
是false
)。
- 相机设备和输出之间的所有连接仍然存在并处于活动状态。
- 捕获指示器(状态栏中的绿色圆圈,iOS 14 中的新增功能)仍然存在。
- 输出的委托未报告任何丢帧。
- 当我执行导致重新配置会话的操作(如切换到前置摄像头)时,输出将再次开始传送帧约 4 秒。然后再停下来。
- 当我不处理和显示帧时,输出会继续不间断地传送帧。
我已经调试了一段时间了,但我很无能。非常感谢 iOS 14 中现在可能导致此行为的任何提示或想法!
找到了:
我正在获取传入样本缓冲区的附件(元数据),但由于桥接错误不小心泄露了字典。
所以不用这个
NSDictionary* attachments = (__bridge NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
我应该这样做
NSDictionary* attachments = (__bridge_transfer NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
有趣的是,此泄漏导致捕获会话在 126 帧后停止传送新的样本缓冲区——没有任何警告、错误或通知。
我有以下设置:
- 一个
AVCaptureSession
和一个AVCaptureVideoDataOutput
从相机传送视频帧。 - OpenGL 纹理是使用
CVOpenGLESTextureCache
. 从 - 一些基于 OpenGL 的图像处理是在单独队列中的帧上执行的(具有许多中间步骤)。
- 处理管道的最终纹理在主线程上渲染到
CAEAGLLayer
(具有适当的上下文和共享组处理)。
CVPixelBuffers
创建的
这在 iOS 13 之前工作得很好。现在在 iOS 14 中,AVCaptureVideoDataOutput
在大约 4 秒后突然停止向代理发送新帧。捕获——没有任何警告或日志消息。
一些观察:
AVCaptureSession
仍然是运行(isRunning
是true
,isInterrupted
是false
)。- 相机设备和输出之间的所有连接仍然存在并处于活动状态。
- 捕获指示器(状态栏中的绿色圆圈,iOS 14 中的新增功能)仍然存在。
- 输出的委托未报告任何丢帧。
- 当我执行导致重新配置会话的操作(如切换到前置摄像头)时,输出将再次开始传送帧约 4 秒。然后再停下来。
- 当我不处理和显示帧时,输出会继续不间断地传送帧。
我已经调试了一段时间了,但我很无能。非常感谢 iOS 14 中现在可能导致此行为的任何提示或想法!
找到了:
我正在获取传入样本缓冲区的附件(元数据),但由于桥接错误不小心泄露了字典。
所以不用这个
NSDictionary* attachments = (__bridge NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
我应该这样做
NSDictionary* attachments = (__bridge_transfer NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
有趣的是,此泄漏导致捕获会话在 126 帧后停止传送新的样本缓冲区——没有任何警告、错误或通知。