如何解决AVCaptureVideoDataOutput在iOS 14中停止传递帧
我有以下设置:
- 带有
AVCaptureSession
的{{1}}传送来自摄像机的视频帧。 - 使用
AVCaptureVideoDataOutput
从CVPixelBuffers
创建OpenGL纹理。 - 一些基于OpenGL的图像处理是在单独的队列中对帧(具有许多中间步骤)进行的。
- 处理管线的最终纹理在主线程上呈现为
CVOpenGLESTextureCache
(具有适当的上下文和共享组处理)。
此功能在iOS 13上运行良好。现在在iOS 14中,CAEAGLLayer
在大约4秒钟后突然停止传送新帧(向代表)。捕获-没有任何警告或日志消息。
一些观察结果:
-
AVCaptureVideoDataOutput
仍在运行(AVCaptureSession
是isRunning
,true
是isInterrupted
)。 - 摄像头设备和输出之间的所有连接仍在并处于活动状态。
- 捕获指示符(状态栏中的绿色圆圈,iOS 14中的新图标)仍然存在。
- 输出的委托不报告任何帧丢失。
- 当我执行导致重新配置会话的操作(例如切换到前置摄像头)时,输出将再次开始传送帧,持续约4秒钟。然后再次停止。
- 当我不处理和显示帧时,输出将继续传递帧而不会中断。
我正在调试一段时间,我一无所知。非常感谢现在有关在iOS 14中导致此行为的原因的任何提示或想法! ?
解决方法
找到了:
我正在获取传入样本缓冲区的附件(元数据),并且由于桥接错误而意外泄漏了字典。
所以代替这个
NSDictionary* attachments = (__bridge NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL,sampleBuffer,kCMAttachmentMode_ShouldPropagate);
我应该做的
NSDictionary* attachments = (__bridge_transfer NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL,kCMAttachmentMode_ShouldPropagate);
有趣的是,此泄漏导致捕获会话在126帧后停止提供新的样本缓冲区-没有任何警告,错误或通知。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。