因为Directshow是C++的东西,后来为了方便,才有牛人们在C#把directshow重写,但是相关文档很少,所以为了了解DIrectshow ,从C++下的directshow开始是最合理不过的了,但是在C#用不到的知识就基本没有提及了··
1 基础介绍
部分问题摘录:
DirectShow与ActiveMovie的关系?
ActiveMovie是DirectShow原来的名称,现已不再使用,但是一部分API仍保留了"AM"的前缀,比如AM_MEDIA_TYPE和IAMVideoAccelerator。
DMO可以代替DirectShow filter吗?
在编写编码器、解码器、效果器应用时,鼓励用DMO代替DirectShow filter。在其它的应用中,使用DirectShow filter可能会比较合适。
基础知识
Directshow使用Filter Graph来管理Filter(管理者叫做FilterGraph Manager).Filter Graph是Graph的“容器”,而Filter是FilterGraph中的最小功能模块。
在directshow中,一个filter链表我们称为Filter Graph
Filter是一种COM组件,为了实现在FilterGraph中的统一操作,每个Filter上都至少实现了IBaseFIlter接口。
Filter必须加入到FilterGraph且接入工作链路中才能发挥作用
Filter的链接实际上也是Filter上的Pin链接
试图链接两个Filter必须处于一个FilterGraph中,可以调用接口方法IFilterGraph::ADDFilter将指定Filter加入到FilterGraph中。
Filter Graph Manager 也是一个com 对象,用来控制Filtergraph 中的所有的filter,主要有以下
的功能:
1 用来协调filter 之间的状态改变,从而使graph中的所有的filter 的状态的改变应该一致。
2 建立一个参考时钟。
3 将filter 的消息返回给应用程序
4 提供方法用来建立 filter graph。
1.1 楔子
一个简单的C++例子
在C++中创建DirectShow应用程序的三个步骤
第一步,首先调用CoCreateInstance创建Filter Graph Manager:
HRESULT hr =CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
【(CLSID)是CLSID_FilterGraph。Filter GraphManager由进程内DLL(in-process DLL)提供,因此参数3,dwClsContext的值为CLSCTX_INPROC_SERVER。由于DirectShow运行自由线程模式 (free-threading model),所以你同样可以使用COINIT_MULTITHREADED参数来调用CoInitializeEx】
第二步是创建filter graph,调用CoCreateInstance得到的IGraphBuilder接口包含了大部分创建filtergraph的方法。在这个例子中还需要另外两个接口:IMediaControl和IMediaEvent。 IMediaControl控制数据流,它包含开启和停止graph的方法;IMediaEvent包含从Filter Graph Manager获取事件的方法,在这个例子中,这个接口用来得到回放结束事件。所有这些接口由Filter Graph Manager提供,使用得到的IGraphBuiler接口指针来查询得到。
IMediaControl *pControl;
IMediaEvent&nbs