Android相机2 RAW流传输

6
我是一名Android新手,正在尝试做以下事情:
- 从摄像头中流式传输原始数据(图像格式RAW_SENSOR) - 处理原始数据 - 交互式显示处理结果
似乎只有在静态捕获模式下才能捕获原始数据,这是正确的吗?
如果是这样,是否可以执行重复的CaptureRequests以获取RAW图像?使用13MP传感器可以期望什么性能?有参考代码吗?
非常感谢。
编辑:
到目前为止,我已经完成了以下工作:
- 创建预览捕获,该捕获渲染到SurfaceTexture上 - 帧速率在onSurfaceTextureUpdated()中计算/更新 - 问题:
- 在onSurfaceTextureUpdated()中计算帧速率是否有效? - 我尝试将不同的尺寸设置为texture.setDefaultBufferSize(),但对帧速率没有影响。这是正常现象吗?
- 将raw ImageReader的surface添加到cameraDevice.createCaptureSession() - 将回调添加到cameraCaptureSessions.setRepeatingRequest() - 在回调的onCaptureCompleted()中,每N帧添加一个captureRawImage()调用。 - captureRawImage()创建一个静态图像捕获。 - 为原始ImageReader添加setOnImageAvailableListener()以对原始图像执行有用的操作。
原始分辨率为4208x3120
最小帧持续时间为33ms
停顿时间为200ms
只有预览时,我获得的帧率约为25-30 fps。
当我预览并启用每一帧的原始捕获时,获得的帧率约为15 fps。
即使我每100帧执行一次raw capture,我也会得到一些“ImageReader_JNI:无法获取缓冲区项,非常可能是客户端尝试获取多个maxImages缓冲区”的消息。
希望能得到以下问题的反馈:
- 这样做是否正确? - 如果使用连拍而不是每N帧进行静态图像,是否更有效? - 这些初始数字是否有意义?
非常感谢。
1个回答

10
无论是否支持原始捕获,以及其速率是多少,都取决于设备。如果设备支持原始能力,则可以使用具有RAW_SENSOR格式的ImageReader作为捕获目标。该格式也会列在可用的输出格式中。您可以在createCaptureSession文档中查看支持的流组合种类。要确定可以捕获原始缓冲区的速度,请查看getOutputMinFrameDuration的输出。此外,getOutputStallDuration方法将告诉您是否需要在两次连续的请求之间添加额外的延迟以避免预览停顿。在一般情况下,没有任何特定的原始缓冲区输出速率要求。但是,如果设备支持更高效的RAW10或RAW12格式,并且支持BURST_CAPTURE功能,则保证支持以至少20fps的速率捕获这些格式。您可以查看Google的camera2raw示例以进行基本静态捕获。但是,您可以连续捕获RAW缓冲区而不是与JPEG缓冲区并行。但在这种情况下,您的帧率可能非常低,并且为了保持预览帧率,您可能希望每N个预览帧中只发出一个原始捕​​获请求。例如,如果RAW_SENSOR的停止时间为100ms,但最小帧时间为30ms,则通过将捕获请求模式设置为(R+P),P,P,P,(R+P),P,P,P ...,以便每个原始捕​​获之间至少有100毫秒的时间。这将为您提供大约8fps的RAW和30fps的预览。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接