0

AMMediaTypeの一部であるVideoInfoHeaderを次の行でコピーできます。

AMMediaType mediaType = new AMMediaType();
VideoInfoHeader videoInfo = new VideoInfoHeader();
(pSampleGrabber as ISampleGrabber).GetConnectedMediaType(mediaType);
videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));

SampleGrabber Parameterから取得したものは正しくなく、インターネット上の他のリソースです。ただし、AMMediaType-Structure全体をコピーすることはできません。VideoInfoHeaderへのポインターは失われます。

そのため、AMMediaTypeをメモリ内の別の場所にコピーし、VideoInfoHeaderなどのポインターを探し、VideoInfoHeaderのコンテンツとその他の参照データを新しい場所にコピーするヘルパー関数(formatPtrを正しい場所にポイントすることを含む)が存在するかどうか疑問に思いました。 。

これを次のシナリオで使用しています。ビデオ入力デバイスのすべての可能なIPinメディアタイプを取得し、Windows.Forms-ComboboxにAMMediaTypesを表示します。コンボボックスからSelectedObjectを読み取ると、VideoInfoHeaderへのポインターがゼロになります。これは、フィルターグラフを作成するときに選択したピン構成を使用して接続できない場所です。

4

1 に答える 1

1

AMMediaType別名構造は、通常のAM_MEDIA_TYPEメンバーと、によって示される追加で割り当てられたメモリで構成されformatPtrます。後者は、フォーマットタイプに依存する意味を持つバイト配列です。構造体とスレーブメモリブロックはどちらも、通常、特定のCOMアロケータを使用しています。

構造体を複製することは、そのメンバーをコピーし、背後にあるバイト配列を複製することformatPtrです。この構造にはpUnk、COMインターフェイスと思われるメンバーも含まれていますが、通常はnullです。null以外であることは有効ですが、特にビデオおよびオーディオメディアタイプで実際に使用された1つのケースを何年にもわたって思い出せません。

于 2013-01-16T06:58:56.367 に答える