10

SDカード上の循環バッファに連続的なビデオをキャプチャする最良の方法(もしあれば...)を探しています。Androidの円形バッファへのビデオ録画

標準のビデオ録画APIを使用すると、ファイルに直接書き込むことができます。ユーザーが設定した制限やSDカードの容量に達した時点で、録画を停止して再起動する必要があります。これにより、録画が実行されていない最長2秒間のウィンドウが作成されます。これは、DailyRoads Voyagerのような既存のアプリが既に行っていることです。重要なものを見逃してしまう可能性を最小限に抑えるために、10分のような長い時間に分割時間を設定できますが、この時間幅の終わり近くにイベントが発生すると、最初に何もない9分間を保存することでスペースを無駄にします。

私の考えは次の通りです:私はバッファーとして役立つ大きなファイルを持っています。フレームをキャプチャしてファイルに保存し、最後に折り返すコードを使用します。ユーザーが何らかの部分を保持したい場合は、バッファの先頭と最後のポインタでマークします。以前と同じように録音を続行し、保持がマークされているリージョンをスキップすることができます。

録音が停止した後、またはその間に(電話/カードの速度に応じて)バックグラウンドスレッドで、マークされたリージョンを別のファイルにコピーして上書き保護を削除します。

上記の詳細について気にしない場合は、 Android SDKの個々のフレームを動画ファイルに変換する方法が見つからないようです。出来ますか?そうでない場合は、これを行うことができるネイティブコードのライブラリがありますか?

私は実際に圧縮されていないフレームの大きなバッファは気にしませんが、書き出したビデオはAndroid対応の形式で圧縮する必要があります。しかし、バッファを圧縮する方法があれば、それについて聞きたいです。

ありがとうございます。

答えて

8

AndroidのMediaRecorderには、出力を指定する2つの方法があります。 1つはファイル名で、もう1つはFileDescriptorです。

fromSocketParcelFileDescriptorを使用すると、ソケットを指し示すParcelFileDescriptorのインスタンスを作成できます。次に、getFileDescriptorに電話してFileDescriptorMediaRecorderに渡します。

(ローカルWebサーバーを作成しているかのように)ソケットからエンコードされたビデオを取得できるため、ビデオの個々のフレームにアクセスできるようになりますが、デコードする必要があるため直接的ではありません最初。

+0

エンコードされたビデオストリームを取得するのに良い方法のようですね、ありがとう。私はそれがどのように実行するか試してみる必要があります。しかし、個々のフレームをデコードすることは、あまりにも多くのCPUを使用します。多分、一部の電話機ではリアルタイム(エンコーディング+デコード)はできません。だから私は、ヘッダーなどを使わずに、エンコードされたストリームをいくつかの循環ファイルバッファに書き込むだけだと思います。その後、私はエンコードされたフレームをいくつかのヘッダーでパッチし、有効なビデオファイルを作成しようとします。 – lacop

+2

@albwq、あなたの方法はあなたのためにうまくいったのですか? – Felix

+2

デモコードを提供できますか?それは非常に役に立つでしょう! =) –