File Source しか指定していないので表示させてみる。
【表示結果】
Video Renderer
Color Space Converter
AVI Splitter
G:\\sampleMovie\\cap.avi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <dshow.h> HRESULT EnumFilters (IFilterGraph *pGraph); void main( void ) { IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL; IFilterGraph *pFGraph = NULL; // COM ライブラリを初期化する。 HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { printf ( "ERROR - Could not initialize COM library" ); return ; } // フィルタ グラフ マネージャを作成し、インターフェイスを問い合わせる。 hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, ( void **)&pGraph); if (FAILED(hr)) { printf ( "ERROR - Could not create the Filter Graph Manager." ); return ; } hr = pGraph->QueryInterface(IID_IMediaControl, ( void **)&pControl); hr = pGraph->QueryInterface(IID_IMediaEvent, ( void **)&pEvent); // グラフを作成する。 重要 : この文字列をシステム上のファイルに置き換える。 hr = pGraph->RenderFile(L "G:\\sampleMovie\\cap.avi" , NULL); hr = pGraph->QueryInterface(IID_IFilterGraph, ( void **)&pFGraph); if (SUCCEEDED(hr)) { // グラフを実行する。 hr = pControl->Run(); if (SUCCEEDED(hr)) { // 完了するまで待機する。 long evCode; pEvent->WaitForCompletion(INFINITE, &evCode); // 注 : 実際のアプリケーションでは INFINITE を使用しないこと。 // 無期限にブロックする場合がある。 } } EnumFilters(pFGraph); pControl->Release(); pEvent->Release(); pGraph->Release(); CoUninitialize(); } HRESULT EnumFilters (IFilterGraph *pGraph) { IEnumFilters *pEnum = NULL; IBaseFilter *pFilter; ULONG cFetched; // COM ライブラリを初期化する。 HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { printf ( "ERROR - Could not initialize COM library" ); return 0; } hr = pGraph->EnumFilters(&pEnum); if (FAILED(hr)) return hr; while (pEnum->Next(1, &pFilter, &cFetched) == S_OK) { FILTER_INFO FilterInfo; hr = pFilter->QueryFilterInfo(&FilterInfo); if (FAILED(hr)) { MessageBox(NULL, TEXT( "Could not get the filter info" ), TEXT( "Error" ), MB_OK | MB_ICONERROR); continue ; // 次は正しく動く可能性がある。 } #ifdef UNICODE MessageBox(NULL, FilterInfo.achName, TEXT( "Filter Name" ), MB_OK); #else char szName[MAX_FILTER_NAME]; int cch = WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName, MAX_FILTER_NAME, szName, MAX_FILTER_NAME, 0, 0); if (chh > 0) MessageBox(NULL, szName, TEXT( "Filter Name" ), MB_OK); #endif // FILTER_INFO 構造体はフィルタ グラフ マネージャへのポインタを保持する。 // その参照カウントは解放しなければならない。 if (FilterInfo.pGraph != NULL) { FilterInfo.pGraph->Release(); } pFilter->Release(); } pEnum->Release(); return S_OK; } |
0 件のコメント:
コメントを投稿