DirectShow介绍

DirectShow介绍

1. DirectShow介绍
DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。
DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。
以下是几个使用DirectShow编写的典型应用:DVD播放器、视频编辑应用、AVI到ASF转换器、MP3播放器和数字视频采集应用。
DirectShow是建立在组件对象模型(COM)上的,因此当你编写DirectShow应用时,你必须具备COM客户端程序编写的知识。对于大部分的应用,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件,但是假如你需要编写自己的DirectShow组件,你还需要具备编写COM组件的知识。
1.1. DirectShow支持的格式
DirectShow是一个开放的框架,因此只要有合适的filter来分析和解码,它可以支持任何格式。DirectShow默认支持以下的文件类型和压缩格式:
注:打*号的需要Windows Media Format SDK支持
文件类型:
Windows Media? Audio (WMA)* 
Windows Media? Video (WMV)* 
Advanced Systems Format (ASF)* 
Motion Picture Experts Group (MPEG) 
Audio-Video Interleaved (AVI) 
QuickTime (version 2 and lower) 
WAV 
AIFF 
AU 
SND 
MIDI 
压缩格式:
Windows Media Video* 
ISO MPEG-4 video version 1.0* 
Microsoft MPEG-4 version 3* 
Sipro Labs ACELP* 
Windows Media Audio* 
MPEG Audio Layer-3 (MP3) (decompression only) 
Digital Video (DV) 
MPEG-1 (decompression only) 
MJPEG 
Cinepak 
微软自己没有提供MPEG2解码器,一些可用的DirectShow MPEG2硬件或软件解码器是由第三方提供的。
1.2. 常见问题集(摘录)
1.2.1. 一般问题
*DirectShow支持哪些操作系统?
DirectShow支持Windows9X、Windows2000、Windows Me和Windows XP。

*使用DirectShow需要多少COM知识?
应用程序开发者只需要基本的COM组件知识:实例化COM组件、调用接口、管理接口的引用计数。Filter开发者则需要更多。

*有与DirectShow兼容的硬件列表(HCL)吗?
没有。如果硬件兼容DirectShow,DirectShow会使用它们,如果没有兼容的硬件,DirectShow使用GDI绘制视频,以及使用WaveOut系列多媒体API来播放音频。

*可以使用哪些语言来编写DirectShow应用?
DirectShow主要为C/C++开发设计。Visual Basic只能使用其中的很小一部分。可以通过MS JScript或VB Script来支持基于脚本的DVD和TV应用。也可能用Delphi来编写,但SDK文档不提供这方面的内容。

*DirectShow会通过托管代码实现吗?
目前还没有这个计划。DirectX SDK提供了有限的使用音视频回放类的托管回放功能,你可以使用COM interop创建托管代码的DirectShow客户端应用,但是因为性能上的原因,不推荐创建运行在CLR上的filter。

*DirectShow开发需要什么样的编译器?
任何能够产生COM对象的编译器都可以。

*DirectShow和DirectX的其它组件的关系
DirectShow和DirectX的其它组件在内部进行联系。DirectShow在硬件的支持下使用DirectSound和DirectDraw。Video Renderer和Overlay Mixer使用DirectDraw 3和DirectDraw5表面(surfaces)。Video Mixing Renderer 7(只支持WINXP)使用DirectDraw7表面。Video Mixing Renderer 9使用最新的(目前是Directx9)Direct3D API函数。即便是某个应用程序包含了DirectX其它组件,你也不必使用其它组件的API去编写它。参考SDK的例子:Texture3D Sample。

*DirectShow与ActiveMovie的关系?
ActiveMovie是DirectShow原来的名称,现已不再使用,但是一部分API仍保留了"AM"的前缀,比如AM_MEDIA_TYPE和IAMVideoAccelerator。

*DirectShow是限于多媒体应用吗?
DirectShow默认包含的组件主要是为音视频流设计的,但是,DirectShow框架已经成功地用于其它数据流的解决方案中。

*GraphEdit工具有源码吗?GraphEdit.exe是否可再发布?
没有源码,不可再发布。

*DMO可以代替DirectShow filter吗?
在编写编码器、解码器、效果器应用时,鼓励用DMO代替DirectShow filter。在其它的应用中,使用DirectShow filter可能会比较合适。

1.2.2. 程序编写问题
*如何设置编译环境,需要哪些头文件和库?
参考"设置编译环境"章节

*GraphEdit列示了很多没有文档支持的filter,它们都是些什么?
GraphEdit枚举了所有作为filter类型注册在系统中的filter,包括由第三方应用程序安装的filter,以及其它微软技术如Windows Media或NetMeeting安装的,另外,一些DirectShow filter被用来做硬编码或硬解码驱动的外壳。Microsoft H.263 Video Codec用于NetMeeting,不再被DirectShow支持。

*如何知道DirectShow已经被安装?
调用CoCreateInstance创建一个Filter Graph Manager实例,如果成功,表示DirectShow已经被安装,下面是一个例子:

IGraphBuilder *pGraph; 
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);


*如果不通过属性设置页来更改filter的设置?
当然是通过filter提供的接口罗。如果没有提供,就没有办法啦

*DirectShow能通知应用程序当前回放位置吗?
不提供回调来通知位置,需要使用一个计时器定时调用IMediaSeeking::GetCurrentPosition方法来得到当前回放位置。

*filter运行在哪个特权级别下?
运行在Ring 3特权级别下,某些流控制驱动(如音视频采集驱动)运行在Ring 0特权级别下。

*需要一个Kernel调试器吗?
这依据具体的项目。安装DirectX调试运行时库(DirectX debug runtime library)意味着安装调试驱动(Debug driver)和其它核心组件(kernel mode component),因此如果你的应用程序在其中的某个组件中产生了一个调试断言(debug assert),你的机器就会自动重启除非你拥有一个kernal调试器。

*DEFINE_GUID宏是怎么工作的?
使用DEFINE_GUID宏可以让你通过包含同一个头文件来定义GUID值而不必使用extern关键词。比如,你的工程中有三个源文件:src1.cpp,src2.cpp,src3.cpp,它们都使用一个相同的GUID值,而为了保证一致性,这个GUID只能在你的工程中定义一次,这时,其它的源文件必须定义外部引用来使用它。用了DEFINE_GUID,你可以使用在所有源文件中包含同一个头文件,在头文件中这样定义GUID:

DEFINE_GUID(CLSID_MyObject, 
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

这个例子中GUID为0,实际编程中请用Guidgen工具来产生一个GUID,在其中的一个源文件中,在你的头文件前包含initguid.h,如:

// Src1.cpp #include #include "MyGuids.h" // Src2.cpp #include "MyGuids.h" // Src3.cpp #include "MyGuids.h"


在没有包含Initguid.h的地方,DEFINE_GUID宏创建外部引用来使用GUID值,在包含Initguid.h的地方,DEFINE_GUID重定义DEFINE_GUID宏以产生GUID的定义。
如是没有在任何地方添加Initguid.h,你会得到一个链接错误:"unresolved external symbol." ,如果同样的GUID包含Initguid.h两次,会得到编译错误"redefinition; multiple initialization."要解决这些问题,请确认Initguid.h只包含一次。同样的,不要包含Initguid.h到预编译头文件中去,因为预编译头文件会被每个源文件包含。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DirectShow 是由微软公司开发的一套多媒体应用程序编程接口(API),旨在为开发人员提供一种简便的方法来创建和处理多媒体的应用程序。DirectShow 提供了一整套的组件和过滤器,可以完成多种不同的功能,如音频和视频的捕捉、播放、编辑、编码和解码等。 DirectShow 开发指南是指为开发人员提供一份详细的文档或指南,以帮助他们成功地使用 DirectShow 进行应用程序开发。该指南通常包括以下内容: 1. DirectShow 的概述:指南将介绍 DirectShow 的基本概念和架构,包括组件模型、过滤器和数据流等内容。 2. 开发环境的配置:指南将提供如何配置开发环境,包括安装所需的开发工具和库文件,并设置项目属性等。 3. DirectShow 的基本使用:指南将教授如何创建一个基本的 DirectShow 应用程序,如图形用户界面(GUI)的设计、多媒体设备的选择和初始化等。 4. 多媒体数据的处理:指南将介绍如何使用 DirectShow 的组件和过滤器来处理多媒体数据,如音频和视频的捕捉、编辑、编码和解码等。 5. 故障排除和调试:指南将提供如何排除和解决开发过程中可能遇到的问题,并介绍一些常见的调试技巧和工具。 通过学习 DirectShow 开发指南,开发人员可以获得使用 DirectShow 开发应用程序所需的基础知识和技能。他们可以使用这些知识和技能来创建自己的多媒体应用程序,以满足用户的需求,并从 DirectShow 提供的强大功能中受益。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值