WPFアプリケーションでDirectShowグラフをレンダリングするために、サンプルグラバーを使用してビットマップをメモリに書き込み、コード内の他の場所で読み取ります。これは奇妙な解決策のように見えるかもしれませんが、WPFブラシを取り除く唯一の方法のようです。
次のコードは、ビットマップについて必要な情報を提供します。
AMMediaType mt = grabber.GetConnectedMediaType();
VideoInfoHeader header = (VideoInfoHeader)Marshal.PtrToStructure(mt.formatPtr, typeof VideoInfoHeader);
header.BmiHeader // ...
現在、header.BmiHeader
はBitmapInfoHeaderタイプであり、ビットマップの幅や高さなどの情報を提供します。ビットマップをメモリに書き込むためにこの情報が必要です。
ただし、このコードは常に機能するとは限りません。たとえば、サンプルグラバーフィルタが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();
、同じメディアタイプも取得されます。ただし、このメディアタイプのformatPtr
or(pbFormat
C ++では)は0です。