1最简单的DirectShow应用程序 — 播放视频
1.简介DirectShow是DirectX中的一套处理媒体播放、音视频采集的开发包,在DirectXSDK Summer 2004(DirectX9.0C SDK的第一个版本,下载地址:http://download.microsoft.com/download/7/e/9/7e9f48c6-f28a-469b-9b8e-cc84032efbd4/
dxsdk_sum2004.exe)之前的DirectXSDK中都包含有DirectShowSDK,之后的DirectShowSDK以Extras的形式单独发布。2.下载安装这里使用了DirectX9.0b,下载地址为:http://download.microsoft.com/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe假设DirectXSDK安装在D:DXSDK目录下,开发环境使用VC++6.0。在这个版本的DirectXSDK中,DirectShowSDK的库文件STRMBASE.lib需要自己编译,位置在:D:DXSDKSamplesC++DirectShowBaseClasses目录下。3.设置VC++6.0环境添加D:DXSDKInclude到Includefiles目录列表中。4.最简单的DirectShow应用程序 -播放视频文件#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模型来管理整个数据流的处理过程,它是一系列Filter构成的一条流水线,其中的每个Filter都是COM组件。Filter主要有几个大类:a.源Filter:负责读取数据;b.转换Filter:负责转换数据的格式,常见的视频解码器就是转换Filter;c.渲染Filter:负责输出数据,如播放或存盘操作。每个Filter都有一个或几个引脚,各个Filter通过这些引脚相连形成一个Filter Graph。DirectX9.0 SDK中提供了一个工具GraphEdit,它可以演示Filter之间的连接关系,并执行这个Filter Graph。
下面用GraphEdit来展示一个rmvb文件的播放过程:
真正开发的时候,其实就是把这个图用代码描述出来。