Android Camera预览帧率

时间:2012-06-13 15:45:27

标签: android camera preview frame-rate

我试图存储和操作相机预览中的数据流帧。执行此操作的代码非常简单(即使转换YUV-> RGB),但帧速率非常糟糕。

如果我什么都不做,只打开预览并写出所有YUV数据(YUV格式为640x480 * 1.5),我的帧速率小于8FPS。如果我不进行任何存储,帧速率将达到100FPS(这意味着回调必须与硬件断开,但这没什么大不了的。)

在我继续战斗之前,我是否正在处理硬件限制?要求手机每秒存储361k三十次是不合理的吗?我意识到它是13美分/秒,但我重复使用分配的空间。所以它不是一个记忆问题,它是一个处理速度问题,老实说,我不知道这是不合理的请求。

有没有其他人试图操纵从Android相机流出的数据?

感谢您花时间阅读本文。

2 个答案:

答案 0 :(得分:4)

我的第一个问题是,您是否使用Previewcallbacks来处理来自预览的字节?

如果是,提高帧率的方法是使用带缓冲区的预览回调。请参阅http://developer.android.com/reference/android/hardware/Camera.html#setPreviewCallbackWithBuffer%28android.hardware.Camera.PreviewCallback%29以获取参考。

另一个很好的可能性是将处理放在一个单独的线程中。这是一个例子:

private ExecutorService processingExecutor;
// ...
this.processingExecutor = Executors.newSingleThreadExecutor();
public void onPreviewFrame(final byte[] data, final Camera camera) {

    processingExecutor.execute(new Runnable() {
        public void run() {
            processImage(data);
        }
    });
    // update your view here

    camera.addCallbackBuffer(data);
}

protected void processImage(byte[] data) {
    // do you processing here

}

不要忘记只能从UI线程更新视图。

答案 1 :(得分:1)

从问题的描述中,我很清楚这个问题纯粹是由于您的文件写入系统的非常高的数据速率。正如您正确指出的那样,存储30个VGA (640x480)图像的数量 13.2 MBytes / sec ,大​​致 106 Mbits / sec < / EM> 即可。这是非常高的数据速率,存储相同的数据需要非常高速的存储介质以及相关的软件更改。

如果您将未压缩的YUV帧存储到SD卡中,根据SD卡的规格,您会发现需要UHS类卡。有关相同内容的详细信息,请参阅此链接:http://en.wikipedia.org/wiki/Secure_Digital#Speed_Class_Rating

如果要存储到内部闪存中,则必须找出最大值。您的存储设备的数据传输速率,以了解您的理论限制。

总而言之,如果您希望存储30个VGA帧/秒,那么

  1. 文件写入必须在一个单独的线程中是异步的,正如Alex Chap已经指出的那样。

  2. 应谨慎选择此线程的优先级,以确保它不会与系统中的其他活动线程竞争。文件系统有时写入可能需要一些时间,如果您的线程因文件系统更新而被阻止,那么如果没有仔细选择优先级,您可能会窒息您的系统。

  3. 必须仔细选择队列中的缓冲区数量。接收器,即YUV帧的文件写入将是链中较慢的部分。为了重用一组固定的缓冲区,您必须确定可以处理系统中抖动的缓冲区数,即使文件写入速度很慢,您仍然可以继续捕获视频帧。这将对您的用例的内存需求产生巨大影响。