8

.NETを使用してMPEG2トランスポートパケットを処理する必要があります。それを行うための最良の方法は何ですか?現在、OpenCVを使用してそれを実現することを検討していますが、それが可能かどうかはまだわかりません。

4

6 に答える 6

8

注:.NETをターゲットにしたいので、Windowsを使用していると思います。
私は過去にそうしました。私の知る限り、使用できる完全な .NET ソース コードはありません。

編集: OpenCVはあなたの仕事を助けません。OpenCV を使用してビデオを表示できます (内部で FFMPEG を使用します)。ただし、パケットにはアクセスできません。また、Windows では事前にコンパイルされているため、OpenCV で提供される FFMPEG ライブラリをハッキングするのは簡単ではありません。

実際に進むべき道は、ニーズによって異なります。ただし、パケット レベルで作業する必要がある場合は、MPEG2 TS 仕様を学習する必要があります。ウィキペディアは開始するのに適した場所ですが、最終的には仕様自体 iso13818-1 およびオプションで iso13818-2 を読む必要があります。ネット上でコピーを見つけることができます - グーグルで検索してください。C/C++ VLC、FFMPEG、libmpeg gstreamer (悪いプラグイン) でいくつかの参照実装を見つけることができますが、それらは読みにくく、十分に文書化されていないことを保証できます。また、完全で堅牢な MPEG TS マルチプレクサまたはデマルチプレクサを作成することは、ドキュメントの退屈な調査を必要とする難しい作業です。に書かれている「MPEG-2 トランスポート ストリーム パケット アナライザー」という .NET ツールがあります。NET では完全な実装のように見えますが、コードは自由に入手できません。からアクセスできます。http://www.pjdaniel.org.uk/mpeg/

C/C++ とプログラミングのスキルに応じて、次のオプションのいずれかをお勧めします。

  1. C/C++ のスキルはありませんが、非常に高いプログラミング スキルは必要です または、パケットを使って基本的な作業を行う必要があります:
    ドキュメントを読んで、必要なものを正確に実装してください
  2. C/C++ の優れたスキルと、FFMPEG を MinGW でコンパイルし、他の人のコードを読むための忍耐:
    FFMPEG (libavcodec) を取り、MpegTS 実装を調べて、それにフックを書き込んで、.NET と相互運用できるプレーンな C 関数をエクスポートします。

ビットストリーム自体で再多重化やその他の種類の重大な操作を行う必要がない限り、2 番目のオプションをお勧めします。

TS プロトコルの複雑さを考えると、C/C++ を使用して操作する方が簡単であることに気付くはずです (これは、私が C# から始めて最終的に行ったことです)。

非常に特殊なニーズを持つ特定のプロジェクトのために、独自のデマルチプレクサとマルチプレクサを作成する必要がありました。これは簡単な作業ではありませんでした (すべてを正しく実装するのに約 300 時間かかりました)。最終的には、Elecard や MainConcept の市販のマルチプレクサやデマルチプレクサほど堅牢ではありませんでした。必要でした。私は C++ でそれらを書きました - DirectShow (In C++) を使用してソース フィルターを作成し、Elecard (当時は MainConcept よりもうまく機能していました) を使用してデコードし、実際のビデオを表示するために独自の Renderer を作成しました。DirectShow チェーン全体は、相互運用機能を使用して C# から制御されました。

パスを選択したら、パケットの処理内容に応じて他の決定を行う必要があります。それらをデコーダーまたはマルチプレクサーに送信する場合は、DirectShow を使用できます。データを受け取る場所に応じて、ソース フィルター、変換フィルター、または宛先フィルターに何を行うかを設定する必要があります。フィルターを .NET に実装する場合は、Maxim Kartavenkov フォームhttp://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-inによる「Pure .NET DirectShow Filters in C#」を使用できます。 -Cシャープ. (商用サポートが必要な場合は、Elecard .NET SDK を購入してください)。DirectShow のドキュメントも読む必要がありますが、開始するための参照フィルターがいくつかあります。パケットを見て、おそらくそれらを変更して書き戻すと、そのための独自のクリーンな実装を記述したり、libavcodec の mpegts 実装にハッキングしたりすることができます。何が起こっているのかを理解するのはそれほど複雑ではありません。しかし、非常に有益です。libavcodec は非常にクリーンなインターフェースを備えているため、変更されたパケットを簡単に元に戻すことができます。ただし、そのためのドキュメントも読む必要があります。

だから、それがあなたが望んでいた答えかどうかはわかりませんが、あなたが望むものへの簡単な道はありません.

于 2012-09-29T20:03:07.120 に答える
0

たとえば、このコンポーネント パックを使用するなど、従来の DirectShow フィルター開発ルートがより便利であることがわかる場合があります。

于 2011-04-28T20:07:03.473 に答える
0

あなたの質問を完全に理解しているかどうかはわかりません.NETを行ってMPEGパケットをキャプチャしてから何らかの処理を行う必要がある場合、OpenCVは問題ありませんが、Aforge.NETを使用することをお勧めしますこれは、OpenCVの相互運用を作成するのを避けるのに役立ちます. ビデオ処理ライブラリの幅広いコレクションが含まれており、役に立つはずです。

于 2011-05-03T18:58:13.703 に答える
0

SDP ファイルは素晴らしいです。これをパケット レベルで処理する必要があるかどうかはわかりませんが、通常は SDP ファイルをスクリプト化します。私がテストしたすべてのメディア プレーヤー (Windows Media、VLC、Quicktime) は、それらをサポートしています。次に、メディアを Web ページ、フォーム、または記録に埋め込む必要がある場合は、それぞれのプレーヤーの API から簡単に実現できます。

SDP ファイルは、プレーヤーがストリーム自体を取得するために必要なコンテナー、エンコード、およびネットワーク情報を渡します。

Windows Media Player が非常に優れた実装であり、SDP ファイルに基づいてすべてのフィルターを作成することに気付くまで、私は Direct Show をいじくり回すことに多くの時間を費やしました。とても簡単です。仕様は次のとおりです。

http://www.ietf.org/rfc/rfc4566.txt

VLC には、この種のことを行うための非常に優れた API もあります。

于 2011-05-03T16:45:08.003 に答える