1

WPFアプリケーションでDirectShowグラフをレンダリングするために、サンプルグラバーを使用してビットマップをメモリに書き込み、コード内の他の場所で読み取ります。これは奇妙な解決策のように見えるかもしれませんが、WPFブラシを取り除く唯一の方法のようです。

次のコードは、ビットマップについて必要な情報を提供します。

AMMediaType mt = grabber.GetConnectedMediaType();
VideoInfoHeader header = (VideoInfoHeader)Marshal.PtrToStructure(mt.formatPtr, typeof VideoInfoHeader);
header.BmiHeader // ...

現在、header.BmiHeaderBitmapInfoHeaderタイプであり、ビットマップの高さなどの情報を提供します。ビットマップをメモリに書き込むためにこの情報が必要です。

ただし、このコードは常に機能するとは限りません。たとえば、サンプルグラバーフィルタがMPEG-2プログラムストリームピンに接続されている場合、headerはになりますnull。コードが特定のメディアタイプで機能しないのはなぜですか?また、BitmapInfoHeader構造を取得するために他にどのような方法がありますか?

私はdirectshow.netライブラリを使用していますが、C++での回答も歓迎します。

編集:これは私のグラフがどのように見えるかです:

*source* -> MPEG2-Demultiplexer -> SampleGrabber -> MS DTV-DVD Video Decoder -> Video Renderer

デコーダーとレンダラーの間にグラバーを配置することは許可されていません。demuxのビデオピンについて:

Major Type: Video

Sub Type: MPEG2_VIDEO
Format: MPEG2Video

サンプルグラバーを接続すると、その入力ピンも上記のメディアタイプになります。このグラフファイルをアプリケーションで開いて使用するとgrabber.GetConnectedMediaType();、同じメディアタイプも取得されます。ただし、このメディアタイプのformatPtror(pbFormatC ++では)は0です。

4

1 に答える 1

0

ビットマップが必要な場合は、非圧縮ビデオを受信する場所にサンプルグラバーを配置する必要があります。サンプルグラバーがMPEG-2プログラムストリームピンの背後にある場合、mpeg2プログラムストリームを受信します。もちろん、そこからビットマップを取得することは可能ですが、手動で逆多重化および解凍する必要があります。どちらも、directshowフィルターで実行するタスクです。

ただし、非圧縮のビデオを受信した場合でも、異なる形式を取得する可能性があります。デコーダーに応じて、RGB24、YUY2、YV12、...を受信できます。正確に受信するものについては、MediaSubTypeを確認してください。常にRGB24を受信したい場合は、SDKに含まれているRGBFilters/TransNull24フィルターを使用できます。この回答も参照してください。

編集:解像度だけでなくビットマップ自体も必要な場合は、デコーダーとレンダラーの間にサンプルグラバーを配置する必要があります。MSデコーダーが機能しない場合は、ffdshowを試してください。

于 2013-01-03T19:53:51.927 に答える