0

カメラ プレビューからデータ ストリーミングのフレームを保存して操作しようとしています。これを行うコードは非常に単純ですが (YUV から RGB に変換しても)、フレームレートはひどいものです。

何もせずにプレビューを開いてすべての YUV データ (YUV 形式の場合は 640x480 * 1.5) を書き出すと、フレームレートは 8FPS 未満になります。ストレージをまったく使用しない場合、フレームレートは最大 100FPS になります (つまり、コールバックをハードウェアから切り離す必要がありますが、それは大した問題ではありません)。

これと戦い続ける前に、ハードウェアの制限に対処しているだけですか? 電話に 461k を毎秒 30 回保存するように要求するのは不合理ですか? 1 秒あたり 13 メガであることに気付きましたが、割り当てられたスペースを再利用しています。つまり、これはメモリの問題ではなく、処理速度の問題であり、それが不合理な要求であるかどうかは正直わかりません。

Android カメラからストリーミングされたデータを操作しようとした人はいますか?

これを読んでくれてありがとう。

4

2 に答える 2

4

私の最初の質問は、 Preview からのバイトを処理するために 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 スレッドからのみ更新できることを忘れないでください。

于 2012-11-11T19:51:10.603 に答える
1

質問の説明から、この問題は純粋にシステムへのファイル書き込みのデータレートが非常に高いことが原因であることは明らかです。ご指摘のとおり、30 個VGA (640x480)の画像を保存すると13.2 MBytes/secになり、これはおよそ106 Mbits/secになります。これは非常に高速なデータ レートであり、同じものを保存するには、関連するソフトウェアの変更に加えて、非常に高速なストレージ メディアが必要になります。

非圧縮フレームを SD カードに保存する場合、SD カードの仕様から、カードのクラスYUVが必要になることがわかります。UHS詳細については、次のリンクを参照してください: http://en.wikipedia.org/wiki/Secure_Digital#Speed_Class_Rating

内部フラッシュ メモリに保存する場合は、最大値を調べる必要があります。メモリ デバイスのデータ転送速度を調べて、理論上の限界を知ることができます。

要約すると、30 VGA フレーム/秒を保存する場合は、

  1. ファイルの書き込みは、Alex Chap によって既に指摘されているように、別のスレッドで非同期にする必要があります。

  2. このスレッドの優先度は、システム内の他のアクティブなスレッドと競合しないように慎重に選択する必要があります。ファイル システムの書き込みには時間がかかる場合があり、ファイル システムの更新が原因でスレッドがブロックされている場合、優先度を慎重に選択しないと、システムが停止する可能性があります。

  3. キュー内のバッファーの数は慎重に選択する必要があります。フレームのシンク、つまりファイル書き込みはYUV、チェーンの遅い部分になります。バッファの固定セットを再利用するには、システムのジッターを処理できるバッファの数を決定する必要があります。つまり、ファイルの書き込みが遅くても、ビデオ フレームのキャプチャを続行できます。これは、ユースケースのメモリ要件に大きな影響を与えます。

于 2013-03-14T23:44:45.253 に答える