C++Builder基础6

上传人:仙*** 文档编号:85756326 上传时间:2022-05-06 格式:DOC 页数:11 大小:196.50KB
收藏 版权申诉 举报 下载
C++Builder基础6_第1页
第1页 / 共11页
C++Builder基础6_第2页
第2页 / 共11页
C++Builder基础6_第3页
第3页 / 共11页
资源描述:

《C++Builder基础6》由会员分享,可在线阅读,更多相关《C++Builder基础6(11页珍藏版)》请在装配图网上搜索。

1、word文件系统驱动编程根底篇之6DirectShow 关键字:文件系统驱动编程,DirectShow wskjuf 更新:2008-10-06 22:14:09 浏览:2466文件系统驱动编程根底篇之六DirectShow一、前略 本系列文章为业余编程爱好者而写,仅仅作为初学者的一个借鉴,真正的精华存在于参考资料*中。知识的积累将经历从薄到厚,再从厚到薄的反复过程,为了打下结实的根底,请读者务必在阅读本文的根底上花费必要的时间完成参考资料。参考资料*:1.Programming Microsoft DirectShow for Digital Video and Television与其示例

2、代码2.DirectShow for DirectX 8.1 SDK C+3. Microsoft Windows Software Development Kit Update for Windows Vista 之相关文档与其示例代码4.DirectShow开发快速入门之慨述5.深入解析ATL ATL Internals Second Edition Working with ATL 86. 组件设计与应用一起源与复合文件.vckbase./document/viewdoc/?id=1483阅读根底:少量的编程的根底知识,了解如何调用组件的方法,最好掌握哪怕一丁点的ATL。本章目的:了解D

3、irectX组件架构,学习编写简单的DirectShow程序。二、DirectX与DirectShow首先看下面两段关于DirectX和DirectShow相关容的摘要:DirectX的第一个版本作为Windows Games SDK发布于1995年9月,它作为Windows API的一局部用以替换Windows 3.1中的DCI和WinGAPI。ATI的一个开发团队为微软带来了根本的游戏影像技术,微软方面,DirectX由专门的团队负责开发,Eisler 为团队领导,而St. John和Engstrom如此成为主程序设计师。2005年4月,DirectShow从DirectX移除,参加到Mi

4、crosoft Platform SDK。Windows系统的架构下,我们不能如Dos般随心所欲的控制硬件,而希望游戏、影像开发人员对核的理解都达到驱动编程人员的水平,是一件苛求的事情,但是为此将失去广阔市场的关键问题必然要产生解决的方法,因此,DirectX或其他不同名的一样技术的出现是件必然的。有些读者可能会对驱动编程的根底文章涉与DirectX的必要性有所疑问,确实,DirectX并不是学习驱动编程的一个障碍,笔者在初次的学习中也从未意识过要了解这方面的容。但是换一个角度,如果你看到鸡窝里的五个鸡蛋,我们是不是很有理由猜想这是由五只母鸡组成的五好家庭?因此我们可很牵强的认为DirectX

5、如同核的外部据点,如果我们拔除了,必然有更大的把握向核发动总攻。笔者把DirectX参加本系列文章的另一个重要原因是DirectX确实有值得炫耀的资本。对于编程人员来说,它的接口简直可用“优雅来评价,当你用着如苦瓜般的IMarshal接口时,不妨来看看什么样的接口值得这样的评价。我挑选了DirectX里一个很有意思的局部DirecShow来作为突破口,讲述如何“Direct直接的控制视频设备。学习的进阶大概上可分为四个局部:学习调用组件、捕获和编辑影像、学习编写过滤器、掌握媒体格式的高阶局部。限于能力,只介绍前两个局部。读者不要满足于学会使用DirctShow,而是通过DirctShow的具体

6、功能猜想系统驱动的功能,甚至设备的构成,减轻将来主攻驱动时的负担,此即由外而的学习方法。笔者将掠人之美,使用参考资料1提供的示例说明编程的根本思路。三、DirectShow根底和GraphEdit在Windows系统中,DirectShow以组件的形式存在,如下图描绘了DirectShow组件、硬件以与系统组件的关系Leagcy为传统或遗留,旧的之意。现在我们只需了解DirectShow里包含了两大类型的对象:三类“Filter源、转换、渲染过滤器,以与由这些过滤器集组成提供特定功能的“Filter Graph,这个Graph不妨看成是包含Filter的一个容器。为了从可视化的角度理解Dire

7、ctShow工作的方式,我们可使用SDK附带的GraphEdit工具。它最根本的功能是利用系统里已经安装的解码器,使用DirectShow组件来播放媒体文件,并直观的显示播放流程。下面演示一下如何播放一个媒体文件。GraphEdit的界面如图:?从菜单文件渲染媒体文件里选择你要播放的文件,这里我们选择一个微软支持的avi格式文件ff8-full-ending.avi,如此界面上出现:每一个DirectShow组件都以矩形框表示,Input、Output针(pin)作为每个过滤器的输入或输出。通常情况下,源左上角的ffi_full_ending.avi、渲染过滤器Video Renderer和D

8、efault DirectSound Device是必须的,转换过滤器根据实际情况可选。从菜单图表插入过滤器可以看到所有可用的过滤器。上图隐含了DirctShow的“智能选择功能,即如果你提供了任何两个逻辑关联的渲染器如MPC Avi Splitter和Video Renderer,DirectShow会自动查找之间的可用组件,形成一个正常的播放流程。读者如果想真正掌握DirectShow,应该学会手工添加、连接适宜的过滤器而不仅仅依赖于“智能选择功能。由图可知,avi文件被播放前,经过别离器的别离,形成视频和音频两个局部,它们再选择适宜的解码器,最后分别送到系统默认的渲染过滤器上进展渲染,影

9、像就显现于屏幕上了。点一下界面上绿色三角的播放键,如此可以欣赏我们的影片了。这一切出乎意料的简单,这使我们不由产生了这么一个想法DirctShow的初级应用也是非常简单的,事实正是如此。在进价的第一局部,我们学习如何通过调用组件,完成一个媒体文件的播放。四、进价之一组件的调用 本篇将要接触到下表组件的调用,详细的信息可参考Msdn上的说明,这些根底工作留给有心的读者来完成吧: IIDCREATE CLSIDREMARKIBaseFilter CLSID_VideoMixingRenderer9,primary interface for DirectShow filtersICreateDev

10、EnumCLSID_SystemDeviceEnumcreates an enumerator for a category of filtersIEnumMonikerCLSID_AudioInputDeviceCategoryenumerate the ponents of a moniker or to enumerate the monikers in a table of monikersIEnumPinsThe filter graph manager uses this interface when it connects filters. Applications can us

11、e it to retrieve pins on a filterIFileSinkFilterwrite media streams to a fileIFilterGraphprovides methods for building a filter graphIfilterGraph2extends the IFilterGraph and IGraphBuilder interfaces, which contain methods for building filter graphsIGraphBuilderCLSID_FilterGraphinherited from Ifilte

12、rGraph IMediaControlprovides methods for controlling the flow of data through the filter graphIMediaEventcontains methods for retrieving event notifications and for overriding the Filter Graph Managers default handling of eventsIMediaEventExIMediaSeekingcontains methods for seeking to a position wit

13、hin a stream, and for setting the playback rate.IMonikercontains methods that allow you to use a moniker object, which contains information that uniquely identifies a objectIPropertyBagProvides an object with a property bag in which the object can save its properties persistentlyIPersistStreamprovid

14、es methods for saving and loading objects that use a simple serial stream for their storage needsIPinThe filter graph manager uses this interface to connect pins and perform flushing operationsIPropertyBagProvides an object with a property bag in which the object can save its properties persistently

15、.IStreamThe IStream interface lets you read and write data to stream objectsIStoragesupports the creation and management of structured storage objectsIVMRFilterConfig9configure the VMRs operating mode and video rendering mechanismsIVMRMixerControl9enables an application to manipulate the ining video

16、 streams on the VMR-9IVMRWindowlessControl9controls how the VMR-9 renders a video stream within a container window编程可任选Microsoft或CodeGear公司的编译器。如果使用vs,可以在微软站点下载并安装最新的SDK,如果使用C+Builder,可通过互联网下载DirectX 9 SDK for Borland C+ Builder。本篇以vs2005作为默认编译器,示例选用参考资料1的DSRender、DSBuild和PIP9。一DSRenderDSRender模拟了Gr

17、aphEdit打开一个媒体文件播放的行为,代码很简单,仅仅用到了IGraphBuilder,IMediaControl,IMediaEvent三个接口提供的方法,播放窗口为系统创建,我们不能设置到自定义窗口。代码里值得一提的是保存上图配置的函数SaveGraphFile,涉与了IStorage和IPersistStream两个接口,同时涉与了复合文件pound file storage object这一个概念。复合文件仿佛一个包含假如干文件、子文件夹的文件夹,是假如干普通文件、子复合文件的组合。通常使用的ReadFile、WriteFile函数以字节指针形式操纵单一文件,而复合文件里的文件却是

18、以流对象Stream Object的形式存在,并强调了流对象的嵌套行为。从这种角度来看,前者象结构化编程的C,后者象面向对象编程的C+。可阅读Msdn里的相关文章更深入的理解复合文件。二DSBuildDsBuild模拟了手工添加过滤器的行为。稍微有点意思的是GetPin函数,它通过枚举每个过滤器的针脚,检查并返回所查询的输入或输出针脚。过滤器间的针脚相连非常的简单,通过IGraphBuilder接口的Connect方法将上游过滤器的输出针脚和下游过滤器的输入针脚相连即可。五、进价之二捕获和编辑影像 逵的三板斧现在也该抡出最后一板了,倒不是黔驴已经技穷汗一下,是吗,有人这样说吗?,笔者相信这已经

19、足够了,经过努力阅读参考资料的读者已经找到了前进的方向,本篇的容虽然不多,却点到了DirectShow很多根底的知识,如果不把它们从薄读到厚,那么本文还有什么意义呢?这局部的容可以细读参考资料1的第49章,料想考试时在试卷上写,“此题请教师参考课本第xxx页完成必定落个红灯的下场,故笔者打算稍微分析一下第9章所介绍的杀手锏用Video Mixing RendererVMR来生成影像的画中画程序PIP9。即使包括头文件,Pip9的总代码量也不过1500行,提示和空格真正表现了本站资源华为编程规和例(PDF)里对注释不少于20的要求,如果使用可视化控件编程,代码量大约又可减少1/3,兼之很多接口在

20、上两个程序中已经接触过,因此本节的重点放在了画中画的主线VMR9的操作上。首先我们从整体上把握VMR。从上图看VMR过滤器类似于可以完成具体功能的集成电路,而不再是一个晶体管。它用于管理多重流媒体的渲染,在VMR9版本下,可以管理多达16个的输入管脚。需要重点查看的函数为: 1BlendVideo : ConfigureMultiFileVMR9 - AddGraphToRot2ConfigureMultiFileVMR9 : InitializeWindowlessVMR - RenderFileToVMR9 上述6个函数完成了画中画的播放效果,涉与的VMR接口为IVMRFilterConf

21、ig9、IVMRMixerControl9和IVMRWindowlessControl9。在这里,我们终于可以随心所欲的实现自定义的播放窗口了。欣赏着稍带回音效果的影像,现在的你是不是觉得暴风影音、快乐影音这些功能强大的播放器不再神秘了呢? 如果仔细观察,将发现在自定义窗口上播放的影像可以很轻易用HyperSnap截取下来,而在默认窗口播放的影像却无法用HyperSnap捕获。兴奋之余,你也许不再满足只拥有如此简单的功能了,你还想获得调整播放速度、进度的自由,播放更多类型的影像文件,那就让我们来修正代码吧。六、示例代码的修正 代码的修正基于几种根本原因:编译器的改变、bug的改正以与功能上的完

22、善。在本机上实践时,发现调整了头文件、库文件路径后,资料1提供的源代码仍不能通过编译,提示某些符号无法找到的错误,在cpp文件首部添加#pragma ment(lib, strmiids.lib)后解决。 不要指望只有千行有效代码的播放器拥有多强大的功能,所以读者需要阅读相关接口的其他方法,添加常用的控制功能。眼疾手快的读者可能还将大声叫嚷Pip9不支持asf或wmv格式,但SDK里已经提供了相应源代码,你还等什么呢。 七、结语 本文并非以介绍DirectShow的开发为目的,根本的想法是希望读者了解驱动编程被微软披上了多件外衣这一个事实,在前进的路途中,不要被这些美丽的衣裳所迷惑。现在的我们仍无法解释诸如过滤器终究如何与驱动交互,如何完成自己的过滤器的问题,但从全局来说,这些问题是你以前根本没有意识到的,即问题的深度已经有了一定的提高。我们大可保持一段时间的迷茫,等到水到渠成的时候,你将有充分的理由相信自己不再是一个菜鸟。本篇作为选学容,参考完成时间为两星期。了解了重要性的读者,可再花费两个月时间来打下编程的根底。 11 / 11

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!