directshow 入門——播放文件

這裏提供一個控制檯 應用程序去播放一個音、視頻文件。這個程序只有幾行長。

在前面介紹了一個基 於 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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章