同步AR画面和位姿


同步 AR 画面和位姿

为了使屏幕上展示的画面和经过一段时间计算后得到的位姿匹配,需要将画面缓存进队列,一段时间后取出,这里写一下我的实现思路和过程。

方式

  • 将摄像头预览写到ImageReader
  • 间隔一定帧数取出对应ImageReader队列中的Image放到ImageWriter队列中,ImageWriter队列写到outputSurface上(AR画面中)

时间表

帧可用时间序列 1 2 3 4
传输&计算 传输开始 处理 处理 返回结果
缓冲 保存1帧 保存2帧 保存3帧 保存第4帧,显示第一帧

类实现

  • 成员变量
    • ImageReader
      • 在缓冲区中接收写到SurfaceImage
      • 根据时间表,需要至少缓存3帧,保险起见缓冲区大小设置为4帧以上
      • 无法控制接收速度,但能控制输出速度
    • ImageWriter
      • 写出Image到输出的Surface
      • 能控制接收速度,但不能控制输出被取走的速度
    • outputSurface
      • 写出的目标,在我这里是sceneform的SceneViewExternalTexture包含的Surface
  • 成员函数
    • Surface getInputSurface()供摄像头写入画面
    • void setOutputSurface(Surface output)写出到AR的ExternalTextureSurface
    • ImageReader.OnImageAvailableListener在缓冲区满时写出一帧到ImageWriter

问题

  • 存取画面的延时
    • 只要不超过AR处理延迟(100ms)即可)
  • 存取画面的能耗是否过高
    • 暂时无法验证
  • 输出的Surface不及时取出图像
    • 这会导致堵塞,虽然目前不知道为什么队列堵塞后Surface就一直不会再进行取出操作
    • 解决方法是在writer队列超过一定数量时进行丢帧