【1】C#下的Directshow

本文档介绍了C#环境下Directshow的基础知识,包括Filter Graph的构建、Filter和Pin的概念,以及如何在C++中创建DirectShow应用程序。Directshow通过Filter Graph管理Filter,每个Filter都是COM组件,通过Pin进行连接。C++示例展示了创建Filter Graph、添加Filter和控制数据流的过程。此外,文章还探讨了Directshow的智能连接机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值