📄 转载:directshow 学习笔记(1) 独行客 天极blog.htm
字号:
style="TEXT-INDENT: 21pt"><STRONG>DirectSetup</STRONG>:主要提供自动安装DirectX组件的API功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectMusic</STRONG>:主要支持MIDI音乐合成和播放功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectSound</STRONG>:主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectShow</STRONG>:为Windows平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。</DIV>
<DIV style="TEXT-INDENT: 21pt"><STRONG>DirectX Media Objects</STRONG>:DirectShow
Filter 的简化模型,提供更方便的流数据处理方案。</DIV>
<DIV style="TEXT-INDENT: 21pt"> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">3</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的作用</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">DirectX软件开发包是微软公司提供的一套Windows操作平台上的开发高性能图形、声音、输入、输出和网络游戏的编程接口。它提供了硬件设备无关性。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">4</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的由来及介绍</SPAN></STRONG></DIV>
<DIV style="TEXT-INDENT: 21pt">DirectShow是从DirectX6.0中的DirectX Media
发展而来的,它集成了DirectX家族中其他成员(DirectDraw、DirectSound等)的技术。DirectX Media
Objects是从DirectX8.1的DirectShow中分离出来的,成为了另一种高效率的流数据处理解决方案。</DIV>
<DIV> <SPAN>Microsoft DirectShow是一个基于Microsoft
Windows平台的媒体流结构。它支持各种格式,包括高级流模式(ASF)、运动图像专家组(MPEG)、音频视频交错(AVI)、音频动态压缩第三层(MP3)和WAV声音文件。它支持Windows驱动模式(WDM)设备的捕捉,以及早期Widows设备的视频。DirectShow结合了其它的DirectX技术。当视频和音频的硬件加速可用时,它能够自动检测并进行使用,同时也支持没有硬件加速的系统。</SPAN></DIV>
<DIV> <SPAN>DirectShow媒体重放、格式转换和捕捉的任务变得简单。同时,它为需要自定义的解决方案的应用程序提供了对底层流控制结构的访问。您也可以创建自己的DirectShow组件,来支持新的格式或自定义效果。</SPAN></DIV>
<DIV> 使用<SPAN>DirectShow的应用程序类型包括DVD播放器、视频编辑应用程序、AVI到ASF的转换器、MP3播放器和数字视频捕捉应用程序。</SPAN></DIV>
<DIV> <SPAN>DirectShow是基于组件对象模型(COM)的。要做一个DirectShow的应用程序,您必须了解COM客户端编程。对于大多数应用程序,您不需要实现您自己的COM对象。DirectShow提供了您所需要的组件。(如果您想写自己的组件扩展DirectShow,则必须以COM对象的方式来实现。)</SPAN></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">5</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、程序开发包的选择</SPAN></STRONG></DIV>
<DIV style="MARGIN-LEFT: 21pt">请问在Mirosoft DirectX主页上的下载连接有如下:</DIV>
<DIV style="MARGIN-LEFT: 21pt">它们有什么区别:</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005)</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) Symbol Files</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c Redistributable for Software Developers - (April
2005)</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c End-User Runtime</DIV>
<DIV
style="MARGIN-LEFT: 21pt">--------------------------------------------------------------------------------</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) - 就是通常说的DXSDK</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) Symbol Files -
调试时用的符号文件</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c Redistributable for Software Developers - (April
2005) - 能够随你的程序一起发行的部分</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c End-User Runtime - 普通用户安装的DX</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">6</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、如何把</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">关联到</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=VC
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/VC"><FONT
color=#0000ff>VC</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">中?</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">我们要进行DirectX程序的编译就必须要有DirectX SDK库文件,此文件可以到微软或者本站获取,然后通过VC设置将其关联。下面说明了在VC6和VS.Net下的安装方法。</DIV>
<DIV
style="TEXT-INDENT: 21pt">VC6(英文版):选择菜单Tools->Options,打开Options对话框,选择Directions标签页,选择Include
files项,在里面添加DirectX头文件的文件夹路径目录,同样,在Library files项中添加DirectX头文件的文件夹路径目录。</DIV>
<DIV
style="TEXT-INDENT: 21pt">VS.Net(中文版):选择菜单"工具->选项",打开选项对话框,打开Projects标签页,分别选择"包含文件"和"库文件"进行相应的路径添加即可。</DIV>
<DIV
style="TEXT-INDENT: 21pt">注:VC在进行编译时,会根据排列顺序来进行库文件选取,假设有两个相同名字的库,VC会优先使用排列在前面的库文件。</DIV>
<DIV
style="TEXT-INDENT: 21pt">DirectShow应用程序至少连接库文件Strmiids.lib和Quartz.lib。前者定义了SirectShow标准的CLSID和IID,后者定义了导出函数AMGetErrorText(如果应用程序中没有使用到这个函数,也可以不连接这个库)。</DIV>
<DIV><SPAN>
DirectShow</SPAN>应用程序都应该包含Dshow.h文件,但常常用Streams.h文件来代替它。如果包含了Streams.h,则一般库文件还要连接strmbasd.lib、uuid.lib和winmm.lib。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">7</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">开发环境的配置</SPAN></STRONG></DIV>
<DIV>(1)使用VC向导生成一个具体项目,如Win32 Dynamic-Link;</DIV>
<DIV> </DIV>
<DIV>(2)包含头文件streams.h;</DIV>
<DIV> </DIV>
<DIV>(3)在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code
generation,然后在Calling convention中选择_stdcall;</DIV>
<DIV> </DIV>
<DIV>(4)使用多线程语言运行时库,即在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code
generation,然后在Use run-time library中,Debug版选择Debug
Multithreaded,Release版选择Multithreaded。</DIV>
<DIV> </DIV>
<DIV>(5)配置必要的链接库文件,即在VC的菜单中选择Project|Settings|Link,在弹出的对话框中的Category中选择General,然后在Object/library
modules中输入如下代码:</DIV>
<DIV><SPAN> Debug</SPAN>版本<SPAN> strmbasd.lib,
msvcrtd.lib, winmm.lib</SPAN></DIV>
<DIV><SPAN> Release</SPAN>版本 strmbase.lib, msvcrt.lib,
winmm.lib</DIV>
<DIV>并且选中Ignore all default libraries。</DIV>
<DIV style="TEXT-INDENT: 21pt">DirectShow
SDK建议,DirectShow应用程序应该至少连接库文件strmiids.lib和quartz.lib。前者定义了DirectShow标准的CLSID和IID,后者定义了导出函数AMGetErrorText(如果应用程序中没有使用到这个函数,也可以不连接这个库)。如果程序里包含了头文件streams.h,则一般库文件还要连接strmbasd.lib、uuid.lib、winmm.lib。</DIV>
<DIV style="TEXT-INDENT: 21pt"> </DIV>
<DIV>(6)将DirectX
SDK的Include和Lib目录配置到VC的系统目录中去,并且放在标准的VC目录之前,以保证编译器能够拿到最新版本的源文件。选择Tools|Options|Directories,在弹出的对话框中的Show
directories for中选择Include files,配置如下(假设DirectX SDK安装在D:\DXSDK目录下,VC安装在C:\Program
Files下):</DIV>
<DIV><SPAN> D:\DXSDK\Include</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES</SPAN></DIV>
<DIV><SPAN> D:\DXSDK\SAMPLES\C++\COMMON\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\MFC\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\ATL\INCLUDE</SPAN></DIV>
<DIV> </DIV>
<DIV>再在Show directories for中选择Library files,配置如下:</DIV>
<DIV><SPAN> D:\DXSDK\Lib</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\DEBUG</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\RELEASE</SPAN></DIV>
<DIV><SPAN> C:\PROGRAM FILES\MICROSOFT SDK\LIB</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\LIB</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\MFC\LIB</SPAN></DIV>
<DIV> </DIV>
<DIV>(7)因为DirectShow应用程序是一种COM客户程序,因此在调用任何COM函数之前调用CoInitialize()(或CoInitializeEx)函数进行COM库的初始化(一般是在应用程序启动的时候调用一次),在结束COM库使用时调用CoUninitialize()函数进行反初始化(一般是在应用程序退出前调用一次)。</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV align=left><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">8</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=VC
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/VC"><FONT
color=#0000ff>VC</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">编译</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">程序出现</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">"</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">无法解析的外部符号</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">"</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">是怎么回事?</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">这个错误经常出现在初学者要进行编译DirectX程序的时候,主要是因为没有将DX的库文件引用到工程中,这里需要注意,我们将DX
SDK的路径设置到VC后,并不代表我们已设置好了DX SDK,在我们的DX工程中,我们还需要进行相应的设置操作,把我们所需要的库文件(DirectX SDK
Library)加入到我们的工程中,要设置这个库文件有两个方法,一个是在你工程的编译选项中进行添加,另外一种可以通过代码的方法来添加(推荐)。</DIV>
<DIV style="TEXT-INDENT: 21pt">命令行:#pragma comment( lib,"xxx.lib" )</DIV>
<DIV style="TEXT-INDENT: 21pt">这个是VC的编译预处理指令,将其加在代码中即可。</DIV>
<DIV style="TEXT-INDENT: 21pt">例如:#pragma comment( lib,"ddraw.lib"
) 这句的意思是将ddraw.lib库加入到工程中进行编译。</DIV>
<DIV style="TEXT-INDENT: 21pt">注:此命令行不需要加分号(“;”)。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">9</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow SDK</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">基类库</SPAN></STRONG></DIV>
<DIV><SPAN> </SPAN>在DirectShow
SDK基类库中,除了Filter和Pin类外,还有很多工具类。有了这些类的支持,我们开发Filter组件或者DirectShow应用程序会更加轻松。这些类主要包括:CPullPin、COutputQueue、CSourceSeeking、CEnumPins、CEnumMedieTypes、CMemAllocator、CMediaSample、CBaseReferenceClock、CMediaType、CBaseProperyPage等。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">10</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">编程基础</SPAN></STRONG></DIV>
<DIV><SPAN>
DirectX</SPAN>采用了COM标准,而DirectShow是一套完全基于COM的应用系统。</DIV>
<DIV><SPAN>
DirectShow</SPAN>应用程序实际上是一种COM组件的客户程序,只是COM组件的“使用”问题。这些问题包括如何创建COM组件、如何得到组件对象上的解风口以及调用接口方法、如何管理组件对象(即需要熟悉COM的引用计数机制)等。</DIV>
<DIV><SPAN>
</SPAN>而对于Filter开发人员来说,需要掌握的COM知识就要多一点。因为Filter本身是一种COM组件,开发Filter牵涉到了COM组件的“实现”问题。</DIV>
<DIV><SPAN> <A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN>本身只是一种规范,而不是实现。但是当使用C++来实现时,COM组件就是一个C++类,而接口都是纯虚类。COM规范规定,任何组件或接口都必须从IUnknown接口中继承而来,每个组件都必须实现一个与支相对应的类工厂(Class
Factory),类工厂也是一个COM组件,他实现了IClassFactory接口。在IClassFactory的接口函数CreateInstance中,才能使用new操作生成一个与之对应的COM组件类对象实例。</DIV>
<DIV><SPAN> <A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN>组件有3种类型:进程内组件、本地进程组件和远程组件。Filter一般是一种进程内组件,以DLL的形式提供服务。</DIV>
<DIV><SPAN>
</SPAN>每个COM组件都使用一个GUID来唯一标识。当创建一个COM组件时,总是首先通过这个GUID调用CoGetClassObject来获得创建这个组件对象的类工厂。然后调用类工厂的接口方法IClassFactory::CreateInstance,就能真正地创建GUID标示的组件对象了。</DIV>
<DIV><SPAN>
</SPAN>一个典型的自注册COM组件DLL所必需的5个函数如下:</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllMain:DLL的入口函数(DirectShow实现的是DllEntryPoint);</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllGetClassObject:用于获得类工厂指针;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllRegisterServer:将COM组件注册到注册表中;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllUnregisterServer:删除注册表中COM组件的注册信息。</DIV><BR>
<SCRIPT src="转载:DirectShow 学习笔记(1) 独行客 天极Blog.files/ding.js"
charset=gb2312></SCRIPT>
</DIV>
<DIV class=rightcom>作者:独行客 阅读(
<SCRIPT type=text/javascript> var myArray = getcount('1558777');document.write(myArray[0]);</SCRIPT>
) <A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -