1最簡(jiǎn)單的DirectShow應(yīng)用程序 — 播放視頻
1.簡(jiǎn)介DirectShow是DirectX中的一套處理媒體播放、音視頻采集的開發(fā)包,在DirectXSDK Summer 2004(DirectX9.0C SDK的第一個(gè)版本,下載地址:http://download.microsoft.com/download/7/e/9/7e9f48c6-f28a-469b-9b8e-cc84032efbd4/
dxsdk_sum2004.exe)之前的DirectXSDK中都包含有DirectShowSDK,之后的DirectShowSDK以Extras的形式單獨(dú)發(fā)布。2.下載安裝這里使用了DirectX9.0b,下載地址為:http://download.microsoft.com/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe假設(shè)DirectXSDK安裝在D:DXSDK目錄下,開發(fā)環(huán)境使用VC++6.0。在這個(gè)版本的DirectXSDK中,DirectShowSDK的庫文件STRMBASE.lib需要自己編譯,位置在:D:DXSDKSamplesC++DirectShowBaseClasses目錄下。3.設(shè)置VC++6.0環(huán)境添加D:DXSDKInclude到Includefiles目錄列表中。4.最簡(jiǎn)單的DirectShow應(yīng)用程序 -播放視頻文件#include<windows.h>#include<DShow.h>#pragmacomment(lib,"Strmiids.lib")int__stdcall WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd){//本例來自DirectXSDK:HowTo Play a FileIGraphBuilder*pGraph=NULL;IMediaControl*pControl=NULL;IMediaEvent*pEvent=NULL;//初始化COM庫.HRESULThr=CoInitialize(NULL);if(FAILED(hr)){MessageBox(NULL,"ERROR- Could not initialize COMlibrary",
"Warning",MB_OK|MB_ICONWARNING);return-1;}//Create the filter graph manager and query forinterfaces.hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);if(FAILED(hr)){MessageBox(NULL,"ERROR- Could not create the Filter Graph Manager.","Warning",MB_OK|MB_ICONWARNING);return-1;}hr=pGraph->QueryInterface(IID_IMediaControl,(void**)&pControl);hr=pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);// Buildthe graph. IMPORTANT: Change this string to a file on yoursystem.hr=pGraph->RenderFile(
L"E:\Movie\2012\[2012].2012.2009.R5-CD2-人人影視.rmvb",NULL);if(SUCCEEDED(hr)){// Runthe graph.hr=pControl->Run();if(SUCCEEDED(hr)){// Waitfor completion.longevCode;pEvent->WaitForCompletion(INFINITE,&evCode);}}pControl->Release();pEvent->Release();pGraph->Release();CoUninitialize();return0;}2 DirectShow原理DirectShow使用Filter Graph模型來管理整個(gè)數(shù)據(jù)流的處理過程,它是一系列Filter構(gòu)成的一條流水線,其中的每個(gè)Filter都是COM組件。Filter主要有幾個(gè)大類:a.源Filter:負(fù)責(zé)讀取數(shù)據(jù);b.轉(zhuǎn)換Filter:負(fù)責(zé)轉(zhuǎn)換數(shù)據(jù)的格式,常見的視頻解碼器就是轉(zhuǎn)換Filter;c.渲染Filter:負(fù)責(zé)輸出數(shù)據(jù),如播放或存盤操作。每個(gè)Filter都有一個(gè)或幾個(gè)引腳,各個(gè)Filter通過這些引腳相連形成一個(gè)Filter Graph。DirectX9.0 SDK中提供了一個(gè)工具GraphEdit,它可以演示Filter之間的連接關(guān)系,并執(zhí)行這個(gè)Filter Graph。

下面用GraphEdit來展示一個(gè)rmvb文件的播放過程:
真正開發(fā)的時(shí)候,其實(shí)就是把這個(gè)圖用代碼描述出來。
愛華網(wǎng)