DirectShowで動画を再生するには、IMediaControlを取得して、メソッドのRenderFileを呼び出して、フィルタグラフを生成します。 フィルタグラフが生成できれば、IMediaControlのRunを呼び出せば動画を再生することができます。
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <windows.h>
#include <dshow.h>
// lib
#pragma comment( lib, "strmiids.lib" )
/*
DirectShowで動画を再生する
*/
int _tmain
(
int argc
, _TCHAR* argv[]
)
{
// std::wcoutのロケールを設定
std::wcout.imbue( std::locale( "", std::locale::ctype ) );
// エラーコード
HRESULT hResult = S_OK;
// COMを初期化
::CoInitialize( NULL );
// 再生する動画ファイル
std::wstring strFilePath = L".¥¥TestData¥¥Wildlife.wmv";
// IGraphBuilder
IGraphBuilder* pGraphBuilder = NULL;
// IMediaControl
IMediaControl *pMediaControl = NULL;
// IGraphBuilderを取得
hResult = ::CoCreateInstance(
CLSID_FilterGraph
, NULL
, CLSCTX_INPROC
, IID_IGraphBuilder
, (LPVOID *)&pGraphBuilder
);
if ( !SUCCEEDED( hResult ) ) {
// エラー
goto err;
}
// IMediaControlの取得
hResult = pGraphBuilder->QueryInterface(
IID_IMediaControl
, (void**)&pMediaControl
);
if ( !SUCCEEDED( hResult ) ) {
// エラー
goto err;
}
// FilterGraphの生成
hResult = pMediaControl->RenderFile( (BSTR)strFilePath.c_str() );
if ( !SUCCEEDED( hResult ) ) {
// エラー
goto err;
}
// 動画の再生
hResult = pMediaControl->Run();
if ( !SUCCEEDED( hResult ) ) {
// エラー
goto err;
}
// 動画待ち
::MessageBox( NULL, L"動画を再生しています。¥r¥nOKを押すと終了します。", L"お知らせ", MB_OK );
err:
// IMediaControlの破棄
if ( NULL != pMediaControl ) {
pMediaControl->Release();
}
// IGraphBuilderの破棄
if ( NULL != pGraphBuilder ) {
pGraphBuilder->Release();
}
// COMの終了
::CoUninitialize();
// 処理結果を返す
return( 0 );
}
