最大的相机抓取和显示性能

Maximum camera grab and display performance

本文关键字:显示 性能 抓取 相机      更新时间:2023-10-16

我对这个话题进行了大量研究,但似乎我做错了什么,或者我的理解有些不对劲。

只是想实现最佳性能(例如以 FPS 为单位),以便从我的 Android 驱动的智能手机中抓取高质量图像并将其直接显示给用户,而无需任何修改。

由于我有一个非常有能力的智能手机(Nexus 4),我认为这应该是一项微不足道的任务。但是我所有的努力都没有得到回报。 例如,我使用最新的 OpenCV 框架在 800x480 流中只实现了大约 10 FPS。

那么,是否可以仅从手机摄像头抓取和显示高质量视频即可实现>25FPS?如果是这样,最好的策略是什么?也欢迎特定于设备的注意事项。

我使用的资源:

  • http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/
  • http://mesai0.blogspot.de/2013/01/android-native-camera-with-opencv-and.html
  • http://opencv.org/

更新:我已经能够将抓取性能提高到几乎恒定的~25FPS@1280x720,只需在使用SurfaceTexture和TextureView作为相机接收器时设置录制提示即可。

然而,我想知道是否有可能进一步提高性能。我尝试使用不同的预览格式,但没有运气。也许对我不知道的抓取性能施加了隐含的上限。

尽管如此,我会继续研究并随时通知您。各种信息仍然欢迎!

限制因素是移动一大堆数据的速度。 这里也有类似的讨论。 您有三个任务:(1) 获取图像,(2) 保存图像("捕获")和 (3) 显示图像。 (如果我误解了你的问题,并且你不需要#2,那么相机的Surface预览模式将高速执行您想要的操作。

Android 4.3 上提供的一种节省内存带宽的方法是将相机的Surface预览馈送到 AVC 编码器中,保存编码的 MPEG 流,然后解码帧以进行显示。 来自相机的缓冲区可以馈送到MediaCodec编码器中,而无需复制它们或将数据转换为其他格式。 (请参阅 CameraToMpegTest 示例。 此方法可能与您的既定目标之一不兼容:应用于每个帧的压缩可能会将质量降低到可接受的水平以下。

如果需要保持帧"完整",则必须复制数据(可能多次)并将其写入磁盘。 帧越大,您必须移动的数据就越多,并且一切运行速度就越慢。 例如,相机捕获数据并将其写入本机缓冲区;本机缓冲区将复制到 Dalvik VM 的托管缓冲区;缓冲区写入磁盘;YUV 转换为 RGB;通过将数据上传到纹理并渲染,RGB 显示在屏幕上。