Android Camera2 RAW 流媒体

Gui*_*ume 4 performance android android-camera2

我对 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

停顿时间为 200 毫秒

我仅为预览获得的帧速率约为 25-30 fps。

我在预览和启用每帧原始捕获时获得的帧速率约为 15 fps。

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

我很想得到一些反馈:

  • 这是否是做我想做的事情的正确方法。
  • 如果效率更高,我如何切换到突发捕获而不是每 N 帧静止图像。
  • 这些初始数字是否有意义。

非常感谢,

纪尧姆

Edd*_*ala 8

是否完全支持 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 的停顿持续时间为 100 毫秒,但最小帧持续时间为 30 毫秒,您可以通过具有 (R+P),P,P,P,(R+P) 的捕获请求模式运行连续预览, P,P,P... 这样每个原始捕获的开始之间至少有 100 毫秒。这将为您提供 ~8fps RAW 和 30fps 预览。