DirectShow-Filter原理

11 Filter 原理——概述
       Filter 是DirectShow中最基本的概念。DirectShow使用Filter Graph来管理Filter(管理者叫做Filter Graph Manager)。Filter Graph是Filter的“容器“,而Filter是Filter Graph中的最小功能模块。    
Filter是一种COM组件。为了实现在Filter Graph中的统一操作,每个Filter上都至少实现了IBaseFilter接口。IBaseFilter继承自IMediaFilter。Filter Graph Manager正是通过IMediaFilter的接口方法来控制Filter Graph的状态(运行、暂停、停止)转换。
Filter的类别:
Source Filters主要负责获取数据,数据源可以是文件也可以是设备。只有输出Pin。
Transform Filters主要负责数据的格式转换,例如数据流分离/合成、编码/解码等,然后将数据继续往下传输。既有输入Pin又有输出Pin。
Rendering Filters主要负责数据的最终去向,送达设备或文件。只有输出Pin。
 
12 Filter 原理——注册
实现Filter的文件一般是一个DLL,扩展名可以是.dll,但更多的时候是.ax。一般一个Filter项目都会包含一个.def文件,用于定义4个导出函数。
既然Filter是一种COM组件,使用前就必须先注册。Filter的注册信息一般包括两部分:基本的COM信息和Filter特有信息。在.def文件定义的4个导出函数:DllGetClassObject在创建Filter对象的时候被调用,根据CLSID返回对应的类工厂对象;DllCanUnloadNow用于判断是否可以从内存中卸载Filter DLL,即DLL中实现的所有COM对象是否都已经释放;DllRegisterServer和DllUnregisterServer调用AMovieDllRegisterServer2函数完成COM组件的自注册功能。
 
13 Filter 原理——连接
Filter一般由一个或多个Pin组成,Filter之间通过Pin相互连接,构成一条顺序的链路。
Filter的连接实际上也是Filter上Pin的连接,Pin的连接实际上是连接双方使用的媒体类型的一个“协商”过程。试图连接的两个Filter必须处在同一个Filter Graph中,可以调用接口方法IFilterGraph::AddFilter将指定的Filter加入到Filter Graph。
整个连接过程的步骤大致如下:
A、Filter Graph Manager在输出Pin上调用IPin::Connect;
B、如果输出Pin接受连接,则调用输入Pin上的IPin::ReceiveConnection;
C、如果输入Pin也接受这次连接,则双方连接成功。
 
14 Filter 原理——动态重建技术
       由于一些原因,我们需要对已有的Filter Graph进行修改。通常的做法是,先将Filter Graph停止,进行修改之后,在重新启动。另外还能够在保持Filter Graph运行状态的同时实现动态重建。Filter Graph的重建包括如下几种情形:
       A、仅仅改变Filter之间连接的媒体类型;
       B、增加或删除Filter,重新进行相关Filter之间的连接;
       C、对一条Filter链路(Filter Chain)进行操作。
 
15 Filter 原理——数据传送
每个 Pin 上都实现了 IPin 接口,这个接口主要用于 Pin 的连接,而不是数据传送。真正用于数据传送的一般是输入 Pin 上实现的 IMemInputPin 接口和输出 Pin 上实现的 IAsyncReader 接口。Filter之间的成功连接为数据传送做好了准备。 Filter 之间是以 Sample 的形式传送数据的, Sample 是一个封装了一定大小数据内存的 COM 组件。 Samplle 是由分配器( Allicator ,也是一个 COM 组件)来管理的。连接双方的 Pin 必须使用同一个分配器,但是这个分配器到底由哪个 Pin 来创建也需要协商。
数据传送主要有两种模式:推模式( Push Model )和拉模式( Pull Model )。
DirectShow 总是使用专门的线程来传送数据。所以,DirectShow应用程序至少包含两条线程,一条应用程序主线程以及至少一条数据传送子线程。
 
16 Filter 原理——状态转换
       Filter有3种状态:停止(Stopped)、暂停(Paused)和运行(Running)。其中,暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。作为一种中间状态,暂停也是停止与运行之间切换所必经的一种状态。
 
17 Filter 原理——媒体定位的实现
应用程序可以通过Filter Graph Manager上获得的IMediaSeeking接口,实现对流媒体的随机定位(Seeking)和调整媒体文件的回放速率。实际上,IMediaSeeking接口的真正实现在Filter上。
用于媒体定位的还有另外一个接口IMediaPosition,这是一个支持自动化(Automation)的接口,是为那些弱类型编程语言(如VB)开发DirectShow应用程序而设计的。对于Filter开发人员来说,并不要求实现IMediaPosition。Filter Graph Manager会自动将IMediaPosition的接口方法调用转换为IMediaSeeking的接口方法调用。
 
18 Filter 原理——质量控制的实现
数据线程是通过一种“压迫式”方式往下传送数据的。虽然Video Renderer接收到Sample后,会根据Sample上的时间戳来正确安排显示时机,但仅仅这样是不够的,它并不能改善Filter Graph运行时的性能。因此,DirectShow另外设计了一种“自适应”的反馈机制:质量控制(Quality Control)。质量控制通过IQualityControl接口来实现。具体质量控制策略的实现取决于具体的Filter实现,可能调整发送速度,也可能是丢失部分数据。
 
19 Filter 原理——音视频同步解决方案
       在任何系统设计中,最关键的都是系统框架以及控制部分。DirectShow也不例外,这个重要的部分就是Filter Graph Manager,它向下直接控制Filter Graph中的所有Filter,向上对应用程序提供编程接口。可惜的是,微软公司并没有提供这些功能控制的源代码。
DirectShow的音视频同步解决方案就是为Filter Graph选择一个公共的参考时钟(Reference Clock),并且要求传送到Renderer Filter的每个Sample都打上时间戳(Time Stamp);Video Renderer或Audio Renderer根据Sample的时间戳以及参考时钟当前的参考时间,来正确安排Sample的播放时机。
 
20 Filter 原理——对硬件的支持
       为了提高系统的稳定性,Windows对硬件操作进行了隔离,应用程序一般不能直接访问硬件。DirectShowFilter工作在用户模式下,而硬件工作在内核模式下,它们之间如何协同工作呢?DirectShow的解决方案是为这些硬件提供包装(Wrapper)Filter,这种Filter能够工作在用户模式下,其外观和控制方法与普通Filter一样,而包装Filter在内部完成与硬件功能的交互。
 
21 Filter 原理—— VMR-9 的发布
       VMR(Video Mixing Renderer)是DirectShow的新一代Video Renderer。VMR有两个版本:VMR-7和VMR-9。前者采用了DirectDraw 7技术,仅仅在Windows XP操作系统下可以获得,并且是XP上默认的用于视频显示的Renderer(代替传统的Video Renderer);后者采用了Direct3D 9的技术,是随DirectX9.0一起发布的,但任何时候都不是默认的Renderer。
       安装了DirectX9.0以后,就有4个Video Renderer可供选择使用:传统的Video Renderer、Overlay Mixer、VMR-7和CMR-9。
       VMR主要利用了显卡专有的图形处理能力(VMR做视频的合成和显示时并不占用系统的CPU资源),它能够表现的性能对于硬件的依赖性很高。
 
22 Filter 原理—— Filter Graph 的构建方法
(1)IFilterGraph::AddFilter:该参数提供一个Filter对象,将其加入到Filter Graph中。
(2)IFilterGraph::ConnectDirect:该参数提供输出Pin、输入Pin以及媒体类型,进行直接的连接。
(3)IGraphBuilder::AddSourceFilter:该参数提供源文件名,自动将一个Source Filter加载到Filter Graph中。
(4)IGraphBuilder::Connect:该参数提供输出Pin和输入Pin进行连接,如果连接失败,自动尝试在中间插入必要的格式转换Filter。
(5)IGraphBuilder::Render:该参数提供输出Pin,自动加入必要的Filter完成剩下部分Filter Graph的构建(直到连接到Rendering Filter)。
(6)IGraphBuilder::RnderFile:该参数提供源文件名,自动加入必要的Filter完成这个文件的回放Filter Graph的构建。
Filter 通过 Pin 这样的连接,就能“串联”起来,从而构建完整的 Filter Graph 。后四种构建方法都有“自动”的功能,这种机制称为智能连接( Intelligent Connect )。  
 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值