這裏提供一個控制檯 應用程序去播放一個音、視頻文件。這個程序只有幾行長。
在前面介紹了一個基 於 DirectShow 的應用程序,必須要進行如下幾個基本步驟:
1. 建立一個 Filter Graph Manager 的實例 .
2. 使用 Filter Graph Manager 建立一個 filter graph.
3. 運行這個 graph 。
調用 CoInitialize 去初始化一個這個 COM 庫。
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// 在這裏加入錯誤處理
}
這裏,我們跳過了對 返回值的檢查,當你調用了任何方法的時候都應該對返回值進行檢查。下面調用 CoCreateInstance創建 Filter Graph Manager 。
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
類 ID 是 CLSID_FilterGraph , 由於 Filter Graph Manager 是動態鏈接庫提供( dll ),所以使用 CLSCTX_INPROC_SERVER 。
CoCreateInstance 將返 回 IgraphBuilder 接口,在該例子中還需要兩個接口:
l IMediaControl 用於控制數據流。它提供停止和開始的操作方法。
l IMediaEvent 可以獲得 Filter Graph Manager 事件。例如,可以獲得播放完成事件。
這兩個接口都由 Filter Graph Manager 提供,可以通過 IgraphBuilder 指針去獲得它們:
IMediaControl *pControl;
IMediaEvent *pEvent;
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
現在,你可以建立過 濾器圖表 (Fileter Graph) 。對於文件播放,這裏只需要調用一個方法就可 以了:
hr = pGraph->RenderFile(L"C://Example.avi", NULL);
IGraphBuilder::RenderFile 方法將建立一個過濾器圖表,通過它來播放指定的文件。第一個參數指定要播放的文件名稱,它是個寬字符字符串。第二個參數是系統保留,必須爲 NULL 。如果指定文件不存在或文件格式未知,那麼該方法調用將失敗。
現在過濾器圖表已經 準備好了去播放文件,但是還必須調用 IMediaControl::Run 方法去播放。
hr = pControl->Run();
當過濾器圖表開始運 行,數據從通過過濾器播放出來。播放動作將在一個獨立的線程中進行。調用 IMediaEvent::WaitForCompletion 方法可以等待文件播放完成。
long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);
這個方法將一直等待 文件播放結束才返回。 INFINITE 就表示不能確定文件的播放時間長度。當應用程序完成播放後,應該釋放掉接口指針和關閉 COM 庫。
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
3.2. 全部源碼如下 :
// ControlTest.cpp : 定義控制檯應用程序的入口點。
// 該HelloWord 的作用主要是提供一個控制檯應用程序去播放一個音、視頻文件。
#include "stdafx.h"
#include <dshow.h>
int _tmain (int argc , _TCHAR * argv [])
{
IGraphBuilder *pGraph = NULL ;
IMediaControl *pControl = NULL ;
IMediaEvent *pEvent = NULL ;
// 初始化COM 庫
HRESULT hr = CoInitialize (NULL );
if (FAILED (hr ))
{
printf ("ERROR - Could not initialize COM library");
return 0;
}
// 建立過濾器圖表管理器
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 0;
}
hr = pGraph ->QueryInterface (IID_IMediaControl , (void **)&pControl );
hr = pGraph ->QueryInterface (IID_IMediaEvent , (void **)&pEvent );
// 建立過濾器圖表
hr = pGraph ->RenderFile (L "C://Example.avi", NULL );
if (SUCCEEDED (hr ))
{
// 播放
hr = pControl ->Run ();
if (SUCCEEDED (hr ))
{
// 等待播放結束
long evCode ;
pEvent ->WaitForCompletion (INFINITE , &evCode );
}
}
pControl ->Release ();
pEvent ->Release ();
pGraph ->Release ();
CoUninitialize ();
return 0;
}