最大的相机抓取和显示性能
Maximum camera grab and display performance
我对这个话题进行了大量研究,但似乎我做错了什么,或者我的理解有些不对劲。
我只是想实现最佳性能(例如以 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 显示在屏幕上。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- OpenMP阵列性能较差
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 递归列出所有目录中的C++与Python与Ruby的性能
- 程序崩溃并显示"std::out_of_range"错误
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 性能报告 (.vspx) 在 Visual Studio 2013 中未打开(显示损坏)
- 测量直接显示滤波器的性能
- 最大的相机抓取和显示性能
- 为什么不太可能/不太可能显示性能改进?
- Python模拟显示慢性能,如何加快数组计算速度
- 当RVO显示最大的性能影响时
- 性能度量显示每个函数调用的malloc影响