ios - AVCaptureVideoDataOutput 在 iOS 14 中停止传送帧
问题描述
我有以下设置:
AVCaptureSession
带有 a的 anAVCaptureVideoDataOutput
从摄像头传送视频帧。- OpenGL 纹理是
CVPixelBuffers
使用CVOpenGLESTextureCache
. - 一些基于 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 帧后停止提供新的样本缓冲区——没有任何警告、错误或通知。
推荐阅读
- r - 加入两个图(一个在另一个旁边)GWAS
- scala - 错误 HbaseConnector:无法获取副本 0 的位置
- linux - sed 模式匹配,直到第一次匹配
- javascript - IntelliJ Spring 启动,热部署不运行
- php - Wordpress 子页面包含精选图片
- javascript - 如何检查 Azure VPN 中的代理在 PAC 文件中是否存在/可访问
- excel - 在 a 中获取文本
带有VBA的span标签内的元素
- xamarin.forms - 如何克隆随机访问流?
- php - 数据库模型的缓存包装器
- javascript - 滚动到顶部按钮在 Android 设备上不起作用