我已经对这个话题进行了很多研究,但似乎我做错了什么或者我的理解不知所措。
我简单希望获得最佳性能(例如以FPS衡量),以便从Android驱动的SmartPhone中获取高质量图像,并直接向用户显示,而无需任何修改。
由于我有一个非常强大的智能手机(Nexus 4),我认为这应该是一项微不足道的任务。但我所有的努力都没有得到回报。例如。我使用最新的OpenCV框架仅为800x480流实现了大约10 FPS。
那么,是否可以通过我的手机相机抓取和显示高质量视频来实现> 25FPS?如果是这样,最好的策略是什么?我们也欢迎特定设备的考虑因素。
我用过的资源:
更新 我只需设置recording hint,同时使用SurfaceTexture和TextureView作为相机接收器,就可以将抓取性能提高到几乎恒定~25FPS @ 1280x720。
然而,我想知道是否有可能进一步提高性能。我尝试使用不同的预览格式,但没有运气。也许在我不知道的抓取性能上强制执行隐含的上限。
尽管如此,我还会继续研究并随时通知您。各种信息仍然受到欢迎!
答案 0 :(得分:2)
限制因素是您可以多快地移动大量数据。有一个类似的讨论here。您有三个任务:(1)获取图像,(2)保存图像(“捕获”),以及(3)显示图像。 (如果我误解了你的问题,并且你不需要#2,那么相机的Surface
预览模式将高速执行您想要的操作。)
Android 4.3上提供的一种内存带宽高效方法是将摄像机的Surface
预览提供给AVC编码器,保存编码的MPEG流,然后解码帧以供显示。来自摄像机的缓冲区可以输入MediaCodec
编码器,而无需复制它们或将数据转换为其他格式。 (请参阅CameraToMpegTest示例。)此方法可能与您声明的目标不符:应用于每个帧的压缩可能会将质量降低到可接受的水平以下。
如果你需要保持帧“整体”,你必须复制数据,可能多次,并将其写入磁盘。帧越大,移动的数据越多,一切都越慢。例如,摄像机捕获数据并将其写入本机缓冲区;将本机缓冲区复制到Dalvik VM的托管缓冲区;缓冲区写入磁盘; YUV转换为RGB;通过将数据上传到纹理并渲染它,RGB显示在屏幕上。