Directshow SDK提供了一种开放的开发环境,开发人员可以根据自己的需要制定各种组件。Directshow使用一种滤波器链表(Filter Graph)的模型来管理整个数据流的处理流程,每个部分都是COM组件,形成模块化,参与数据处理的模块就是滤波器(Filter)。
上几周学习DirectSound做了些总结,今天开始学习DirectShow今天主要介绍一个简单的媒体文件播放的程序。
首先来介绍下DirectShow的环境搭建,其实环境的搭建并不是很难,但是下载SDK确实发费了不少时间。现在来做一个总结,经过测试下载dxsdk_feb2005_extras.exe软件是正确的,将这个文件解压到制定的目录,会出现Directshow和Directsound两个目录,再将这两个目录拷贝到F:/Microsoft DirectX SDK (February 2010)目录(即DX安装目录),这样的话就基本上配置好环境了。但是在工程里面还需要附加文件目录和LIB目录,这里就不详细介绍了,如下来介绍简单的代码,这部分代码来自《VC++音频/视频处理技术及工程实践》书中。
创建过滤器管理器
IGraphBuilder *pGraph = NULL;
hr=CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
查询媒体控制器和媒体事件接口
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
开始播放
hr = pGraph->RenderFile(L"D://DXSDK//Samples//Media//ruby.avi", NULL);
if (SUCCEEDED(hr))
{
// 运行图表.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
//等待回放结束事件.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// 切记: 在实际应用当中,不能使用INFINITE标识, 因为它会不确定的阻塞程序
}
}