DirectShow FAQ翻译

来源:互联网 发布:mac可以玩的网游 编辑:程序博客网 时间:2024/04/28 14:16

原文地址:http://msdn.microsoft.com/en-us/library/dd375463(v=VS.85).aspx

ps:个人感觉翻译这个官方FAQ纯属无聊之举,网上DirectShow的入门文章多如牛毛,我为什么偏偏要看这个MSDN的文档呢。。。

 

—————————我也来分割线—————————————————

 

这篇文章解答了很多关于Micorsoft DirectShow的常见问题。

 

DirectShow支持哪些操作系统?

DirectShow支持Windows95以后的操作系统.

 

使用DirectShow编程需要了解多少COM的知识?

开发应用程序,你需要了解COM对象的基本知识:如何进行初始化,访问它们的接口,管理这些接口的索引计数。Filter开发需要了解更多的COM知识。

 

DirectShow支持哪些格式?

参考Supported Formats in DirectShow.

 

有没有一个DirectShow硬件兼容列表(HCL)?

没有。如果设备允许,DirectShow会使用Microsoft DirectDraw和Microsoft DirectSound。 如果没有可用的设备, DirectShow使用GDI函数描绘视频,使用waveOut *多媒体API函数播放音频。

 

 

我可以使用什么语言开发DirectShow应用程序?

DirectShow主要是为C++开发设计的。 DirectShow API一小部分子集开放给Visual Basic 6.0; 不过这个功能已经被弃用了。

 

以后可以使用托管代码使用DirectShow吗?

Microsoft目前没有计划开发DirectShow API的托管代码。

 

DirectShow开发需要什么编译器?

只要正确配置编译器的环境参数,任何能够生成COM对象的编译器都可以。

 

DirectShow和Microsoft DirectX是什么关系?

从内部来说, 如果硬件支持,DirectShow会使用DirectSound和DirectDraw。 Video Renderer和Overlay Mixer filters使用DirectDraw 3和DirectDraw 5 surfaces。 Video Mixing Renderer 7 (只限于Windows XP)使用 DirectDraw 7 surfaces。Video Mixing Renderer 9和Enhanced Video Renderer使用最新的Microsoft Direct3D API。 编写DirectShow应用不需要使用其他的DirectX API, DirectShow会在内部进行调用。

 

DirectShow和Microsoft ActiveMovie是什么关系?

ActiveMovie是DirectShow的最初使用的名称。 现在ActiveMovie这条术语已经不在使用了。

 

工具GraphEdit有源代码? 它可以重分发吗(redistributable)?

没有,Graphedt.exe不能重分发。

 

DMO是不是取代了DirectShow的filter?

Microsoft DirectX媒体对象(DMOs)可以在DirectShow应用程序中使用。 对于encoder,decoder,还有effect, 推荐使用DMO取代DirectShow filter. (注意: 如果你要在你的decoder里面使用 DirectX Video Acceleration,你必须使用filter。) 对于其他用途,DirectShow filter可能会更合适。 要了解有关DMO的更多信息, 参考DirectX Media Objects.

 

我使用Windows媒体播放器播放一个AVI格式的文件时,可以听到声音但是看不到任何影像,都是黑的。这是怎么回事?

可能这个文件编码时使用的codec没有安装在你的系统里。虽然AVI的文件格式很常见, 但是AVI文件可以使用许多不同的压缩格式(codecs)。 如果你播放的AVI文件使用了你的系统不支持的codec, 你就可能只听到声音, 视频显示为黑屏或者屏幕上的内容不会改变。

注意:  如果一个codec没有安装在你的系统,Windows Media Player通常就会试图下载并安装。

 

我要如何构建我的应用程序?我需要哪些库文件和头文件?

参考Setting Up the Build Environment.

 

GraphEdit列出了许多文档里面没有提到的filter。 这些filter都是些什么东西?

GraphEdit会列出所有在你系统里面注册的filter,它们都保存在一个filter目录。 这些有的是由第三方的应用程序安装, 有的由Microsoft的应用程序安装, 比如Windows Media或者NetMeeting。 还有就是, 有一些DirectShow filter作为codecs或者硬件设备的wrapper, 每种codec或者设备看起来就像是一个单独的filter。 NetMeeting所使用的Microsoft H.263 Video Codec在DirectShow里面已经不被支持。 要了解更多的信息, 参考Enumerating Devices and Filters.

 

编程建立graph的时候遇到一些麻烦.

首先尝试在GraphEdit里面构建filter graph。 这个工具可以让你快速的模拟多种可能性。在源代码里构建graph之前最好先在 GraphEdit进行测试。要了解更多构建graph的信息,参考下列文章:

  • Building the Filter Graph
  • Enumerating Objects in a Filter Graph

 

我怎么判断指定的电脑上有没有安装DirectShow?

调用CoCreateInstance 建立一个Filter Graph Manager实例。 如果调用成功, 就说明DirectShow已经安装好。 代码如下:

 

 

 

 

如何不通过属性页改变一个filter的设置?

大部分filter都会为属性设置开放一个或者多个接口。 在参考页面上查看相关的filter (参考DirectShow Filters)。

 

我可以用GraphEdit测试我的filter吗?

如果你在开发一个filter, GraphEdit 能够图形化的显示各个filter的连接。 它也能够对filter的功能进行一个快速的测试。 不过,这并不意味着它就是一个健壮的测试平台。

 

filter运行在什么系统级别?

Filter运行在ring 3,不过一些filter控制的流设备运行在ring 0。 要了解更多的信息,参考 How Hardware Devices Participate in the Filter Graph.

 

我需要使用内核调试器吗?

这取决于你的项目。 安装DirectX的debug运行时库意味着你安装了debug驱动和其他的内核模式模块,一旦你的应用程序引发了这些模块中的debug断言,你的机器就会自动重启,除非你在你的进程上挂载了内核调试器。

 

在调试器里运行我的程序时,它崩溃了。

有些解码器并没有设计在调试器中工作。尝试在调试器外运行程序。

 

宏DEFINE_GUID macro怎么用?

DEFINE_GUID 解决了在代码中使用extern对GUID引用的问题。 比如, 假设你的工程有三个源文件, Src1.cpp, Src2.cpp, and Src3.cpp, 三个文件都使用了你定义的一个GUID值。 这个GUID值只能在你的工程中定义一次,其他的源文件都必须使用extern对它进行引用。 而使用DEFINE_GUID 宏, 只要一个头文件就能同时用于定义和引用。在头文件中这样声明GUID:

 

 

(例子里面值都是0,记得使用真正的值。) 你可以使用工具Guidgen.exe产生新的GUID然后在头文件中转化为DEFINE_GUID 定义的格式。 在用的这个GUID每个源文件中包含这个头文件。 在其中一个源文件中包含头文件Initguid.h,要放在你自己的头文件的前面。 比如:

 

如果没有包含Initguid.h头文件, 宏DEFINE_GUID 会为GUID值建立一个extern引用。 如果包含了头文件Initguid.h, 它就会重新定义宏 DEFINE_GUID ,为GUID值进行定义声明。

 

如果所有的头文件都没有包含Initguid.h, 你就会碰到一个链接错误 "unresolved external symbol" 。 如果你为同一个GUID值包含了两次Initguid.h, 你就会碰到一个编译错误 "redefinition; multiple initialization"。 要解决这些错误, 就要保证只包含了一次Initguid.h。 另外, 不要在预编译头文件中包含Initguid.h, 因为每个源文件都使用了预编译头文件。

相关主题

Introduction to DirectShow

 

 

Build date: 8/31/2010

 

 

原创粉丝点击