ccc译自DirectX的DirectShow--Get Start (2001.8.20)
DirectX是关于多媒体编程的环境(SDK).DirectShow是关于Windows媒体捕捉与播放的编程环境(SDK).
DirectShow
微软DirectShow应用编程接口(API)是微软窗口平台上的流式媒体体系结构。
使用DirectShow,你的应用可以高质量的视频、音频回放和捕捉。这本
DirectShow资料分以下章节进行叙述:
DirectShow 介绍
开始使用
关于DirectShow
使用DirectShow
编码器的开发
DirectShow指南
DirectShow参考
DirectShow样例
DirectX媒体对象
媒体参数
附录
术语表
注意:图标表示微软站点外的一个URL连接。绝大多数这些外部连接都不在
微软的控制之下。关于其他站点,请阅读微软的官方声明。
DirectShow简介
微软DirectShow是微软Windows平台上的流式媒体体系结构。DirectShow提供媒体流的高质
量的捕捉与回放。它支持多种格式,包括高级流格式(ASF),活动图片专家组格式(MPEG),
音频-视频交叉格式(AVI),第三层MPEG格式(MP3)和WAV文件格式。他也支持使用Windows
驱动模型(WDM)设备或老的Windows视频设备的捕捉。DirectShow与其他DirectX技术集成于
一体,自动感觉和使用视频和音频硬件加速,同时也支持没有硬件加速的系统。
DirectShow简化了媒体回放,格式转换和捕捉任务。同时,他还为要求客户方案的应用提供
对潜在的流控制体系的访问。你还可以建立自己的DirectShow控件以支持新的格式和客户效
果。
你可以用DirectShow写的典型应用包括DVD播放,视频编辑应用,AVI到ASF转换,MP3播放和
数字视频捕获应用。
DirectShow是基于控件对象模型(COM)的。要写DirectShow应用,你就必须理解COM客户编
程。就绝大多数应用而言,你不必实现你自己的COM对象。DirectShow提供了你需要的控件。
(如果你想要通过写自己的控件来扩展DirectShow的功能,你必须把他们作为COM对象来实
现。)
这一节包含下面的题目。
路标(Roadmap)
DirectShow中的新东西
DirectShow支持的格式
DirectShow的FAQ
路标
这一节描述微软DirectShow资料是如何组织的。
如果你以前有DirectShow的使用经验,读DirectShow中的新东西一节。他描述了微软DirectX 8中
包含的新特征。
如果你是DirectShow的新手,从这一节开始。然后阅读这篇文章,使用DirectShow来写各种应用
(如回放,捕获或DVD)关于DirectShow体系的更多细节信息请参阅关于DirectShow一节。
如果你感兴趣与写视频编辑应用,你可以从DirectShow编辑服务的介绍性素材入手,并且然后阅
读这份资料后的其他部分。
在过去,要实现客户数据的转换,你必须写一个DirectShow的滤波器。现在,你可以通过写
DirectX的媒体对象以简单的方法完成相同的任务。请阅读DirectX媒体对象以获得更多信息。(
你仍然可以写DirectShow滤波器。参见写DirectShow滤波器一节。)
下面各节介绍DirectShow的信息
从此处开始
介绍DirectShow应用开发。描述基本概念并介绍一系列简单应用以使你开始DirectShow编程。如果
你是DirectShow的新手,仔细阅读这一节。
关于DirectShow
提供关于DirectShow体系结构的高级背景信息,以及应用开发主题如构件图表。
使用DirectShow
含有写DirectShow应用所必须的信息。围绕这个主题的各节都围绕特定的应用领域而组织,如视频
捕获,DVD回放,数字视频和视频编辑。
解码器开发
含有写软件解码器开发者有用的信息。
DirectShow指南
含有关于DirectShow应用编程的逐步指导。这一节描述了一定数量的基本任务,这些是在写
DirectShow应用时必须了解的,如设备的枚举。
DirectShow参考
包含完整的DirectShow应用编程接口(API)的参考。他也包含了DirectShow提供的滤波器资料。
DirectShow样例
描述这个SDK中包含的应用和滤波器样例。
DirectX媒体对象
DirectX媒体对象(DMOs)是一种写数据流控件的新方法。就象DirectShow滤波器一样,DMOs取
得输入数据和使用它来产生输出数据。然而,DMOs比DirectShow滤波器更容易建立,测试和使用。
媒体参数
媒体参数是一个新的APIs集合,他支持运行时对对象特征的改变。他们提供迅速变化的和要求高
性能和可重复性特征的精确控制。
附录
含各种技术信息,包括排错信息,用C写DirectShow应用的信息,国家/地区码,和废旧特性列表。
素语表
定义DirectShow中使用的素语和概念。
--------------------------------------------------------------------------------------
DirectShow中的新东西
这篇文章描述了微软DirectX 8.0中关于DirectShow的新特征。
对Windows媒体格式的支持
DirectShow编辑服务
新的DVD支持
新的MPEG-2传输和节目流支持
微软TV技术(广播驱动体系结构BDA)
DirectX视频加速
新的滤波器
新的滤波器图表特征
关于构建环境的改变
新的图表编辑特征
DirectX媒体对象
媒体参数
对Windows媒体格式的支持
有两个新的滤波器允许DirectShow应用程序读写微软Windows的媒体格式文件。ASF阅读滤波器读
出并分析Windows媒体格式文件。ASF写入滤波器书写Windows媒体格式文件;它也做一些必要的
复用与压缩。DirectShow和Windows媒体软件开发工具提供关于建立和回放Windows媒体格式流的
应用程序的补充说明。关于更多信息请参见Windows媒体应用一节。
DirectShow 编辑服务(DES)
DirectShow 编辑服务是一组支持视频编辑和顺序视频回放的API函数。你可以使用DES来建立各种
应用程序。例如,仅用几个方法调用,就可以顺次集成音频和视频的剪裁、增加效果,和回放其
操作结果。或者,建立一个完整的视频编辑系统。DES是构建于DirectShow体系内核之上的。他提
供了为非线性视频编辑特别设计的接口集。
DES取代了不再被支持的裁剪列表。
新的DVD支持
两个新的接口IDVDControl2 和 IDVDInfo2极大地扩展了DVD导航器的功能。其新的MSWebDVD ActiveX
控件使这些功能对基于脚本的应用也是可用的。新的DVD特征包含下面的功能:
支持多声道的卡拉OK功能
关于S/PDIF输出的AC-3支持
通过IBasicAudio接口进行音量控制
支持帧步进和帧精确寻找
简化对DVD文字信息串的访问
改进对父进程管理控制的支持
就更多信息,请看DirectShow的DVD应用开发一节。
新的MPEG-2传输和节目流支持
一个新的滤波器,MPEG-2多路选择器,在推送模式下(从活动源接受数据)提供对MPEG-2传输流
和节目流的支持。更多信息请看MPEG-2多路选择器和写数字TV应用一节。
微软TV技术(广播驱动体系结构BDA)
微软TV技术包括对新的广播驱动体系(BDA)和微软调谐模型的支持。广播驱动体系定义一种框架,这种框架
支持用于接收数字和模拟电视的各种拓扑构成。他包含了用于网络构造和控制的软构件,多路选择,表分析
和IP数据递送以适用于主要的数字TV标准包括DVB和ATSC。调协模型是一个对象集,他允许应用以一种简单和
一致的方法跨各种网络类型容易地进行调谐。更多信息请看写数字TV应用一节。
DirectX视频加速
对译码器的开发者:DirectX视频加速是一个应用编程接口(API),对于数字视频译码处理的硬件加速
相应的也是一个设备驱动器接口(DDI),他还具有对DVD子图目的的α混响支持。它提供了聚焦于支持
MPEG-2主要视频(形式上有ITU-T H.262 , ISO/IEC 13818-2)的接口定义。它也企图支持其他关键的
视频解码(即:ITU-T 推荐的 H.263 and H.261, and MPEG-1 and MPEG-4)。更多信息请看DirectX视
频加速一节。
新的滤波器
DirectShow包含几个新的滤波器:
ASF书写器: 写Windows 媒体格式文件。
ASF阅读器: 读和分析Windows媒体格式文件。
MJPEG解压器: 解码视频流从动态JPEG到非压缩视频。
MJPEG压缩器: 使用动态JPEG压缩方法压缩一个非压缩的视频流。
MPEG-2多路选择器:多路选择MPEG-2传输和来自活动源节目流。
空回扫器: 放弃没有显示或扫描采样数据的采样。应用可以使用这
个滤波器来放弃来自流的数据。
强行采样器: 恢复媒体采样就象它们实际通过滤波器图表一样。应用
可以使用这个滤波器来获得中间帧或其他媒体数据。
新的滤波器图表特征
滤波器图表管理支持几个新的特征:
动态图表构建。现在你可以在图表正在运行期间产生对滤波器图表的改变。以前
要增加或删除滤波器,应用必须停止图表的运行,此时要中断数据流。更多信息
请看动态图表构建。
活动源同步。DirectShow现在支持活动源同步。例如,活动音频流可以与一个活动
视频流同步。更多信息请看DirectShow中的时间和时钟一节。
帧步进。滤波器图表管理曝露了新的IVideoFrameStep接口,他允许应用一次一帧地
遍历一个视频文件。
关于构建环境的改变
一个新的头文件DShow.h替换了以前的Streams.h头文件。
基于类的滤波器现在出现在SDK根目录的/Samples/BaseClasses目录下要使用他们,
你就必须构建这个基于类的库并且将他们连接到你的工程中。更多信息请看使用基
于类的DirectShow一节。
新的图表编辑特征
图表编辑包含一些新的特征,他们作为检测和排错工具,增强了图表编辑的用途。
“图表侦测”:现在图表编辑可以加载由外部过程建立的滤波器图表。用这个特征
实际的查看你的应用构建的是什么滤波器图表,在你的应用中仅仅有最少量的附加
代码。更多关于这个特征的信息请看加载外部过程的图表一节。
滤波器信息:当你从图表菜单中选择插入滤波器时,滤波器列表中现在包含了每一
个滤波器的注册信息,包括优点,连接数,和每一个连接的注册类型。要查看这些
信息,单击观察树中滤波器后的加号(+)即可。
关于图表编辑的更多信息请看用图表编辑仿真图表构建一节。
DirectX媒体对象
DirectX媒体对象(DMOs)是一种新的写数据流部件的方法。如DirectShow滤波器一样,DMOs取得
输入数据和用它产生输出数据。然而,DMOs应用编程接口比相应的DirectShow的APIs要简单得多。
因此,DMOs比DirectShow滤波器更容易建立,测试和使用。
DMOs是完全与DirectShow兼容的。当你需要DirectShow提供的服务时,你可以象使用滤波器一样使
用DMOs。如图表同步,智能连接,自动数据流处理,和线程管理。然而,DMOs不需要滤波器图表,
所以,应用可以使用DMOs而不使用DirectShow。
更多信息请看DirectX媒体对象一节。
媒体参数
媒体参数是一个新的APIs集。他支持运行时改变对象特征。他们提供对特征的精确控制,如特征的
迅速改变和对高性能和可重复性的要求。他们允许特征沿实际曲线实时变化,如正玄波形或反平方
曲线等。
使用媒体参数,数据转换对象可以支持控制运行时行为的标准接口。对于音频效果DMOs和滤波器他
们特别有用。例如,在显示效果中,潮湿(处理过的)信号对干燥(未处理)信号的比率可以沿一
条平滑曲线变化。这种类型的行为在音频工程中是极其危险的,要避免在录音中人工引用。
更多信息请看媒体参数一节。
------------------------------------------------------------------------------------------
DirectShow支持的格式
DirectShow是开放体系结构的,也就是说他可以支持任何格式,只要这个格式有其滤波器进行分析和
解码即可.微软所提供的滤波器,或者是随DirectShow发布的或者是作为Windows操作系统部件发布的
都提供了对下面文件和压缩格式的默认支持.
注意:星号(*)表示DirectShow应用必须使用Windows媒体格式(SDK)来支持这种格式.更多信息请看文章
Windows媒体和DirectShow:基于Windows的媒体应用的选择.
文件格式:
Windows媒体音频(WMA)*
Windows媒体视频(WMV)*
高级流格式(ASF)*
运动图片专家组(MPEG)
音视频交互格式(AVI)
QuickTime (版本2或更低)
WAV
AIFF
AU
SND
MIDI
压缩格式:
微软Windows媒体视频编解码版本7.0*
ISO MPEG-4视频版本1.0*
微软MPEG-4版本 3*
Sipro Labs ACELP*
Windows 媒体音频*
MPEG 音频层-3 (MP3) (仅解压缩)
数字视频(DV)
MPEG-1
MJPEG
Indeo
Voxware*
Cinepak
微软并不提供MPEG-2解码器,有几个来自第三方的DirectShow兼容硬件和软MPEG-2解码器是可用的.
就发布DirectShow应用而言,关于特殊的第三方编解码器的可用性,请联系编解码器生产商.
-----------------------------------------------------------------------------------------
DirectShow的FAQ(快速问题解答)
这篇文章回答经常询问的关于WindowsDirectShow的问题.他包含下面个节:
一般问题
编程问题
一般问题
什么样的操作系统支持DirectShow?
支持DirectShow的操作系统有:微软的Windows 9X,微软的Windows 2000,和微软的Windows Me.
需要多少控件(COM)知识进行DirectShow编程?
对应用开发而言,你需要理解COM对象的基本工作原理:怎样实例化,怎样访问他们露出的接口,和怎样
适当地管理这些接口的引用记数.滤波器开发者可能要求更多一点的COM知识.更多的信息,请看这个
帮助文件中,在DirectX 8.0介绍一章下的用C/C++进行DirectX编程这个主题.
DirectShow支持什么格式?
请看DirectShow所支持的格式一节.
有DirectShow硬件兼容性列表吗?
没有.DirectShow使用微软DirectDraw和微软DirectSound硬件能力,如果他们是可用的.当没有特别的
可用硬件时,DirectShow使用GDI来画视频和波表输出媒体APIs进行音频播放.
写DirectShow应用可以使用什么语言?
DirectShow初始为C++开发而设计.(也可以使用C)用微软的VB,你可以DirectShow API的一个大子集
但是,对VB的支持是不完整的.DirectShow支持基于脚本的DVD应用,脚本可以使用微软的JScript或VB
进行编辑.使用Borland Delphi写DirectShow应用也是可行的;然而,在这部SDK资料中不能找到这个
主题.
更多的信息请看下面一些主题:
用C控制滤波器图表
在VB中使用DirectShow
写基于脚本的DVD应用
进行DirectShow开发需要什么样的编译器?
任何能够生成部件对象模型的编译器都应该能行,只要编译器环境正确地构造即可.如果你使用了
微软VC++以外的编译器,你就需要重构基本类库,因为编译器之间有差异.
DirectShow怎样关联到微软Windows媒体?
参见Windows媒体应用一节.
DirectShow怎样关联到微软DirectX的其他控件?
内部上讲,当硬件支持的时候,DirectShow使用DirectSound 和 DirectDraw.(视频扫描使用
DirectDraw 7的表面.他并不使用新的微软Direct3D的APIs.)你并不需要使用其他的DirectX APIs
来写DirectShow应用,尽管他可能结合了DirectX APIs.作为例子,请查看Texture3D样例应用.
DirectShow的前一个版本是 6.0.他开始封装了DirectX 媒体 SDK.当DirectX 媒体SDK受到抨击时,
DirectShow被拿到DirectX SDK中.因此,DirectShow的版本号从6.0 跳到 8.0.
DirectShow怎样关联到微软的ActiveMovie?
ActiveMovie是DirectShow初期的名字.ActiveMovie术语以后不在被使用.
DirectShow仅限制于多媒体应用吗?
DirectShow包含的默认控件是为多媒体而设计的.然而,DirectShow体系对其他数据流方案也是有
用的.
GraphEdit实用源是可用的吗?GraphEdit可不可以再发布?
不,这个源是不可用的,并且Graphedt.exe不能再发布.
DMOs代替DirectShow滤波器行吗?
微软DirectX媒体对象(DMOs)可用于DirectShow应用中.对编码,译码和效果,我们鼓励写DMO,而不是
DirectShow滤波器.对于其他目的,DirectShow滤波器可能更为合适.更多信息请参见DirectX媒体对
象.
在那里可以获得更多信息?
Web网:MSDN DirectX开发者中心
电邮列表:http://discuss.microsoft.com/archives/DIRECTXAV.html.
一部分其文字显示如下:
这个列表的主要功能是提供一个论坛,在此论坛上,使用微软音频和流式媒体技术
(DirectSound, DirectMusic, DirectShow)的开发者和内容提供者可以交换信息
和想法.这个列表可以满足各层次DirectX专家的需要,无论他是初学者或是高级
开发人员.
我们期望微软DirectX各个开发小组的成员回顾和讨论列表中的主题,DirectXAV并
不打算成为微软支持的论坛并且也没有微软职员直接响应咨询的保证.通常你最好
的帮助来源应该是DirectXAV社团的其他成员,他们在过去曾经遇到过类似的问题.
对于这个列表,所包含的适当的主题是:使用DirectMusic生成器的合成技术;音频,
音乐和流式视频编程技术;声音设计技术;关于相关APIs的一般问题和信息;代码片
段;建议;提示和暗示;设备驱动器品质;未来特征需求;使用APIs的实在经验等.
要订阅DirectX DEV,发送包含订阅directxdev信息体的的电邮到:
LISTSERV@discuss.microsoft.com
要订阅DirectX A/V,发送包含订阅directxav信息体的电邮到:
LISTSERV@discuss.microsoft.com
UseNet: microsoft.public.multimedia.directx.dshow.programming
在开发滤波器应用中我遇到了一个难题.在哪里我可以得到对开发者的支持?
你应该与DirectX SDK支持联系,以获得明确的开发者支持信息:
对DirectX SDK的支持,打电话给 (800) 936-5800.如果你是MSDN的订户
你就可以享受MSDN的支持(一次MSDN订阅4次免费支持或如果你与微软有
一个合同,你的支持就是免费的).否则,这个服务要有一个费用.更多信息
参看MSDN在线支持主页.
你还可以通过付费电话900-555-2300或经由WEB http:
//support.microsoft.com/support/webresponse.asp
提交问题.
有没有译本好的解释DirectShow的书籍?
目前,DirectShow并没有他自己专门的书籍;然而,在一些DirectX依存在的书中有对DirectShow的
讨论,他们包括:
Sams Teach的《24小时自学DirectX》由Robert Dunlop,Dale Shepherd
,和Mark Martin (Sams)合著.
《DirectX, RDX, RSX,和MMX技术》由Rohan Coelho和Maher Hawash (Addison
Wesley)著.
DirectX, RDX, RSX, and MMX Technology by Rohan Coelho and Maher
Hawash (Addison Wesley)
尽管在这些书中提到了DirectShow,但是,最好的信息资源是随DirectX SDK一起提供的DirectShow
资料集和样例代码.
怎样与微软联系获得反馈信息和bug报告?
一般DirectX问题的地址是directx@microsoft.com.而bug报告的发送地址是dxbugs@microsoft.com.
我有一些关于微软可能改进DirectShow的想法.
微软欢迎建议,问题和注释.让我们知道你是怎么想的.我们有哪些缺陷?你最喜欢看到在哪些领域的
改进?你最喜欢看到什么类型的指导和样例?你的提议将帮助我们优化未来的工作.如果你有属于新
的DirectShow资料的问题和意见,请发送信息到askdshow@microsoft.com.
我正在用Windows媒体播放器播放AVI格式的文件.我可以听到声音,但是,没有任何视频--代之的是
看到黑屏.什么地方错了吗?
可能是这个文件用了一个你系统中不存在的编码解码器编的码.虽然AVI文件的格式是通用的,AVI文
件可以用许多不同的编解码器产生.如果你试图播放一个使用不支持的编解码器产生的AVI文件,你
可能只会听到声音部分,而视频将显示黑屏或屏幕内容保持不变.
注意:Windows媒体播放器通常都努力下装和安装你系统中不存在的编解码器.
包含在Windows 2000中的一些公共的编解码器有Radius Cinepak, Duck TrueMotion, Intel Indeo,
微软的RLE和微软的Video 1.要查看Windows 2000系统中的视频编解码器列表,做如下操作:
打开控制面板.
单击声音和多媒体.
单击硬件表.
选择视频编解码器.
单击属性.
单击属性表.
我怎样才能知道一个媒体文件使用了什么编解码器?
做下面操作:
右击文件探测器.
单击属性.
单击概要表.
编程问题
========
怎样构建一个应用?我需要什么样的库和头文件?
参看设置构建环境.
图表编辑显示许多没有文献的滤波器.这些滤波器是什么?
图表编辑枚举了滤波器库中所有在系统中注册的滤波器.这可能包含了由第三方应用或其他微软
技术所安装的滤波器,例如Windows媒体.另外,有些DirectShow滤波器作为编解码器或硬件设备
的外壳与编解码器或表现为显式滤波器的设备一起活动.就更多信息,参见枚举设备和滤波器一节.
我在通过程序添加和连接滤波器构建客户图表时遇到了麻烦.我怎样才能获得帮助?
首先试着用滤波器图表编辑器(GraphEdit)构建每一步操作.这个工具将允许你快速处理各种可能
和纠正看到的问题.在用源码构建图表之前,GraphEdit总是构建它的最好方法.
附加信息:当你想要在源与视频扫描器之间做智能连接时,你要指示DirectShow将一个滤波器集插
入到源与扫描器之间,这才能做正确的媒体类型转换.源滤波器有一个输出,其中包含了音频和视频.
因而,需要加入一些滤波器将音频和视频分解(多路分解)成不同的流.你所需要做的就是连接音频
补偿器到多路分解器的音频脚上.与源的媒体类型相关,使用的多路分解器可以是几个滤波器中的
一个.对于AVI,AVI的分解器做此工作.对MPEG2,是MPEG2分解器或MPEG-2多路分解器.如果你使用的
是智能连接,你必须找到一个多路分解器,找出他的音频脚,和连接他到补偿器.
如果你想要容易的方法:
加入你的源滤波器
加入你所有的应用指定的补偿器
调用输出脚上的补偿器
当你的图表中已经有一个输出类型的补偿器时,这样做等价于进行连接,但是,如果没有,则将加入这
个补偿器.所以你必须确认音频和视频的连接.
怎样感觉是否DirectShow安装在给定机器上?
调用CoCreateInstance建立滤波器图表管理器实例.如果这个调用成功,DirectShow就安装在这台机
器上了.下面的代码给出了这样做的方法:
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
在不显示特征页时怎样改变滤波器的设置?
绝大多数滤波器暴露多个接口以便设置滤波器的特征.参看关于滤波器问题(参看滤波其一节)的参
考页.
我为什么不能使用ASF书写和阅读滤波器?
在建立软件应用时,你必须提供软件授权证书.更多信息请看"DirectShow建立ASF文件"和"Windows
媒体格式SDK"一节.另外,在GraphEdit中,你不能使用这些滤波器.
DirectShow能按基本规则向应用通报他当前的回放位置吗?
没有位置的回调通报.使用定时器和使用IMediaSeeking::GetCurrentPosition方法恢复当前位置.
我写了一个滤波器,怎样安装他?
参看怎样注册DirectShow滤波器一节.
我能用GraphEdit测试滤波器吗?
正在开发滤波器时,GraphEdit可以帮助你显现滤波期间的连接.他也可以进行快速的滤波器功能测
试.然而,这并不能说明他是一个完备的测试平台.更多信息请看"用GraphEdit仿真图表构建一节.
怎样确定滤波器接脚数目?
调用IBaseFilter::EnumPins方法,然后调用IEnumPins::Next方法,知道他返回非S_OK.更多信息请看
滤波器图表中枚举对象一节.
在什么样的授权层上滤波器运行?
滤波器运行在层3上,有些滤波器控制流设备运行在层0上.更多信息参见滤波器图表一节中的硬件设备
怎样分区.
ccc 译自directx帮助文档 msdn.microsoft.com/directx