摘要:本篇文档概括性的介绍了DirectShow的主要组成部分,以及一些Directshow的基本概念。熟悉这些基本的知识对于Directshow的应用开发或者过滤器的开发者都会有所帮助。 WWW.PLCJS.COM——可编程控制器技术门户
——可——编——程——控-制-器-技——术——门——户
DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。那么,DirectShow能够做些什么呢?且看,DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑(非编、非编采集卡、高清非编卡、非编系统),以及与数字摄像机的数据交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。 WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WW.W_PLC※JS_C,OM-PL,C-技.术_网
应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示。plcjs.技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW.PLCJS.COM——可编程控制器技术门户 图1 DirectShow系统框图 |
WWW_PL※CJS_COM-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
1、DirectShow的 FilterP_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_P※LCJS_CO※M-PLC-技-.术_网
Directshow是基于模块化,每个功能模块都采取COM组件方式,称为Filter。Directshow提供了一系列的标准的模块可用于应用开发,开发者也可以开发自己的功能Filter来扩展Directshow的应用。下面我们用一个例子来说明如何采取Filter来播放一个AVI的视频文件。WWW_PLCJS@_COM%-PLC-技.术_网
plcjs.技.术_网
1) 首先从一个文件中读取AVI数据,形成字节流。(这个工作由源Filter完成)W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
2) 检查AVI数据流的头格式,然后通过AVI分割Filter将视频流和音频流分开。P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
3) 解码视频流,根据压缩格式的不同,选取不同的decoder filters 。P.L.C.技.术.网——可编程控制器技术门户
WWW_PLCJS_COM-PLC-技.术_网
4) 通过Renderer Filter重画视频图像。流媒体视频捕获卡WWW_P※LCJS_CO※M-PLC-技-.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
5) 音频流送到声卡进行播放,一般采用缺省的 DirectSound DeviceFilter。流程见下图。plcjs.技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WW.W_PLCJS_COM-PLC-技.术_网 图2 音频流播放Graph图 |
WWW.PLCJS.COM——可编程控制器技术门户
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
从上面的图表看,每一个filter都一个其他的一个或者两个filter相连接。两个Filter相连接的连接点也是com对象,我们称为Pin。Filter通过pin将数据从一个filter传递到另一个filter中,从而可以使数据在由filter组成的链表中流动。图中的箭头表示filter链表中的数据流的方向。在Directshow中,像上面的这样一个filter 链表我们称为filter Graph。P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS@_COM%-PLC-技.术_网
Filter具有三个状态,运行,停止,暂停。当一个filter运行时,它就处理媒体数据流,当停止时,filter就不在处理数据,暂停状态常用来给运行状态之前cure data。Data Flow in the Filter Graph一章详细描述了这些概念,可以参考。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_P※LCJS_COM-PLC-)技.术_网
除了一些特别的例外, Filter graph中所有的filter的状态的改变都是统一的,也就说,filte graph中的所有的filter 的状态改变是一致协调的。也就是说,我们也可以用filter graph也可以有运行,停止,暂停三种状态。WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
Filter 一般分为下面几种类型。——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS@_COM%-PLC-技.术_网
(1)源过滤器(sourcefilter):源过滤器引入数据到过滤器图表中,数据来源可以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。支持DirectShow的流媒体采集卡WWW_P※LCJS_COM-PLC-)技.术_网
WWW_PLCJS_COM-PLC-技.术_网
(2)变换过滤器(transform filter):变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
(3)提交过滤器(renderer filter):提交过滤器在过滤器图表里处于最后一级,它们接收数据并把数据提交给外设。WWcW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
(4)分割过滤器(splitter filter):分割过滤器把输入流分割成多个输出。例如,AVI分割过滤器把一个AVI格式的字节流分割成视频流和音频流。plcjs.技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
(5)混合过滤器(mux filter):混合过滤器把多个输入组合成一个单独的数据流。例如,AVI混合过滤器把视频流和音频流合成一个AVI格式的字节流。WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
WWW_PLCJS_COM-PLC-技.术_网
过滤器的这些分类并不是绝对的,例如一个ASF读过滤器(ASF Reader filter)既是一个源过滤器又是一个分割过滤器。WWW_PLCJS@_COM%-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
2、关于Filter Graph ManagerWW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PLC※JS_COM-PmLC-技.术_网
Filter Graph Manager也是一个com对象,用来控制Filter graph中的所有的filter,主要有以下的功能: WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
1) 用来协调filter之间的状态改变,从而使graph 中的所有的filter的状态的改变应该一致。plcjs.技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
2) 建立一个参考时钟。plcjs.技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
3) 将filter 的消息通知返回给应用程序WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
4) 提供用来建立 filter graph的方法。WW.W_PLCJS_COM-PLC-技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
这里只是简单的描述一下,详细地可以参考文档。WWW_PLC※JS_COM-PmLC-技.术_网
WWW.PLCJS.COM——可编程控制器技术门户
状态改变,Graph中的filter的状态改变应该一致,因此,应用程序并将状态改变的命令直接发给filter,而是将相应的状态改变的命令发送给Filter graph Manager,由manager将命令分发给graph中每一个filter。Seeking也是同样的方式工作,首先由应用程序将seek命令发送到filter graph 管理器,然后由其分发给每个filter。WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
参考时钟,graph中的filter都采用的同一个时钟,称为参考时钟(reference clock),参考时钟可以确保所有的数据流同步,视频桢或者音频桢应该被提交的时间称为presentation time.presentation time 是相对于参考时钟来确定的。Filter graph Manager应该选择一个参考时钟,可以选择声卡上的时钟,也可以选择系统时钟。WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
W1WW_P4LCJS_COM-PLC-技.术_网
Graph事件, Graph 管理器采用事件机制将graph中发生的事件通知给应用程序,这个机制类似于windows的消息循环机制。专业音视频流媒体卡WWW.PLCJS.COM——可编程控制器技术门户
WWW.PLCJS.COM——可编程控制器技术门户
Graph构建的方法,graph管理器给应用程序提供了将filter添加进graph的方法,连接filter的方法,断开filter连接的方法。WWW_P※LCJS_COM-PLC-)技.术_网
——可——编——程——控-制-器-技——术——门——户
但是,graph 管理器没有提供如何将数据从一个filter发送到另一个filter的方法,这个工作是由filter在内部通过pin来独立完成的,WW.W_PLCJS_COM-PLC-技.术_网
3、媒体类型W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
因为Directshow是基于com组件的,就需要有一种方式来描述filter graph每一个点的数据格式,例如,我们还以播放AVI文件为例,数据以RIFF块的形式进入graph中,然后被分割成视频和音频流,视频流有一系列的压缩的视频桢组成,解压后,视频流由一系列的无压缩的位图组成,音频流也要走同样的步骤。 plcjs.技.术_网