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

我已经对这个话题进行了很多研究,但似乎我做错了什么,或者我的理解不知何故.

我只是希望获得最佳性能(例如以FPS测量),以便从Android驱动的SmartPhone中获取高质量图像,并直接向用户显示,而无需任何修改.

由于我有一个非常强大的智能手机(Nexus 4),我认为这应该是一项微不足道的任务.但我所有的努力都没有得到回报.例如.我使用最新的OpenCV框架仅为800×480流实现了大约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/

更新:
通过简单地设置recording hint,同时使用SurfaceTextureTextureView作为相机接收器,我已经能够将抓取性能提高到几乎恒定~25FPS @ 1280×720.

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

不过,我会继续研究并随时通知你.各种信息仍然受到欢迎!

最佳答案 限制因素是您可以多快地移动大量数据.有一个类似的讨论
here.你有三个任务:(1)获取图像,(2)保存图像(“捕获”),和(3)显示图像. (如果我误解了你的问题,而你不需要#2,那么相机的表面预览模式将高速执行您想要的操作.)

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

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

点赞