【问题标题】:Android Camera Preview framerateAndroid 相机预览帧率
【发布时间】:2013-03-15 07:44:45
【问题描述】:

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

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

在我继续解决这个问题之前,我只是在处理我的硬件限制吗?要求手机每秒存储30次461k是不是很不合理?我意识到它是 13 兆/秒,但我正在重用分配的空间。所以这不是内存问题,而是处理速度问题,老实说,我不知道这是不是一个不合理的要求。

是否有其他人试图操纵从 Android 摄像头流出的数据?

感谢您花时间阅读本文。

【问题讨论】:

  • 以防万一,我最终决定放弃这一点,并将缓冲区发送到 JNI,它可以更快地处理数据。

标签: android camera preview frame-rate


【解决方案1】:

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

如果是,提高帧率的一种方法是使用带有缓冲区的预览回调。参考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 线程更新。

【讨论】:

  • 非常感谢。很抱歉花了这么长时间才回复。我基本上放弃了这一点,并开始在 JNI 方面进行处理。我将查看缓冲的回调,看看这是否提高了我的速度(无法想象它不会,它应该保存所有分配)。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多