2016-09-06 19 views
0

私たちはAndroidプレビュー機能を利用したプロジェクトに取り組んでいます。利用可能な最大解像度(現在は1600 x 1200)でプレビューをキャプチャしています。アンドロイドプレビューフレームを30FPSで保存する最も良い方法は何ですか?

プレビューの各フレームをセカンダリストレージに保存する必要があります。 OnPreviewFrameは30FPS(約30ミリ秒/フレーム)でプレビューできますが、コードを追加してデータを保存すると、FPSが制限されます。

は、これまでテスト済み:メインスレッドで

  1. 両方OnPreviewFrameと保存JPEGを。この場合、保存にはおよそ250〜260ミリ秒かかります。したがって、FPSは5-6になります。

  2. OnPreviewFrameメインスレッドではJPEGを別のスレッドに保存します。したがって、保存するために各フレームに対して新しいスレッドが作成されます。メモリ内のスレッド(それぞれがクオリティファクタ60に対して約450〜500ミリ秒かかる)が発生すると、メモリが解放されると、プレビューにギャップが発生します。

したがって、すべてのフレームを30FPSで保存できる回避策はありますか?

答えて

0

多くのリソースを消費しています。ディスクI/Oのように回避できないものもあれば、他のものを大幅に減らすこともできます。

  1. メモリ割り当てと割り当て解除(GC)は、非常に高価です タスクです。 15-30フレームの事前割り当てとフレームプールの使用を検討してください。
  2. スレッドの作成は非常に高価です。 1つのバックグラウンドスレッド を使用することを検討してください。これは、キューの一部をポーリングし、フレームを保存した後にフレーム に返します。 (1つのスレッドがファイルを所定の時間に保存するタスクまでない場合は、あらかじめ割り当てられているスレッドプールを考慮してください)。
  3. I/Oは、提案したようにバックグラウンドスレッドで実行する必要があります。
+0

オプション2は実現可能なようですが、オプション1をどのように実装できますか?フレームバッファはAndroidシステムによって割り当てられ、参照は私たちと共有されます。 –

+0

@AmberBeriwal、オプション1あなたのメモリにデータをコピーします。オプション2、私が誤っていない場合は、addCallbackBufferを使用してカメラに独自のメモリを提供するオプションがあります。 addCallbackBufferは、あなたをフレームプールとして扱うことができます。 – feldi

+0

OK、addCallbackBufferとThreadPoolで確認します –

関連する問題