Android Camera2 RAW流

纪尧姆

我是Android的新手,因此尝试:

  • 从相机流原始数据(ImageFormat RAW_SENSOR)
  • 处理原始数据
  • 交互显示处理结果

似乎原始数据捕获仅在静态捕获模式下可用。它是否正确 ?

如果可以的话,可以对RAW图像执行重复的CaptureRequests吗?使用13MP传感器可以期待什么样的性能?有参考代码吗?

提前谢谢了,

纪尧姆

编辑

到目前为止,这是我所做的:

  • 创建呈现到SurfaceTexture的预览捕获
  • 在onSurfaceTextureUpdated()中计算/更新帧速率

    问题:

    • 可以在onSurfaceTextureUpdated()中计算帧率吗?
    • 我试图为texture.setDefaultBufferSize()设置不同的尺寸,但是它对帧速率没有影响。这正常吗?
  • 将原始ImageReader的表面添加到cameraDevice.createCaptureSession()

  • 将回调添加到cameraCaptureSessions.setRepeatingRequest()
  • 在回调的onCaptureCompleted()中,每N帧添加一次captureRawImage()调用。
  • captureRawImage()创建静止图像捕获。
  • 将setOnImageAvailableListener()添加到原始ImageReader可以对原始图像进行一些有用的处理。

原始分辨率为4208x3120

最小帧持续时间为33ms

失速持续时间为200ms

我仅用于预览的帧速率约为25-30 fps。

预览并启用原始捕获时获得的帧率约为15 fps。

我收到一些“ ImageReader_JNI:无法获取缓冲区项目,很可能客户端尝试获取超过maxImages缓冲区的消息”,即使我每100帧进行一次原始捕获也是如此。

我希望获得一些反馈:

  • 这是否是执行我想做的正确方法。
  • 如果这样可以提高效率,我该如何切换到突发捕获而不是每N帧静止成像。
  • 这些初始数字是否有意义。

非常感谢,

纪尧姆

埃迪·塔尔瓦拉(Eddy Talvala)

是否完全支持RAW捕获以及可以完成的速率都取决于设备。

如果设备支持RAW功能,则可以将RAW_SENSOR格式的ImageReader用作捕获目标。然后,该格式还将以可用的输出格式列出您可以在RAW功能表的createCaptureSession文档中查看支持哪些流组合

要确定捕获RAW缓冲区的速度,请查看getOutputMinFrameDuration的输出,该输出告诉您包括给定格式和分辨率组合的输出时的最大帧速率。另外,getOutputStallDuration方法将告诉您是否需要在两个连续的针对RAW输出的请求之间有额外的延迟,以避免延迟预览。通常情况下,不需要支持RAW缓冲区的任何特定输出速率。

但是,如果设备支持更高效的RAW10或RAW12格式,并且支持BURST_CAPTURE功能,则可以保证以至少20fps的速率捕获这些格式。

您可以查看用于基本静止图像的Google camera2raw示例。但是,您当然可以连续捕获RAW缓冲区,而不是与JPEG缓冲区一起捕获。但是在这种情况下,您的帧速率可能会非常低,并且为了保留预览帧速率,您可能希望仅在每N个预览帧中发出一个RAW捕获。

例如,如果RAW_SENSOR的停顿持续时间为100ms,但是最小帧持续时间为30ms,则可以通过以下捕获请求模式运行连续预览:(R + P),P,P,P,(R + P), P,P,P ...,因此每个原始捕获的开始之间至少要间隔100毫秒。这样您将获得〜8fps RAW和30fps预览。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章