4

我对安卓很陌生。我正在尝试使用新的 Android Camera2 api 来构建实时图像处理应用程序。我的应用程序也需要保持良好的 FPS 速率。按照一些示例,我设法在 ImageReader 类可用的 onImageAvailable(ImageReader reader) 方法中进行图像处理。但是通过这样做,我只能设法获得大约 5-7 FPS 的帧速率。

我已经看到建议使用 RenderScript 和 Android camera2 api 进行 YUV 处理。使用 RenderScript 会让我获得更高的 FPS 速率吗?如果是这样,请有人指导我如何实现它,因为我是 android 新手,我很难掌握分配和 RenderScript 的概念。提前致谢。

4

2 回答 2

1

理论上,您可以通过以下调用获得可用的 fps 范围:

characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

并在此处设置所需的 fps 范围:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);

所以原则上,你应该选择一个具有相同下限和上限的范围,并且应该保持你的帧速率恒定。

然而,在具有 LEGACY 配置文件的设备上,我测试过的所有设备都无法在 1080p 下达到 30fps(S5、Z3 Compact、华为 Mate S 和 HTC One M9)。我能够做到这一点的唯一方法是使用一个设备(LG G4),结果证明它有一个完整的配置文件。

onImageAvailable如果你打算在回调中使用它,Renderscript 不会在这里给你买任何东西。似乎此时获取图像是 LEGACY 设备的瓶颈,因为新的 camera2 API 只是简单地包装了旧的,并且可能会产生如此多的开销,以至于回调不再以 30fps 发生。因此,如果要使用 Renderscript,您将需要创建一个 Surface 并找到另一种从其上抓取帧的方法。

不过,这是最重要的……如果您退回已弃用的 API,我几乎可以保证在您想要的任何分辨率下都能达到 30fps。至少这是我在我测试的所有设备上发现的......

于 2017-02-01T06:54:49.587 回答
1

我不知道您要执行哪种类型的图像处理。但是如果您只对图像的强度(即灰度信息)感兴趣,则不需要对 YUV 数据数组进行任何转换(例如转换为 jpeg)。对于由 n 个像素组成的图像,强度信息由 YUV 数据数组的前 n 个字节给出。因此,只需从 YUV 数据数组中删除这些字节:

 byte[] intensity = new byte[width*height];
 intensity = Arrays.copyOfRange(data, 0, width*height);
于 2016-02-04T21:35:37.770 回答