VMR9を利用する

ここでは、VMR9(Video Mixing Renderer 9)を利用したサンプルを示します。 (注意)ここの例では、サンプルを簡潔にするためにエラー処理を書いていません。

VMR9の特徴

VMRの一番の特徴はその名の通り、ミキシングが出来ることです。 例えば、文字を映像に重ねてテロップのように表示したり、画像を映像の上に乗せたりできます。 VMRにはインターレース解除機能(deinterlace)機能もあります。 この機能はビデオキャプチャの時に便利です。

ここでは、VMRの機能を使うというよりも、まずはVMRをレンダラに指定したGraphの作り方を説明します。 VMRの各機能は後述します。

とりあえず、コードを書いてみる

まず、何も考えずに以下のコードを書いてみましょう。 「C:\DXSDK\Samples\media\butterfly.mpg」というMPEGファイルを再生します。 前述した例と違うのはDefaultのRendererではなく、VMR9をレンダラとして利用している部分です。


#include <stdio.h>

#include <dshow.h>

#define	FILENAME L"c:\\DXSDK\\Samples\\Media\\butterfly.mpg"

int
main()
{
 IGraphBuilder *pGraphBuilder;
 IMediaControl *pMediaControl;
 ICaptureGraphBuilder2 *pCaptureGraphBuilder2;

 // COMを初期化
 CoInitialize(NULL);

 // FilterGraphを生成
 CoCreateInstance(CLSID_FilterGraph,
	NULL,
	CLSCTX_INPROC,
	IID_IGraphBuilder,
	(LPVOID *)&pGraphBuilder);

 // MediaControlインターフェース取得
 pGraphBuilder->QueryInterface(IID_IMediaControl,
	(LPVOID *)&pMediaControl);

 // VMR9フィルタを用意
 IBaseFilter *pVmr9 = NULL;
 CoCreateInstance(CLSID_VideoMixingRenderer9, 0, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr9);

 // VMR9フィルタをGraphに追加
 pGraphBuilder->AddFilter(pVmr9, L"VMR9");

 // 再生するファイルをSourceFilterとして用意
 IBaseFilter *pSource;
 pGraphBuilder->AddSourceFilter(FILENAME, L"Source", &pSource);

 // CaptureGraphBuilder2というキャプチャ用GraphBuilderを生成する
 CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, 
   IID_ICaptureGraphBuilder2, 
   (LPVOID *)&pCaptureGraphBuilder2);

 // FilterGraphをセットする
 pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);

 // Graphを生成
 pCaptureGraphBuilder2->RenderStream(0, 0, pSource, 0, pVmr9);

 // 再生開始
 pMediaControl->Run();

 // 再生中にプログラムが終わってしまわないように
 MessageBox(NULL,
	"Block Execution",
	"Block",
	MB_OK);

 // 資源を解放
 pMediaControl->Release();
 pCaptureGraphBuilder2->Release();
 pGraphBuilder->Release();

 // COM終了
 CoUninitialize();

 return 0;
}


ここでは、とりあえずVMR9を使ってみる例を示しました。 VMR9はその名の通りミキシングをして初めて意味があるRendererです。 (もちろん、Deinterlace機能を使いたい場合にはミキシングを使わなくても意味はあります。) ミキシング方法などは後述します。