前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在视频采集流水线中增加滤镜处理节点?丨有问有答

如何在视频采集流水线中增加滤镜处理节点?丨有问有答

作者头像
关键帧
发布2022-06-13 12:47:26
2840
发布2022-06-13 12:47:26
举报
文章被收录于专栏:关键帧Keyframe

今天我们要讨论的问题是一位社群的朋友遇到的一个面试题,原文如下:

之前遇到一个面试题,有一个线程在采集摄像头数据放到 buffer,然后在主线程显示。如果这时候需要添加一个滤镜,是否需要新开一个 buffer 和线程,是否会有线程安全问题,该怎么解决?

以下是回答,欢迎大家留言讨论补充:

从题目的意思来看,原来的流水线是:线程 1:采集 → buffer → 主线程:渲染,现在想在渲染之前加一个特效节点。 1)不新开 buffer 也不新开线程时,对应的流水线变为:线程 1:采集 → buffer → 主线程:滤镜 → 主线程:渲染。当滤镜渲染不复杂,耗时不多时,这种方案是可以搞的,因为滤镜主要涉及到 OpenGL 相关的操作,只要保证滤镜的 OpenGL 操作与渲染的 OpenGL 操作在同一个 EAGLContext 环境内即可。可以参考下图 OpenGL 操作缓冲区 FBO、着色器与 EAGLContext 的关系。

OpenGL2)新开 buffer 同时新开线程时,对应的流水线变为:线程 1:采集 → buffer 1 → 线程 2:滤镜 → buffer 2 → 主线程:渲染。这种方案当然是更好的方案,它使得各个模块可以并行,而且性能兼容性更好。因为在实际需求中,我们采集后的图像数据处理,除了滤镜,可能会增加人脸识别、磨皮、美白、特效等更复杂功能,这时候处理耗时就可能较长了,放在主线程可能卡住主线程,更可能会影响到渲染的帧率。此外,我们采集的图像数据除了预览渲染,一般是需要编码封装后存储本地或推流上传网络的,编码模块的速度与特效处理的速度不匹配时,这就需要增加 buffer 了。 这样一来整个流程就相当于两个生产者消费者模型了,而每个 buffer 就是对应的生产者和消费者线程的临界区。保证线程安全其实就是确保生产者线程和消费者线程对 buffer 数据的互斥访问,这里使用信号量即可。在 iOS 中可以用 dispatch_semaphore_t。

- 完 -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 关键帧Keyframe 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • - 完 -
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档