DirectShow技术描述与应用
―――释雪
DirectShow是我最早接触一项微软技术,比COM技术还早,真不知道当时我是怎么学的。DirectShow是一个基于COM组件技术的多媒体控制组件。它能够进行媒体的捕捉、格式转换以及播放等等功能。实际上,MediaPlayer就是在DirectShow基础上搭建起来的。功能可以说非常的强大。此次我将DirectX 8.1中的DirectShow的使用说明部分翻译出来,与大家分享。出于个人英语水平,必有错译及误漏之处,还请不吝指正,于此万谢。[email protected]
DirectShow系统概述
多媒体面临的挑战:
现今多媒体技术主要面临的技术有如下几点:
1.多媒体数据流一般包含了很大的数据信息,如何才能更好处理这些数据。
2.由于音频与视频必须同步播放,那么就需要解决它们如何同时开始和停止,并且拥有同样播放速率(rate)。
3.数据流可以来自很多地方,如本地文件,网络,电话广播和数码相机等。如何解决它们,使能够同样地播放和处理。
4.数据流可以是不同的格式,如AVI,ASF还可以是MPEG等。如何解决它们,使能够同样地播放和处理。
5.在实施程序设计时,并不了解使用者的硬件配置与性能。如何使得应用程序具有机器无关性。
DirectShow解决方案
DirectShow设计初衷就是要解决以上所涉及到种种技术问题。它主要设计目的是简化建立基于Windows®平台的数字媒体应用程序的设计任务。并使它无需涉及数据传输,硬件通用性,媒体同步等等诸多复杂问题。
为了完成所需的音视频流的处理,DirectShow应用了DirectDraw®和DirectSound®技术。这些技术可以有效率将数据图像和音频还原(render)到用户的显卡和声卡上去。DirectShow通过压缩媒体流上的时间标记(time-stamped)来实现媒体同步重放。为了能够处理不同可能出现的数据源、数据格式以及硬件系统,DirectShow采用了一种标准化结构体系。在其中,应用程序可以混合和匹配不同被称为过滤器(filter,也有叫滤镜,我记得在Photoshop里见过。)的组件。
DirectShow提供的过滤器支持捕获和配置基于Windows驱动模型(Windows Driver Model)的设备。同样地,过滤器也支持视频捕捉卡和通过ACM和VCM接口进行编解码。
在DirectShow标准结构体系中,DirectShow过滤器与控制(control)、多样化的设备、本地文件系统、TV调频和视频捕获卡、VFW编码器、视频显示卡(通过DirectDraw或GDI、GDI+)和显卡进行交互(communicate,通信)。因而,DirectShow可以将应用程序与前面所列出的种种复杂性素进行隔离。DirectShow也为几种文件格式提供本地压缩和解压过滤器。
过滤器表(filters graph)及其组件
过滤器
过滤器是DirectShow最基本组成部分。一个应用程序可以通过将不同过滤器进行连接来实现附合特殊的要求媒体功能。
比如:
Async File Source可以读取本地文件。
TV Tuner 过滤器可以改变TV卡上的电视频道。
MPEG-2 Splitter过滤器从MPEG-2数据流分解出音视频数据。
虽然,每一个过滤器都有它自己特殊的功能,但应用程序可以用同样的语法来访问它们,所有的过滤器都支持IBaseFilter接口。
大多数的过滤器都可以被以下几大类:
源过滤器在处理时提供未加工的数据(raw data,源数据?)。它可以从本地文件、DVD光盘、电话卡、捕获卡、数码照机或者其它数据源中取得数据。
转换(transform)过滤器接受从其它过滤器传来的数据,处理它并传给下一个过滤器(第三方过滤器,a third filter)。转换过滤器一般有这几种:解析,将未加工的字节流并转换成有意义的(meaningful)媒体数据;编码与解码,在压缩数据与解压缩数据之间进行转换;分解(splitters),将一个数据流分成两个或多个数据流;混合,将几个数据流合并成一个数据流。
还原(renderer)过滤器从其它过滤器传来的数据,并播放它,或者是传递给其它硬件设备。这类过滤器还包括了那些负责将数据储存在储存器上的过滤器。视频还原使用DirectDraw来显示图像,默认音频还原使用DirectSound来播放音频。
DirectShow提供的播放、转换、捕获各种不同媒体格式的过滤器,可以在任何一种的Windows上工作。开发者也可以编写自定义的过滤器来完成自己所需求的功能。
过滤器表和过滤器表管理器
为了在DirectShow中完成各种任务,应用程序应当建立一个或者更多的过滤器并将它们连接在一起。所以数据从一个过滤器传递到下一个,从源过滤器一至到还原过滤器。工作在一起的一组过滤器叫做过滤器表。
过滤器表,我觉得将其认为是一组过滤器之间连接逻辑更为容易理解。
过滤器表本身并不是一个实在的(distinct)软件组件。然而,它是可以通过一个被称为过滤器表管理器的COM组件来管理的。在一些任务中,过滤器表管理器控制着过滤器表的状态改变,为所有的过滤器建立一个参考时钟,为过滤器和应用程序进行通信。过滤器表管理器可以自动为文件的播放建立一个合适的过滤器表,也可以建立表的某一个部分,从而减少应用程序的工作负担。
Note Filters always reside in the same process as the Filter Graph Manager. They are always loaded from in-process servers. Therefore, method calls are not marshalled between filters, or between filters and the Filter Graph Manager.
用术语来讲,过滤器表是一个直线的,非循环的,非连接的(non-connected)表:
直线的:数据必须按照预先设定好的唯一在过滤器移动。
非循环的:在过滤器表中不能有过滤器连接成环形。
非连接的:过滤器表是将过滤器串成链而不是连接。也就是说过滤器无法得知与它相连的是什么过滤器。每个过滤器都是各自封闭的。
针(Pins)
将一个过滤器连接到其它过滤器的点叫做针。每个针都是支持IPin接口的COM组件对象。针虽然使用COM引用计数,但是过滤器自己的针控制针的生存周期。过滤器可以实时(runtime)自动建立或销毁针对象。
每一个针都只有一个传递方向,即输入或输出。它必须与它相反的传递方向的针进行连接。(即只能输出针与输入针进行连接)。媒体数据通过针连接,总是从输出针到输入针。我们叫输入针的方向叫做下游,输出针的方向叫做上游。(一些的控制信息可以向上游方向移动)
当两个针连接时,必须提供连接的详细资料,如媒体类型、缓内大小和传输机制(被称为传输器)。如果其中有任意一个针拒绝连接,那么两个过滤器就无法交换数据。
媒体样本(sample)和媒体类型
当两个过滤器连接时,它们必须使用同一种数据类型。然后,上游过滤器将附合这种数据类型的数据通过过滤器的输出针输出,下游过滤器的输入针接受数据,进入处理。这样,确保下游过滤器可以处理它所接受的数据。在DirectShow中,数据类型是使用AM_MEDIA_TYPE结构进行描述,被称为媒体类型。每个针的连接必须确定一个媒体类型。一些针可以接受并行(a wide range?)的媒体类型,其它有限的几种类型。
一旦过滤器的连接被建立起来,上游的过滤器可以通过针的连接来发送数据给下游的过滤器,上游过滤器将数据打包成一个被称为媒体样本的COM对象。媒体样本支持IMediaSample或IMediaSample2接口。可以向里面添加实际媒体数据的媒体样本包含一个时间标识,用来说明样本的当前时间。
比较典型的,一个视频媒体样本包含一个图像帧,一个音频媒体样本可以包含几个音频样本。
过滤器自动地分配内存来建立一个包含媒体数据的媒体样本。
时钟
在播放媒体时,维持一个正确的播放速率是非常重要的。为了这个目标,每个媒体样本都携带一个时间标识,来说明所携带的媒体数据的时间。过滤器表管理器在整个表中维持一个时钏。这个时钟称为参考时钟,它所提供的时间称为参考时间。参考时间以千万分之一秒为单位(100 nanaoseconds。我算术算对了吧)
在一些过滤器表中,过滤器可以提供参考时钟。例如,音频还原过滤器通常可以用于基于声卡的精确时钟。如果没有过滤器可以提供时钟上,则过滤器表使用Windows系统时钟。
(待续...)
本文地址:http://com.8s8s.com/it/it2125.htm