Android Camera2 RAW 流媒体

标签 android performance android-camera2

我是 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:无法获取缓冲区项,很可能客户端试图获取超过 maxImages 缓冲区”的消息,即使我每 100 帧进行一次原始捕获也是如此。

我很乐意就以下方面获得一些反馈:

  • 这是否是做我想做的事情的正确方法。
  • 我如何切换到连拍,而不是每隔 N 帧拍摄一次静态图像,如果效率更高的话。
  • 这些初始数字是否有意义。

非常感谢,

纪尧姆

最佳答案

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

如果设备支持RAW capability ,那么您可以使用具有 RAW_SENSOR 格式的 ImageReader 作为捕获目标。然后格式也将列在 available output formats 中。 .您可以在 createCaptureSession 的文档中查看支持哪些类型的流组合在 RAW 能力表中。

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

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

可以谷歌看看camera2raw基本静态捕获示例。但是,您当然可以连续捕获 RAW 缓冲区,而不是与 JPEG 缓冲区一起捕获。但是在这种情况下您的帧速率可能非常低,并且为了保持预览帧速率,您可能希望每 N 个预览帧中只发布一个 RAW 捕获。

例如,如果 RAW_SENSOR 的停顿持续时间为 100 毫秒,但最小帧持续时间为 30 毫秒,您可以通过 (R+P),P,P,P,(R+ P),P,P,P... 这样每次原始捕获的开始之间至少有 100 毫秒。这将为您提供 ~8fps RAW 和 30fps 预览。

关于Android Camera2 RAW 流媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45515288/

相关文章:

android - android支持多国语言吗?

android - Kotlin Android - 当主 Activity 添加项目时从 fragment 刷新 ListView

Javascript显示更多/显示更少具有速度效果

java - 无法同步线程android中的变量

java - SwipeRefreshLayout 向下滑动带有进度条的 ScrollView

c# - 通知游戏对象发生变化的最佳方式? (Unity脚本组织/委托(delegate))

performance - 什么会导致 Intellij 在使用 Scala 时突然变得很慢?

Android:如何使用 android.hardware.camera2 和 MediaRecorder 录制视频

android - Camera2 PNG捕获

android - 黑白模式负片滤镜