6

2 つのビデオを 1 つ (オーディオも) に合成し、ファイルとして保存しようとしています。たとえば、最終的なビデオの左半分にソース ビデオを表示し、右側に別のソースを表示します。どんなエンコーディングでも構いません。DirectShow ではありません。

IMFVideoMixerControl がこれに関連している可能性があると思いましたが、残念ながら私は MF に慣れていないため、これを達成するための正しい手順を判断できません。何らかのガイダンスを提供できる場合、またはウェブで利用可能な例があれば教えてください。ご協力ありがとうございました。

4

1 に答える 1

4

IMFVideoMixerControlビデオのレンダリングに使用されます。SourceReader を見ると、正しい軌道に乗っています。

これが私がすることです:

  1. IMFSourceReaderビデオ ソースごとに1 つ作成します。
  2. を作成しIMFSinkWriter、ソース リーダーのフレーム幅の合計に等しいフレーム幅で設定します。
    1. IMFSourceReader::GetCurrentMediaTypeソース メディア タイプを取得するために使用します。
    2. 各ソース タイプのフレーム ディメンションを取得するにはMFGetAttributeSize、GUID と共に使用します。MF_MT_FRAME_SIZE
    3. SinkWriter のメディア タイプを作成し、ソースからシンク メディア タイプに属性をコピーするためにMFCreateMediaType使用します。IMFMediaType::CopyAllItems
    4. MFSetAttributeSizeGUID と共に使用しMF_MT_FRAME_SIZEて、シンク タイプの増加したフレーム ディメンションを設定します。
    5. IMFSinkWriter::AddStream幅属性を除き、ソース タイプと同じビデオ ストリームを作成するために使用します。
  3. ソースごとに IMFSourceReader::ReadSample を呼び出し、ソースごとに 1 つの IMFSample を提供します。
  4. 新しい を割り当て、フレーム幅を増やしIMFSampleた新しい を取り付けます。IMFMediaBuffer
  5. MFCopyImage各ソース バッファを、割り当てられたメディア バッファの対応する側にコピーするために使用します。
  6. ファイル シンクへのIMFSinkWriter::WriteSample書き込みに使用します。IMFSample

この例では、ファイルの代わりにビデオ キャプチャ ソースを使用していますが、基本的な SourceReader/SinkWriter 処理については、このサンプルを参照してください。MFCreateSourceReaderFromURLの代わりに使用して、ファイル SourceReader を作成できますMFCreateSourceReaderFromMediaSource

編集:あなたもオーディオについて尋ねたことに気づきました。私の答えは、ビデオ ストリームの合成のみに対応しています。

于 2013-05-08T20:01:17.023 に答える