我对android非常陌生。我正在尝试使用新的Android Camera2 api来构建一个实时图像处理应用程序。我的应用程序也需要保持良好的FPS速率。通过一些示例,我设法在ImageReader类提供的onImageAvailable(ImageReader阅读器)方法中进行了图像处理。然而,通过这样做,我只能设法获得大约5-7FPS的帧率。
我已经看到,建议通过Android camera2 api使用RenderScript进行YUV处理。使用RenderScript会让我获得更高的每秒速率吗?如果是这样的话,请有人指导我如何实现它,因为我是一个新的安卓系统,我很难掌握分配和RenderScript的概念。提前谢谢。
发布于 2016-02-05 05:35:38
我不知道您想执行哪种类型的图像处理。但是,如果您只对图像的强度感兴趣(即灰度值信息),则不需要对YUV数据数组进行任何转换(例如转换为jpeg)。对于由n个像素组成的图像,强度信息由YUV数据数组的前n个字节给出。因此,只需将这些字节从YUV数据数组中删除:
byte[] intensity = new byte[width*height];
intensity = Arrays.copyOfRange(data, 0, width*height);发布于 2017-02-01 14:54:50
理论上,您可以使用此调用获取可用的fps范围:
characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);并在此处设置所需的fps范围:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);因此,原则上,你应该选择一个具有相同下限和上限的范围,这应该保持你的帧速率恒定。
然而,在使用传统配置文件的设备上,我测试过的设备中没有一个能够在1080p时达到30fps (S5、Z3 Compact、华为Mate S和HTC M9)。我能够做到这一点的唯一方法是使用一台后来证明拥有完整配置文件的设备(LG G4)。
如果你打算在onImageAvailable回调函数中使用渲染脚本,它在这里不会给你带来任何好处。在这一点上获取图像似乎是遗留设备上的瓶颈,因为新的camera2应用程序接口只是包装了旧的图像,并且可能会产生如此多的开销,以至于回调不再以30fps的速度发生。因此,如果要使用Renderscript,您需要创建一个Surface,并找到另一种方法来获取它的帧。
不过,这里有个有趣的地方。如果你把废弃的API移回去,我几乎可以保证你想要的任何分辨率下的30fps。至少这是我在我测试的所有设备上发现的……
https://stackoverflow.com/questions/35210713
复制相似问题