微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AVCaptureVideoDataOutput在iOS 14中停止传递帧

如何解决AVCaptureVideoDataOutput在iOS 14中停止传递帧

我有以下设置:

  • 带有AVCaptureSession的{​​{1}}传送来自摄像机的视频帧。
  • 使用AVCaptureVideoDataOutputCVPixelBuffers创建OpenGL纹理。
  • 一些基于OpenGL的图像处理是在单独的队列中对帧(具有许多中间步骤)进行的。
  • 处理管线的最终纹理在主线程上呈现为CVOpenGLESTextureCache(具有适当的上下文和共享组处理)。

功能在iOS 13上运行良好。现在在iOS 14中,CAEAGLLayer在大约4秒钟后突然停止传送新帧(向代表)。捕获-没有任何警告或日志消息。

一些观察结果:

  • AVCaptureVideoDataOutput仍在运行(AVCaptureSessionisRunningtrueisInterrupted)。
  • 摄像头设备和输出间的所有连接仍在并处于活动状态。
  • 捕获指示符(状态栏中的绿色圆圈,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 举报,一经查实,本站将立刻删除。