2

大量のビデオ データを記録する必要があるアプリを開発していますが、すべてを保存する必要はありません。私がする必要があるのは、記録されたストリームの最後の 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圧縮マジックを実行しますが (このクラスの動作を理解するためにこのクラスを逆コンパイルしましたが、内部にコードはありません!)、VideoSinkOnSampleメソッドを使用して、 が使用する mp4 ファイルから不要なデータを手動で削除しますFileSink

FileSink同時実行性の問題がある場合とない場合の両方でファイルに書き込むことができるかどうかわからないため、これは非常に難しいように思えますVideoSink。また、その構造を処理することなく mp4 ファイルを操作するのに役立つ適切な c# ライブラリが見つかりませんでした。 . 私が見つけた唯一のライブラリはこれhttp://basemedia.codeplex.com/ですが、ドキュメントがまったくありません (ドキュメント ページの各リンクで 404 エラーが発生します)。

これはできないことだと思い始めていますが、正しい方向に向けてくれる人がここにいるかどうかを確認したいと思います.

編集: 明確にするために、「記録」という言葉ではなく、「記録」という言葉を使用しました。これは、ビデオがまだ記録されている間にビデオをトリミングすることについて話しているからです! これは、保存後に編集することではなく、ディスクに書き込んでいる間にストリームから何かを削除するようなものです。

4

1 に答える 1

2

コードを提供することはできませんが、単なるアイデアです。要件があるため:

  1. 私がする必要があるminutesのは、記録されたストリームの最後の X だけを保持することです。
  2. 対象プラットフォームはwindows phone 8

あなたの最初のアイデアにいくつかの変更を加えたいと思います。

  1. ビデオ ストリームの各分を別のファイルに書き込む
  2. また、+1 ビデオ ファイルを数分以上残す必要があります。たとえば、5 分が必要な場合は、最後のファイルがいっぱいではない可能性があるため、常に 6 つのファイルを保持する必要があります。
  3. 使用DirectShowすることで、このファイルを 1 つに結合することができます。使用する準備ができているC++(これに代わるものとして、何らかのサービスを使用するか、独自のバックエンドを作成することができます)
于 2013-10-05T07:18:40.180 に答える