Android Camera2 RAW 流媒体
Android Camera2 RAW streaming
我是 Android 的新手,正在尝试:
- 从相机流式传输原始数据(ImageFormat RAW_SENSOR)
- 处理原始数据
- 交互显示处理结果
原始数据捕获似乎只能在静态捕获模式下使用。这是正确的吗?
如果可以,是否可以对 RAW 图像执行重复的 CaptureRequests?使用 13MP 传感器可以获得什么样的性能?任何参考代码?
非常感谢,
纪尧姆
编辑:
这是我到目前为止所做的:
- 创建呈现到 SurfaceTexture 的预览捕获
帧率在 onSurfaceTextureUpdated() 中计算/更新
问题:
- 在onSurfaceTextureUpdated()中计算帧率可以吗?
- 我尝试为 texture.setDefaultBufferSize() 设置不同的尺寸,但它对帧率没有影响。这正常吗?
将原始 ImageReader 的表面添加到 cameraDevice.createCaptureSession()
- 向 cameraCaptureSessions.setRepeatingRequest()
添加回调
- 在回调的 onCaptureCompleted() 中,添加了每 N 帧调用一次 captureRawImage()。
- captureRawImage() 创建静止图像捕获。
- 将 setOnImageAvailableListener() 添加到 raw ImageReader 以对原始图像做一些有用的事情。
原始分辨率为 4208x3120
最短帧持续时间为 33 毫秒
停顿持续时间为 200 毫秒
我获得的仅预览帧率约为 25-30 fps。
当我预览并启用每帧原始捕获时获得的帧速率约为 15 fps。
我收到一些 "ImageReader_JNI: Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers" 消息,即使我每 100 帧进行一次原始捕获也是如此。
我很乐意就以下方面获得一些反馈:
- 这是否是做我想做的事情的正确方法。
- 如果效率更高,我如何切换到连拍而不是每 N 帧静止图像。
- 这些初始数字是否有意义。
非常感谢,
纪尧姆
是否完全支持 RAW 捕获,以及可以完成的速率都取决于设备。
如果设备支持 RAW capability, then you can use an ImageReader with the RAW_SENSOR format as a capture target. The format will then also be listed in the available output formats. You can see what kinds of stream combinations are supported in the documentation for createCaptureSession 中的 RAW 功能 table。
要确定捕获 RAW 缓冲区的速度,请查看 getOutputMinFrameDuration, which tells you what the maximum frame rate when including an output of given format and resolution combination. In addition, the 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 预览。
我是 Android 的新手,正在尝试:
- 从相机流式传输原始数据(ImageFormat RAW_SENSOR)
- 处理原始数据
- 交互显示处理结果
原始数据捕获似乎只能在静态捕获模式下使用。这是正确的吗?
如果可以,是否可以对 RAW 图像执行重复的 CaptureRequests?使用 13MP 传感器可以获得什么样的性能?任何参考代码?
非常感谢,
纪尧姆
编辑:
这是我到目前为止所做的:
- 创建呈现到 SurfaceTexture 的预览捕获
帧率在 onSurfaceTextureUpdated() 中计算/更新
问题:
- 在onSurfaceTextureUpdated()中计算帧率可以吗?
- 我尝试为 texture.setDefaultBufferSize() 设置不同的尺寸,但它对帧率没有影响。这正常吗?
将原始 ImageReader 的表面添加到 cameraDevice.createCaptureSession()
- 向 cameraCaptureSessions.setRepeatingRequest() 添加回调
- 在回调的 onCaptureCompleted() 中,添加了每 N 帧调用一次 captureRawImage()。
- captureRawImage() 创建静止图像捕获。
- 将 setOnImageAvailableListener() 添加到 raw ImageReader 以对原始图像做一些有用的事情。
原始分辨率为 4208x3120
最短帧持续时间为 33 毫秒
停顿持续时间为 200 毫秒
我获得的仅预览帧率约为 25-30 fps。
当我预览并启用每帧原始捕获时获得的帧速率约为 15 fps。
我收到一些 "ImageReader_JNI: Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers" 消息,即使我每 100 帧进行一次原始捕获也是如此。
我很乐意就以下方面获得一些反馈:
- 这是否是做我想做的事情的正确方法。
- 如果效率更高,我如何切换到连拍而不是每 N 帧静止图像。
- 这些初始数字是否有意义。
非常感谢,
纪尧姆
是否完全支持 RAW 捕获,以及可以完成的速率都取决于设备。
如果设备支持 RAW capability, then you can use an ImageReader with the RAW_SENSOR format as a capture target. The format will then also be listed in the available output formats. You can see what kinds of stream combinations are supported in the documentation for createCaptureSession 中的 RAW 功能 table。
要确定捕获 RAW 缓冲区的速度,请查看 getOutputMinFrameDuration, which tells you what the maximum frame rate when including an output of given format and resolution combination. In addition, the 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 预览。