大量のビデオ データを記録する必要があるアプリを開発していますが、すべてを保存する必要はありません。私がする必要があるのは、記録されたストリームの最後の X 分間だけを保持することです。
これは、新しいサンプルを保存する必要があるたびに、最も古いサンプルを削除する方法が必要であることを意味します。
だから私はこの記事で作業を開始しました: http://msdn.microsoft.com/library/windowsphone/develop/hh394041%28v=vs.105%29.aspx
私が思いついた最初のアイデアは、 を呼び出してStopVideoRecording()
から、StartVideoRecording()
X 分ごとにタイマーを使用することでした。
さて、最初はこれは理にかなっていましたが、うまくいきません。
問題は、この方法を実行すると、以前のデータが X 分ごとに削除されることです。
つまり、12 分間を記録し、最後の 5 分間を保持する必要がある場合、このアイデアに従って、最初の 5 分間を削除し、次に 2 番目の 5 分間を削除して、最後の 2 分間だけを残します。これは私が探していたものではありません。
メソッドVideoSink
のおかげで、クラスに注意を向けました。OnSample
これは非常に単純に思えます。すべてのサンプルをインターセプトし、それを固定サイズのバイト配列に格納します (サイズは、必要な長さとサンプルのサイズによって異なります)。
バッファーがいっぱいになると、新しいサンプルを追加する前にすべてを左にシフトします。問題は、わずか 1 分のテスト ビデオで 2 GB のサンプルが生成され、この方法を管理するのが非常に困難なことです。
これらのサンプルは圧縮されていないことは知っていますが、スマートフォンの場合、サンプルを取得して圧縮し、大きな配列をシフトし、サンプルを挿入して配列をファイルに書き込み、受信したすべてのサンプルでそれを実行するのは難しくありませんか?
ええ、配列をファイルに書き込むことについて話しているのは、このビデオを何らかの方法で永続化する必要があるからです。バッテリーが機能しなくなる可能性があり、RAM だけに保存すると、記録したすべてが失われます。
頭に浮かんだ最後のアイデアは、VideoSink
との組み合わせを使用することでしたFileSink
。はFileSink
圧縮マジックを実行しますが (このクラスの動作を理解するためにこのクラスを逆コンパイルしましたが、内部にコードはありません!)、VideoSink
のOnSample
メソッドを使用して、 が使用する mp4 ファイルから不要なデータを手動で削除しますFileSink
。
FileSink
同時実行性の問題がある場合とない場合の両方でファイルに書き込むことができるかどうかわからないため、これは非常に難しいように思えますVideoSink
。また、その構造を処理することなく mp4 ファイルを操作するのに役立つ適切な c# ライブラリが見つかりませんでした。 . 私が見つけた唯一のライブラリはこれhttp://basemedia.codeplex.com/ですが、ドキュメントがまったくありません (ドキュメント ページの各リンクで 404 エラーが発生します)。
これはできないことだと思い始めていますが、正しい方向に向けてくれる人がここにいるかどうかを確認したいと思います.
編集: 明確にするために、「記録」という言葉ではなく、「記録」という言葉を使用しました。これは、ビデオがまだ記録されている間にビデオをトリミングすることについて話しているからです! これは、保存後に編集することではなく、ディスクに書き込んでいる間にストリームから何かを削除するようなものです。