You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ARCore帧转换为WebRTC帧并解决音视频不同步问题

ARCore与WebRTC帧数据对接优化方案

核心问题定位

你当前遇到的音视频不同步本质是PixelCopy+Bitmap转码链路引入了过高耗时:PixelCopy本身是GPU到CPU的内存拷贝操作,加上Bitmap编码转WebRTC I420帧的CPU计算耗时,单帧处理延迟通常会达到30~80ms,累计下来就会出现明显的音画偏差。

可行实现方案

方案1:GPU纹理直连方案(最优,延迟最低)

  • ARCore输出的CameraTexture本身是OpenGL纹理ID,你可以直接复用该纹理作为WebRTC的视频源输入
  • 安卓端WebRTC提供了TextureBuffer接口,支持直接传入OES纹理或2D纹理,不需要做CPU拷贝
  • 操作步骤:
    1. 拿到ARCore回调的Frame对象后,获取其绑定的纹理IDtextureId以及变换矩阵transformMatrix
    2. 直接构造org.webrtc.TextureBufferImpl实例,传入纹理ID、帧宽高、变换矩阵
    3. 将TextureBuffer封装为VideoFrame后,调用WebRTC的VideoSource.onFrame()接口直接送入编码队列
  • 该方案单帧处理延迟在5ms以内,完全不会引入额外的音画偏移

方案2:HardwareBuffer中转方案(次优,适配性更强)

  • 如果你需要在ARCore渲染完人脸特效后再对接WebRTC,可以用Android HardwareBuffer作为中间载体
  • ARCore渲染完成后,将FBO绑定的纹理转换为HardwareBuffer,WebRTC可以直接解析HardwareBuffer为YUV帧,不需要经过Bitmap环节
  • 相比方案1仅增加了一次GPU内部的纹理拷贝,延迟在10~15ms左右,也远低于现有方案

辅助优化建议

  • 无论用哪种方案,都要严格对齐ARCore帧的时间戳和WebRTC VideoFrame的时间戳,直接把ARCoreFrame.getTimestamp()返回的纳秒时间戳赋值给VideoFrame的timestampNs字段,避免WebRTC内部时间戳偏移
  • 不要在帧处理链路中插入任何异步排队逻辑,拿到ARCore帧后立即送入WebRTC队列,避免额外的排队延迟

注意:如果你的人脸特效是在GL线程中实现的,直接在ARCore渲染完成后、纹理未释放前完成特效绘制,再把最终纹理传给WebRTC即可,不需要额外做拷贝操作。

内容的提问来源于stack exchange,提问作者신영환

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:36:03