動画を背景に文字や画像を描写するには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カスタム

動画を背景に文字や画像を描写するには

#1

投稿記事 by カスタム » 14年前

毎回参考にさせていただいています。カスタムです。
過去スレにも同じような質問がありましたが、動画を背景にしてその上に文字を描写するというプログラムを組んでいます。
Aerobeat Plusで同様の処理をしているとの情報も書いてありましたので、ぜひご助言のほどお願いします。

開発環境ですがC++とDirectXで作成しています。DXLibは使用していません。
動画関係の処理も含みますのでDirectShowを使用しています。

DirectShow関連の知識はあまりなくコピペ等で作成したので詳しくはありませんが、
作製したプログラムではウィンドウを作成してVMR9によりウィンドウに描写をしています。(動画単体では正常に再生される状態です)
この再生している音声付動画の上に文字や画像を描写したいと思っています。
なお、文字や画像は操作により移動や変化をします。
以下コードです。

コード:

IGraphBuilder *g_pGB;
ICaptureGraphBuilder2 *g_pCGB2;
IMediaControl *g_pMC;
IBaseFilter *g_pVMR9;

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

// IGraphBuilderインターフェイスの取得
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (LPVOID *)&g_pGB );

// VMR9フィルタを用意
CoCreateInstance(CLSID_VideoMixingRenderer9, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&g_pVMR9);
g_pGB->AddFilter(g_pVMR9, L"VMR9");	// VMR9フィルタをGraphに追加

// VRM9をウィンドウレスモードにする
IVMRFilterConfig *pVMRCfg = NULL;
g_pVMR9->QueryInterface( IID_IVMRFilterConfig9, (void**)&pVMRCfg );
pVMRCfg->SetRenderingMode( VMRMode_Windowless );
pVMRCfg->Release();     // IVMRFilterConfigはもう必要ない

// 描画ウィンドウの指定
IVMRWindowlessControl9 *pVMRWndCont = NULL;
g_pVMR9->QueryInterface( IID_IVMRWindowlessControl9, (void**)&pVMRWndCont );
pVMRWndCont->SetVideoClippingWindow( hWnd );

// 再生するファイルをSourceFilterとして用意
IBaseFilter *pSource = NULL;
g_pGB->AddSourceFilter(L"data/test.avi", L"Source", &pSource);

// CaptureGraphBuilder2インターフェイスの取得
CoCreateInstance( CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&g_pCGB2);
g_pCGB2->SetFiltergraph( g_pGB ); 

// フィルタの接続
g_pCGB2->RenderStream(0, 0, pSource, 0, g_pVMR9);
g_pCGB2->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, 0);

// 描画領域の設定(接続後でないとエラーになる)
LONG W,H;
RECT SrcR, DestR;
pVMRWndCont->GetNativeVideoSize(&W, &H, NULL, NULL);
SetRect(&SrcR, 0, 0, W, H);
GetClientRect(hWnd, &DestR);
pVMRWndCont->SetVideoPosition(&SrcR, &DestR);
pVMRWndCont->Release();         // ウィンドウレスコントロールはもう必要ない

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

g_pMC->Run();
今考えているのは動画に直接文字や画像をミキシングして再生する方法です。(実際できるかどうかは別として)
または、動画をキャプチャして画像として表示していく方法です。
後者はウィンドウを移動しているときなど、動画が止まってしまいそのまま動画と音声がずれてしまわないかと心配しています。(未実施)

上記以外にどのような方法があるでしょうか。またAerobeat Plusではどのようにしているのでしょうか。
あと、上記2つも含め、プログラムで書く場合、どのように書いたら良いのでしょうか。
DirevtShow関連の情報が少なくてすごく困ってます。
皆さまのお力をかしてください。よろしくお願いします。

“C言語何でも質問掲示板” へ戻る