4

我已经对这个主题进行了很多研究,但似乎我做错了什么,或者我的理解有些不对劲。

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

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

那么,仅从手机摄像头抓取和显示高质量视频是否有可能实现 >25FPS?如果是这样,最好的策略是什么?设备特定的考虑也是受欢迎的。

我使用的资源:

更新:通过在使用SurfaceTextureTextureView作为相机接收器时简单地设置记录提示, 我已经能够将抓取性能提高到几乎恒定的 ~25FPS@1280x720 。

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

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

4

1 回答 1

2

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

Android 4.3 上可用的一种内存带宽高效方法是将相机的Surface预览输入 AVC 编码器,保存编码的 MPEG 流,然后解码帧以供显示。来自相机的缓冲区可以输入MediaCodec编码器,而无需复制它们或将数据转换为不同的格式。(请参阅CameraToMpegTest示例。)这种方法可能与您声明的目标之一不兼容:应用于每一帧的压缩可能会将质量降低到可接受的水平以下。

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

于 2013-09-05T15:01:50.073 回答