2017-02-28 47 views
2

私はWindows Media Foundationを学習しています。
Windows SDKで提供されているサンプルアプリケーションのほとんどをテストしました。
カメラからのビデオキャプチャとファイルからのビデオ再生のサンプルアプリケーションがあります。WMF(Picture in Picture)のように2つのビデオストリームを1つのストリームにマージする

私がアーカイブしたいのは、1つのビデオソースでこれらのビデオソースを組み合わせて、Picture in Pictureのような1つのビデオストリームを生成することです。これはWindowsのメディア基盤でどのように行うことができますか?

私は約MFCreateAggregateSourceを読んでいます
https://msdn.microsoft.com/en-us/library/windows/desktop/dd388085(v=vs.85).aspx

MFCreateAggregateSource、この場合に使用することができ、またはそれはちょうど、オーディオおよびビデオストリームを混合するために使用されますか?

1つのビデオをフルスクリーンモードにして、最初のビデオの右上に小さなウィンドウで別のビデオストリームを表示したいとします。

メディア基盤を使用してこれを行う方法はありますか?

**更新**

私はそれらをデコードし、それらを混合した後、再エンコード彼らとそのファイルへの書き込みWMFを使用して2つのビデオストリームを読み、詳細については懸念をしています。スクリーンに表示しないでください。

答えて

2

MFCreateAggregateSourceはビデオミキシングを行いません。 2つのソースから1つのソースを作成します。たとえば、MediaSessionが(TopologyおよびTopologyNodeを通じて)使用することができます。

あなただけの2本のビデオを表示したい場合は、あなたがMFCreateAggregateSourceを使用してEVRに各ストリームを接続することができますEnhanced Video Renderer

を使用することができます。タイムスタンプ/デコーダ/ etc ...を処理したくない場合は、メディアセッション(IMFMediaSesion)も使用する必要があります。

+0

これはまさに私がやったことですが、今は別々に2つのビデオを1つのウィンドウに表示するのに苦労しています。 'm_pVideoMixerControl-> SetStreamOutputRect(0、&rect)'を使用しようとしましたが、動作しません。どのようにそれを行うことができます。 – User7723337

+0

どのような値を渡しますか。 rectは0.0〜1.0の範囲にあります。たとえば、MFVideoNormalizedRect rcHalf = {0.0、0.0、0.5、0.5};また、ストリームのIdentifierがm_pStreamSink-> GetIdentifierで正しいことを確認してください。 – mofo77

1

あなたの仕事は非常に珍しく、2つのビデオストリームを1つにマージすることができるMedia Foundationコンポーネントはありません。ただし、 'IMFMediaSesion'は、 'MFCreateAggregateSource'経由で2つのビデオストリームを1つのソースで処理することをサポートしています。つまり、2つのビデオストリームをPicture in Pictureのようなものにマージする独自のソリューションを書くことを可能にする「LEGO」請負業者のようなMedia Foundationが、そのような機能を単独ではサポートしていないことを意味します。

よろしくお願いいたします。

P.S. 1つのストリームの多くの例が含まれていますが、 'WaterMarkTransform'コードの画像を注入するためのMedia Foundation Transformコードが含まれています。そのようなコードはあなたのソリューションのために開始することができます - 一つのビデオストリームを別のビデオストリームに注入します。

P.S.私は間違いを持っ​​ている - 私はあなたが唯一の表示ピクチャインピクチャが欲しいことを参照してください - EVR - デフォルトビデオレンダラは16のビデオストリームをサポートしています - 1つの参照と15追加 - 'MFCreateVideoRendererActivate'を介して 'VideoRenderer'ビデオストリーム(2つのストリームのそれぞれの場合)TopologyNodeTopologyNodeがすでに 'VideoRenderer'に設定されていて、 'SetObject'によって設定されているため、多くのビデオストリームは1つの 'VideoRenderer'を使用します。'MF_TOPONODE_STREAMID'をTopologyNodeに設定してSetUINT32を 'MF_TOPONODE_STREAMID'に設定すると、0を設定することで参照するストリームを選択し、 'MF_TOPONODE_STREAMID'が0より大きい(たとえば1)additional Pictureになるストリームを選択する必要があります。 位置はadditional PictureIMFVideoMixerControlで制御できます。次のメソッドを含みます。 GetStreamOutputRect - コンポジション矩形内のビデオストリームの位置を取得します。

GetStreamZOrder - ビデオストリームのzオーダーを取得します。

SetStreamOutputRect - コンポジション矩形内のビデオストリームの位置を設定します。

SetStreamZOrder - ビデオストリームのzオーダーを設定します。

+0

こんにちは@Evgeny Pereguda:この詳細な回答を投稿してくれてありがとう、非常に役に立ちます。したがって、最後のアップデートごとに、Windows Media Foundationを使用して2つのビデオストリームを混在させることが可能です。もしあなたがこれを実装する事例があれば、それがどれほど正確に実装されているかを記述できる文書があれば、私はその流れを理解するのに役立つでしょう。また、実装時にどのように使用されているのか、トポロジーとちょっと混乱しています。もう一度お手伝いしてくれてありがと – User7723337

+0

こんにちは@Evgeny Pereguda:もし私たちが混合ビデオ(Picture in Picture)をファイルに保存したいのであれば、それはどうやって行えますか? – User7723337

+0

「Anton®Polinger」による「Microsoft®Media Foundationアプリケーションの開発」という本を読むことをお勧めします。これは、Media Foundation Topologyの構想を説明する1冊の本です。私はその本のためのコード例を持っています。また、あなたはMedia Foundation [Windows 7とWindows 8上のWebカメラからのライブビデオのキャプチャ](https://www.codeproject.com/articles/776058/)で私のプロジェクトを研究することができます。 Webカメラからのライブビデオをキャプチャする) - このプロジェクトには、Webカメラで作業するためのコードが含まれています。この画像には、注入画像のライブビデオ「WaterMark」が含まれています。 –

1

MFCreateAggregateSource、またはSequencer Sourceでもビデオミキシングで問題なく動作するかもしれませんが、私が関与しているプロジェクトでは、MFCinkWriterアプローチに複数のMFSourceReaderを使用しました。この方法で、シンクライターにEVRを接続するか、出力ビデオをファイルに保存すると、混合ビデオコンテンツを表示できます。私が取り組んでいるプロジェクトでは、要件はmp4に出力するだけですが、後でプレビューサポートを追加する必要があります。この目的のために、私はEVR(またはDX11VideoRenderer)用とMP4シンク用の2つのシンクライターを使用する予定です。実装は非常に安定して動作します。これは、各ソースリーダーから読み取り、タイムスタンプと一致し、ビデオサンプルを混合し、混合ビデオサンプルまたはオーディオサンプル(1つだけ)をシンクライターに出力するビデオ混合スレッドを有する。お役に立てれば。

+0

これに関する詳細や、2つのビデオストリームのミキシングに関係するコンポーネントの例を提供することは可能でしょうか。現在、私は混合ストリームの表示について心配していませんが、1. 2つのストリームを読み込み、2つを混合してファイルに書き込みます。そこで、WMF APIを使用してストリームをデコードし、それらをミックスしてから再エンコードしてファイルに書き出します。 – User7723337

+1

アイデアは、各ソース(ファイル、キャプチャ)ごとにIMFSourceReaderを作成することです。サンプルを非同期的に受信し、各サンプルをキューに入れるために、それぞれのサンプルに対してIMFSourceReaderCallbackを実装します。その後、別のスレッドでサンプルをデキューし、ビデオサンプルをミキシングします(たとえばdirectxを使用)。 EVRから取得したDirectXマネージャを使用してIMFSourceReaderを構成するか、またはDXデバイスを作成してIMFSourceReaderを構成できます。 IMFSinkWriterオブジェクトを使用して、混合ビデオサンプルをEVRに送ることができます。あるいは、MFCaptureD3Dのサンプルをチェックして、DXを使って混合サンプルを直接描画する方法を確認することもできます。 – VuVirt

+0

詳細をお寄せいただきありがとうございます。 2つのストリームサンプルを混合するためにDirectXをどのように使用できますか?サンプルが混在している場合、どのようにEVRを表示用に設定することもできます。 – User7723337

関連する問題