将 ImageReader 和 SurfaceTexture 与 Android Camera2 输出同步
Sync ImageReader and SurfaceTexture with Android Camera2 output
ImageReader 和 SurfaceTexture 与应用程序端异步。 SurfaceTexture.OnFrameAvailableListener
和 ImageReader.OnImageAvailableListener
来的时间不同。
现在我要做一个AR App。我用 ImageReader 中的图像计算物体运动并输出物体运动信息。另一方面。调用 updateTexImage
渲染背景。但问题是对象运动在背景渲染之后有明显的延迟。
工作流程如下:
Camera2->ImageReader->calculate object motion -> Render a virtual object with object motion information
Camera2->SufaceTexture->用updateTexImage
渲染背景
upateTexImage
和渲染虚拟对象在 Render.onDrawFrame
中被调用
很明显,问题是如何将 ImageReader 和 SurfaceTexture 与 Android Camera2 输出同步
最简单的选择是不使用两个数据路径,而是在 SurfaceTexture 缓冲区上进行图像分析(在 EGL 中或从 GPU 回读到 CPU 进行分析),或者使用 ImageReader 缓冲区用来画一切。
如果这不可行,您需要查看时间戳 (https://developer.android.com/reference/android/graphics/SurfaceTexture.html#getTimestamp() and https://developer.android.com/reference/android/media/Image.html#getTimestamp())。对于同一个捕获,两条路径将具有相同的时间戳,因此您可以通过匹配它们来排队并同步您的最终绘图。
ImageReader 和 SurfaceTexture 与应用程序端异步。 SurfaceTexture.OnFrameAvailableListener
和 ImageReader.OnImageAvailableListener
来的时间不同。
现在我要做一个AR App。我用 ImageReader 中的图像计算物体运动并输出物体运动信息。另一方面。调用 updateTexImage
渲染背景。但问题是对象运动在背景渲染之后有明显的延迟。
工作流程如下:
Camera2->ImageReader->calculate object motion -> Render a virtual object with object motion information
Camera2->SufaceTexture->用updateTexImage
upateTexImage
和渲染虚拟对象在 Render.onDrawFrame
很明显,问题是如何将 ImageReader 和 SurfaceTexture 与 Android Camera2 输出同步
最简单的选择是不使用两个数据路径,而是在 SurfaceTexture 缓冲区上进行图像分析(在 EGL 中或从 GPU 回读到 CPU 进行分析),或者使用 ImageReader 缓冲区用来画一切。
如果这不可行,您需要查看时间戳 (https://developer.android.com/reference/android/graphics/SurfaceTexture.html#getTimestamp() and https://developer.android.com/reference/android/media/Image.html#getTimestamp())。对于同一个捕获,两条路径将具有相同的时间戳,因此您可以通过匹配它们来排队并同步您的最终绘图。