基于ARCore的Android WebRTC视频通话接入AR人脸检测问题咨询
是否可以在WebRTC视频通话中使用GLSurfaceView
完全可以。WebRTC Android SDK默认提供的SurfaceViewRenderer组件本身就是GLSurfaceView的子类,专门用于WebRTC场景的视频预览、渲染工作,和你使用的org.webrtc:google-webrtc:1.0.32006版本依赖完全兼容。
AR人脸滤镜功能实现方案
- 方案1:自定义VideoProcessor接入视频链路
实现WebRTC提供的VideoProcessor接口,接入到视频采集pipeline中,在回调中获取原始视频帧的纹理ID,将纹理同步传入ARCore Session完成人脸检测,获取人脸锚点、轮廓等检测数据后,在同GL上下文内完成滤镜渲染、贴纸叠加等操作,处理后的纹理直接送回WebRTC编码链路即可。该方案全程GPU处理无额外内存拷贝,性能损耗低,适配成本低。 - 方案2:自定义GLSurfaceView接管全渲染流程
自定义继承自GLSurfaceView的渲染组件,替换默认的SurfaceViewRenderer。本地相机采集的帧先输出到自定义GLSurfaceView的SurfaceTexture,先送ARCore完成人脸检测和滤镜渲染,渲染完成的结果再喂给WebRTC的VideoSource进行后续编码传输,远端接收的视频帧也可送入该组件做统一渲染处理。该方案渲染逻辑完全可控,定制化程度高,适合复杂AR特效场景。 - 方案3:YUV帧CPU处理方案
无需涉及GL层操作,直接在WebRTC的VideoSink回调中拿到原始YUV格式的视频帧数据,转成ARCore支持的输入格式后做CPU层面人脸检测,拿到检测结果后对YUV像素做滤镜处理,处理完成后封装为WebRTC的VideoFrame送回链路即可。该方案实现逻辑简单,不需要掌握OpenGL相关知识,缺点是高分辨率下CPU占用高,易出现帧率下降。
注意:实现时需要保证ARCore和WebRTC的GL上下文共享,避免纹理跨上下文访问报错,同时要对齐帧数据的时间戳,避免出现音视频不同步问题。
内容的提问来源于stack exchange,提问作者Ketan Darji
相关产品推荐
相关产品推荐

