ビデオのフレームにリアルタイムでアクセスし、それらを変更できるようにする、コーディングが最も簡単なテクノロジは何ですか? DirectShow は知っていますが、そのプログラミング モデルは非常に複雑なようです。このようなフレーム フィルターのプログラミングを簡単にするフレームワークはありますか?
9 に答える
ビデオのフレームへのリアルタイム アクセスを許可し、それらを変更できるようにする
圧縮されていないビデオ フレームを取得し、レンダリングする前に変更することを検討していますか? または、ビデオ フレームを変更して、メディア ファイルに保存しますか?
最初のものは少し簡単です。DirectShow は最初は複雑に見えるかもしれませんが、実際には洗練されたフレームワークです。DirectShow.NET のサンプルを確認することを強くお勧めします。ビデオのフレームにアクセスするには、SampleGrabber フィルターを構成して DirectShow グラフに追加し、graph.RenderFile(mymediafile, null) を実行するだけで、フレームごとにコールバックを受け取ります。ピクセル データを変更すると、レンダリングされたビデオに表示されます。これには 1 ページ以上のコードは必要ありません。SampleGrabber の使用に関するサンプル ソース コードがありますが、これは Web カメラ用に作成されています。メディアの再生ははるかに簡単です (graph.RenderFile!)。
このようなものをファイルに書き込む必要がある場合は、上記と同様のことを行いますが、ビデオ レンダラーを使用する代わりに、ビデオ エンコーダーとマルチプレクサーを使用するようにグラフを構成する必要があります。おそらく、DirectShow を初めて使用する人にとっては面白くないでしょう ;)。
フレームを取得したいだけなら、directshow には IMediaDet と呼ばれる非常にシンプルなインターフェースがあります。メディア ファイルから任意のフレームを簡単に抽出する単純なクラスを作成しました。これは WPF を対象としていますが、ストレート GDI で動作するように調整できます。
ffmpegコマンドとlibavcodecライブラリを使用するオープンソースプロジェクトを見ることができます。
あなたが何を達成しようとしているのか正確にはわからないので、これは役に立たないかもしれませんが、ビデオのフレームをその場で変更する必要があるだけなら、AviSynthを調べることを強くお勧めします。スクリプト言語を使用してビデオを変更するビデオ フレーム サーバーです。バイナリ プラグインを作成するために使用できる SDK もあります。さまざまなタスクを実行するために、すでに多くのプラグインが利用可能です。スクリプトの例は次のようになります。
AviSource("C:\video.avi")
Crop(20,0,-20,0) //Crops 20px from the left and right of video
BicubicResize(640,480) //Resize to 640x480 using bicubic filter
# increase the gamma
Levels(0, 1.2, 255, 0, 255)
これらのスクリプトは、Virtualdub などのメディア プレーヤーまたはエンコーダーで開くことができます。
OK、「簡単」と言われたので、HTML5 <video> について言及する必要があります。次のリンクでデモと説明を参照してください。
しばらく前に、MSのいくつかのC++パッケージにAviFileというクラスがありました。どうなるかわかりません。
この問題を解決する最善の方法は、Windowsを使い続ける場合はDirectShowを使用することです。
AVIファイル形式(これは十分に文書化されており、グーグルで見つけることができます)は少し似ています:
AVIRIFF size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size
FRAME
SOUND
FRAME
SOUND
FFMpegを使用できます。
FFmpeg のドキュメントを確認してください
最も簡単な解決策は、AVIFile APIを使用することです。多くのサンプルが利用可能です。