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 ); }