DirectShow系统综述

DirectShow系统综述

翻译自MSDN DirectShow文档, 译者 王斐

多媒体的挑战

使用多媒体会出现以下主要的挑战

1 多媒体包含了大量的需要快速处理的数据。
2 为了开启和停止时间相同,并且以相同的比率播放,音频和视频必须同步。
3 数据可以有各种格式,比如音频-视频交叉存取(AVI),高级流格式(ASF), 电影专家组(MPEG),以及数字视频(DV)。
4 程序员事先并不知道最终用户系统会出现什么样的硬件设备。

DirectShow提供的解决办法

    DirectShow被设计来解决以上的挑战。主要的设计目的是通过将应用程序与数据传输,硬件区别以及同步等复杂过程分隔开来从而简化在微软平台创建数字媒体应用程序的任务。
    为了达到视频和音频流所需要的吞吐量, DirectShow尽可能的使用DirectDraw和DirectSound技术。这些技术可以有效的将数据提交给声卡和显卡。DirectShow通过时间戳将媒体数据样本封装的办法来达到同步播放。为了处理各种可能的信息源,格式以及硬件设备,DirectShow使用了模组结构,从而应用程序可以融合匹配不同的被称作滤波器(Filter)的软件组件。
    DirectShow提供支持基于微软驱动模型(WDM)的捕获及调谐设备的滤波器(Filter),从前遗留的基于微软视频(Video for Windows)的捕获卡的滤波器,以及为音频压缩管理器(ACM)和视频压缩管理器(VCM)接口编写的多媒体数字信号编解码器(CODECS) 。
以下图示显示了应用程序,DirectShow组件,一些DirectShow支持的硬件软件组件之间的联系。

    如图所示,DirectShow滤波器可以与很多硬件通讯并控制它们,包括当地文件系统,TV调谐器,视频捕获卡, VFM编解码器,视频显示器(通过DirectShow和图形设备接口(GDI)),以及声卡(通过DirectSound)。这样DirectShow就将应用程序与设备的复杂事物隔离开来。DirectShow对于一定格式的文件也提供自带的压缩,解压滤波器。

过滤器图形及其组件

    这篇文章描述了DirectShow的主要组件。可以作为应用程序及定制DirectShow滤波器的开发人员的介绍性文档。应用程序开发人员通常可以不理会DirectShow中许多底层的细节。然而,为了全面理解DirectShow的结构,阅读这一章也是一个不错的想法。

关于DirectShow滤波器

    DirectShow使用模组结构,处理的每一个阶段都通过一个叫滤波器的COM组件来完成。DirectShow为应用程序提供了一套标准的滤波器,开发人员定制自己的滤波器来扩展DirectShow。这里有几个步骤来播放AVI视频文件,每一步都是通过滤波器来完成。

1 从字节流文件中读取原始数据(文件源滤波器-File Source Filter)
2 检测AVI头,将字节流解析成单独的视频桢和音频样本(AVI 劈分滤波器-AVI Splitter Filter)
3 解码视频桢(根据压缩格式的不同,存在不同的解码滤波器)
4 绘制视频桢(视频实现滤波器-Video Render Filter)
5 将音频样本送到声卡(缺省的DirectSound设备滤波器)


    如图所示,每一个滤波器与一个或多个其它的滤波器相连。而连接点也是COM对象,叫做针(pin)。滤波器使用针从一个滤波器向另外一个移动数据。图形中的箭头显示了数据传输的方向。在DirectShow中,滤波器集合为称作滤波器图形。

    滤波器有三个可能的状态:运行,停止和暂停。当滤波器运行的时候,它可以处理数据。当停止时,它停止处理数据。暂停状态用来在运行前提示数据。Data Flow in the Filter Graph部分详细描述的这个概念。大多数情况下,整个过滤器图形(Filter Graph)中的状态变化是同等的。图形中的过滤器统一调整状态。这样,整个滤波器图形也可以被称作运行,停止或暂停。

    滤波器可以被分为以下几个比较大的类别:
1 源滤波器(Source Filter)将数据导入图形(Graph)。 数据可能来自文件,网络,相机或则其他地方。每一个源滤波器处理不同的数据来源。
2 变换滤波器(Transform Filter)获取输入流,处理数据,并且创建输出流。编码器和解码器都是变换滤波器的例子。
3 渲染滤波器(Render Filter)在整个链条的最后部分。它们接受数据并将它呈现给用户。比如,视频实现在显示器上绘制视频桢;音频实现将数据送往声卡;写文件滤波器将数据写入文件。
4 劈分滤波器(Splitter Filter)将一个输入劈分成两个或多个输出,通常是沿着路线解析输入流。例如,AVI劈分滤波器将字节流解析成独立的视频和音频流。
5 混合滤波器(MUX Filter)获取多个输入并将它们结合成单个的流。比如,AVI Mux执行AVI Splitter的反向操作。它获取音频和视频流并且产生一个AVI格式的字节流。

    这几个类别间的区别不是绝对的。比如,ASF读滤波器就可以同时扮演Source Filter和Splitter Filter的角色。
    所有的DirectShow滤波器都提供IBaseFilter接口, 所有的针(pin)都提供IPin接口。DirectShow也定义了一些其他接口来支持特殊的功能。

关于滤波器图形管理器

    滤波器图形管理器(Filter Graph Manager)是一个在滤波器图形中控制滤波器的组件,它执行了许多包括下面的函数:
1 协调滤波器间的状态变化。
2 设置参考时钟(Reference Clock)。
3 向应用程序传递事件
4 向应用程序提供构建滤波器图形的方法。

    这里简要地介绍一下这些函数。详细内容可以在本文档的其他部分获得。

    状态变化(State Changes)滤波器间状态变化必须以一定的次序发生。因此,应用程序并不直接发送状态变化命令给滤波器。而是给滤波器图形管理器发送一个命令,管理器在将这个命令发送个滤波器。查询工作也有类似的方式:应用程序发送查询命令给管理器,管理器再把它发送给滤波器。
    参考时钟(Reference Clock).在图形中的所有滤波器都是用同一个时钟, 叫做参考时钟。这个时钟假设所有的流都是同步工作的。视频和音频流实现的时间被称作表达(presentation)时间.表达时间可以相对于参考时钟被测量出来。滤波器图形管理器选择的参考时钟或者在声卡上,或者是系统时钟。
    图形事件(Graph Events).滤波器图形管理器使用事件队列来通知应用程序滤波器中发生的事件。这个机制和Windows信息循环(Windows Message Loop)类似。
    图形构建方法(Graph-building Methods).管理器为应用程序提供为向图形增加滤波器,滤波器间的连接与断开的方法。
滤波器图像管理器没有处理的一个函数是从一个滤波器向另外一个移送数据。这个工作用滤波器通过他们的针连接自己完成。这个过程通常发生在独立的线程中。

注意
    滤波器经常与管理器一起驻留在同一个进程中,并且通过进程内服务器被调用,因此在滤波器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值