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機能を使いたい場合にはミキシングを使わなくても意味はあります。) ミキシング方法などは後述します。