




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件系统驱动编程基础篇之6DirectShow 关键字:文件系统驱动编程,DirectShow 作者:wskjuf 更新:2008-10-06 22:14:09 浏览:2466文件系统驱动编程基础篇之六DirectShow一、前略 本系列文章为业余编程爱好者而写,仅仅作为初学者的一个借鉴,真正的精华存在于参考资料*中。知识的积累将经历从薄到厚,再从厚到薄的反复过程,为了打下牢固的基础,请读者务必在阅读本文的基础上花费必要的时间完成参考资料。参考资料*:1.Programming Microsoft DirectShow for Digital Video and Television及其示例代码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 8)6.COM 组件设计与应用(一)起源及复合文件(/document/viewdoc/?id=1483)阅读基础:少量的COM编程的基础知识,了解如何调用COM组件的方法,最好掌握哪怕一丁点的ATL。本章目的:了解DirectX组件架构,学习编写简单的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移除,加入到Microsoft Platform SDK。Windows系统的架构下,我们不能如Dos般随心所欲的控制硬件,而希望游戏、影像开发人员对内核的理解都达到驱动编程人员的水平,是一件苛求的事情,但是为此将失去广大市场的关键问题必然要产生解决的办法,因此,DirectX或其他不同名的相同技术的出现是件必然的。有些读者可能会对驱动编程的基础文章涉及DirectX的必要性有所疑问,确实,DirectX并不是学习驱动编程的一个障碍,笔者在初次的学习中也从未意识过要了解这方面的内容。但是换一个角度,如果你看到鸡窝里的五个鸡蛋,我们是不是很有理由猜测这是由五只母鸡组成的五好家庭?因此我们可很牵强的认为DirectX如同内核的外部据点,如果我们拔除了,必然有更大的把握向内核发动总攻。笔者把DirectX加入本系列文章的另一个重要原因是DirectX确实有值得炫耀的资本。对于编程人员来说,它的COM接口简直可用“优雅”来评价,当你用着如苦瓜般的IMarshal接口时,不妨来看看什么样的接口值得这样的评价。我挑选了DirectX里一个很有意思的部分DirecShow来作为突破口,讲述如何“Direct”直接的控制视频设备。学习的进阶大略上可分为四个部分:学习调用组件、捕获和编辑影像、学习编写过滤器、掌握媒体格式的高阶部分。限于能力,只介绍前两个部分。读者不要满足于学会使用DirctShow,而是通过DirctShow的具体功能猜测系统驱动的功能,甚至设备的构成,减轻将来主攻驱动时的负担,此即由外而内的学习方法。笔者将掠人之美,使用参考资料1提供的示例阐明编程的基本思路。三、DirectShow基础和GraphEdit在Windows系统中,DirectShow以COM组件的形式存在,下图描绘了DirectShow组件、硬件以及系统组件的关系(Leagcy为传统或遗留,旧的之意)。现在我们只需了解DirectShow里包含了两大类型的对象:三类“Filter”(源、转换、渲染过滤器),以及由这些过滤器集组成提供特定功能的“Filter Graph”,这个Graph不妨看成是包含Filter的一个容器。为了从可视化的角度理解DirectShow工作的方式,我们可使用SDK附带的GraphEdit工具。它最基本的功能是利用系统里已经安装的解码器,使用DirectShow组件来播放媒体文件,并直观的显示播放流程。下面演示一下如何播放一个媒体文件。GraphEdit的界面如图:? 从菜单文件渲染媒体文件里选择你要播放的文件,这里我们选择一个微软支持的avi格式文件ff8-full-ending.avi,则界面上出现:每一个DirectShow组件都以矩形框表示,Input、Output针(pin)作为每个过滤器的输入或输出。通常情况下,源(左上角的ffi_full_ending.avi)、渲染过滤器(Video Renderer和Default DirectSound Device)是必须的,转换过滤器根据实际情况可选。从菜单图表插入过滤器可以看到所有可用的过滤器。上图隐含了DirctShow的“智能选择”功能,即如果你提供了任何两个逻辑关联的渲染器(如MPC Avi Splitter和Video Renderer),DirectShow会自动查找之间的可用组件,形成一个正常的播放流程。读者如果想真正掌握DirectShow,应该学会手工添加、连接合适的过滤器而不仅仅依赖于“智能选择”功能。由图可知,avi文件被播放前,经过分离器的分离,形成视频和音频两个部分,它们再选择合适的解码器,最后分别送到系统默认的渲染过滤器上进行渲染,影像就显现于屏幕上了。点一下界面上绿色三角的播放键,则可以欣赏我们的影片了。这一切出乎意料的简单,这使我们不由产生了这么一个想法DirctShow的初级应用也是非常简单的,事实正是如此。在进价的第一部分,我们学习如何通过调用组件,完成一个媒体文件的播放。四、进价之一组件的调用 本篇将要接触到下表组件的调用,详细的信息可参考Msdn上的说明,这些基础工作留给有心的读者来完成吧: IID CREATE CLSIDREMARKIBaseFilter CLSID_VideoMixingRenderer9,primary interface for DirectShow filtersICreateDevEnumCLSID_SystemDeviceEnumcreates an enumerator for a category of filtersIEnumMonikerCLSID_AudioInputDeviceCategoryenumerate the components of a moniker or to enumerate the monikers in a table of monikersIEnumPins The filter graph manager uses this interface when it connects filters. Applications can use it to retrieve pins on a filterIFileSinkFilter write media streams to a fileIFilterGraph provides methods for building a filter graphIfilterGraph2 extends the IFilterGraph and IGraphBuilder interfaces, which contain methods for building filter graphsIGraphBuilderCLSID_FilterGraphinherited from IfilterGraph IMediaControl provides methods for controlling the flow of data through the filter graphIMediaEvent contains methods for retrieving event notifications and for overriding the Filter Graph Managers default handling of eventsIMediaEventEx IMediaSeeking contains methods for seeking to a position within a stream, and for setting the playback rate.IMoniker contains methods that allow you to use a moniker object, which contains information that uniquely identifies a COM objectIPropertyBag Provides an object with a property bag in which the object can save its properties persistentlyIPersistStream provides methods for saving and loading objects that use a simple serial stream for their storage needsIPin The filter graph manager uses this interface to connect pins and perform flushing operationsIPropertyBag Provides an object with a property bag in which the object can save its properties persistently.IStream The IStream interface lets you read and write data to stream objectsIStorage supports the creation and management of structured storage objectsIVMRFilterConfig9 configure the VMRs operating mode and video rendering mechanismsIVMRMixerControl9 enables an application to manipulate the incoming video streams on the VMR-9IVMRWindowlessControl9 controls 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。(一)DSRender/ 本文转自 C+Builder研究 - /article.asp?i=1059&d=4rpi03DSRender模拟了GraphEdit打开一个媒体文件播放的行为,代码很简单,仅仅用到了IGraphBuilder,IMediaControl,IMediaEvent三个接口提供的方法,播放窗口为系统创建,我们不能设置到自定义窗口。代码里值得一提的是保存上图配置的函数SaveGraphFile,涉及了IStorage和IPersistStream两个接口,同时涉及了复合文件(Compound file storage object)这一个概念。复合文件仿佛一个包含若干文件、子文件夹的文件夹,是若干普通文件、子复合文件的组合。通常使用的ReadFile、WriteFile函数以字节指针形式操纵单一文件,而复合文件里的文件却是以流对象(Stream Object)的形式存在,并强调了流对象的嵌套行为。从这种角度来看,前者象结构化编程的C,后者象面向对象编程的C+。可阅读Msdn里的相关文章更深入的理解复合文件。(二)DSBuildDsBuild模拟了手工添加过滤器的行为。稍微有点意思的是GetPin函数,它通过枚举每个过滤器的针脚,检查并返回所查询的输入或输出针脚。过滤器间的针脚相连非常的简单,通过IGraphBuilder接口的Connect方法将上游过滤器的输出针脚和下游过滤器的输入针脚相连即可。五、进价之二捕获和编辑影像 李逵的三板斧现在也该抡出最后一板了,倒不是黔驴已经技穷(汗一下,是吗,有人这样说吗?),笔者相信这已经足够了,经过努力阅读参考资料的读者已经找到了前进的方向,本篇的内容虽然不多,却点到了DirectShow很多基础的知识,如果不把它们从薄读到厚,那么本文还有什么意义呢?这部分的内容可以细读参考资料1的第49章,料想考试时在试卷上写,“本题请老师参考课本第xxx页完成”必定落个红灯的下场,故笔者打算稍微分析一下第9章所介绍的杀手锏用Video Mixing Renderer(VMR)来生成影像的画中画程序PIP9。即使包括头文件,Pip9的总代码量也不过1500行,提示和空格真正体现了本站资源华为编程规范和范例(PDF)里对注释不少于20的要求,如果使用可视化控件编程,代码量大约又可减少1/3,兼之很多接口在上两个程序中已经接触过,因此本节的重点放在了画中画的主线VMR9的操作上。首先我们从整体上把握VMR。从上图看VMR过滤器类似于可以完成具体功能的集成电路,而不再是一个晶体管。它用于管理多重流媒体的渲染,在VMR9版本下,可以管理多达16个的输入管脚。需要重点查看的函数为: 1BlendVideo : ConfigureMultiFileVMR9 - AddGraphToRot2ConfigureMultiFileVMR9 : InitializeWindowlessVMR - RenderFileToVMR9 上述6个函数完成了画中画的播放效果,涉及的VMR接口为IVMRFilterConfig9、IVMRMixerControl9和IVMRWindowlessControl9。在这里,我们终于可以随心所欲的实现自定义的播放窗口了。欣赏着稍带回音效果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年慈善总会会计考试题库
- 2025年婚姻家庭咨询师初级笔试题库
- 2025年工业安全工程师面试题
- 2025年安全生产安全生产考试题库
- 2025年宁夏安全员考试重点题库及答案
- 2025年树葬行业应用与生态礼仪师考试预测题
- 2025年托育保健医生考试重点题解析
- 2025年山西C类安全员考试答案解析
- 2025年食堂安全管理员笔试冲刺题
- 2025年人力资源管理师综合素质评定考试试题及答案解析
- 图书管理员考试复习全书:试题及答案
- T-CECC 029.1-2024 数据分类分级指南 第1部分:医疗健康
- 污泥运输合同范本
- DBJ04T 289-2020 建筑工程施工安全资料管理标准
- 运输车辆司机安全培训考试专项测试题及答案
- 视频制作及推广合同
- 《神经网络与深度学习课程设计》课程教学大纲
- 焊工技师考试题(职业技能鉴定国家题库)
- 【零碳园区】绿色低碳工业园区自评价及第三方评价报告
- 手术室工作流程的优化和改进
- 大讲堂实施方案
评论
0/150
提交评论