




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文文件件系系统统驱驱动动编编程程基基础础篇篇之之6 DirectShow 关键字 文件系统驱动编程 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 组件设计与应用 一 起源及复合文件 阅读基础 少量的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 CLSIDREMARK IBaseFilter CLSID VideoMixingRenderer9 primary interface for DirectShow filters ICreateDevEnumCLSID SystemDeviceEnumcreates an enumerator for a category of filters IEnumMonikerCLSID AudioInputDeviceCategoryenumerate the components of a moniker or to enumerate the monikers in a table of monikers IEnumPins The filter graph manager uses this interface when it connects filters Applications can use it to retrieve pins on a filter IFileSinkFilter write media streams to a file IFilterGraph provides methods for building a filter graph IfilterGraph2 extends the IFilterGraph and IGraphBuilder interfaces which contain methods for building filter graphs IGraphBuilderCLSID FilterGraphinherited from IfilterGraph IMediaControl provides methods for controlling the flow of data through the filter graph IMediaEvent contains methods for retrieving event notifications and for overriding the Filter Graph Manager s default handling of events IMediaEventEx 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 object IPropertyBag Provides an object with a property bag in which the object can save its properties persistently IPersistStream provides methods for saving and loading objects that use a simple serial stream for their storage needs IPin The filter graph manager uses this interface to connect pins and perform flushing operations IPropertyBag 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 objects IStorage supports the creation and management of structured storage objects IVMRFilterConfig9 configure the VMR s operating mode and video rendering mechanisms IVMRMixerControl9 enables an application to manipulate the incoming video streams on the VMR 9 IVMRWindowlessControl9 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 B u i l d e r研 究 h t t p w w w c c r u n c o m a r t i c l e a s p i 1 0 5 9 d 4 r p i 0 3 DSRender 模拟了 GraphEdit 打开一个媒体文件播放的行为 代码很简单 仅仅用到了 IGraphBuilder IMediaControl IMediaEvent 三个接口提供的方法 播放窗口为系统创建 我 们不能设置到自定义窗口 代码里值得一提的是保存上图配置的函数SaveGraphFile 涉及了 IStorage 和 IPersistStream 两个接口 同时涉及了复合文件 Compound file storage object 这一个概念 复合文件仿佛一个包含若干文件 子文件夹的文件夹 是若干普通文件 子复合文件的组合 通 常使用的 ReadFile WriteFile 函数以字节指针形式操纵单一文件 而复合文件里的文件却是以 流对象 Stream Object 的形式存在 并强调了流对象的嵌套行为 从这种角度来看 前者象 结构化编程的C 后者象面向对象编程的C 可阅读 Msdn 里的相关文章更深入的理解复 合文件 二 DSBuild DsBuild 模拟了手工添加过滤器的行为 稍微有点意思的是GetPin 函数 它通过枚举每个 过滤器的针脚 检查并返回所查询的输入或输出针脚 过滤器间的针脚相连非常的简单 通过 IGraphBuilder 接口的 Connect 方法将上游过滤器的输出针脚和下游过滤器的输入针脚相连即可 五 进价之二 捕获和编辑影像 李逵的三板斧现在也该抡出最后一板了 倒不是黔驴已经技穷 汗一下 是吗 有人 这样说吗 笔者相信这已经足够了 经过努力阅读参考资料的读者已经找到了前进的方向 本篇的内容虽然不多 却点到了DirectShow 很多基础的知识 如果不把它们从薄读到厚 那 么本文还有什么意义呢 这部分的内容可以细读参考资料1 的第 4 9 章 料想考试时在试卷上写 本题请老师 参考课本第 xxx 页完成 必定落个红灯的下场 故笔者打算稍微分析一下第9 章所介绍的杀 手锏 用 Video Mixing Renderer VMR 来生成影像的画中画程序PIP9 即使包括头文件 Pip9 的总代码量也不过1500 行 提示和空格真正体现了本站资源 华为编程规范和范例 PDF 里对注释不少于20 的要求 如果使用可视化控件编程 代码 量大约又可减少1 3 兼之很多接口在上两个程序中已经接触过 因此本节的重点放在了画中画 的主线 VMR9 的操作上 首先我们从整体上把握VMR 从上图看 VMR 过滤器类似于可以完成具体功能的集成电路 而不再是一个晶体管 它用于管 理多重流媒体的渲染 在VMR9 版本下 可以管理多达16 个的输入管脚 需要重点查看的函数为 1 BlendVideo ConfigureMultiFileVMR9 AddGraphToRot 2 ConfigureMultiFileVMR9 InitializeWindowlessVMR RenderFileToVMR9 上述 6 个函数完成了画中画的播放效果 涉及的VMR 接口为 IVMRFilterConfig9 IVMRMixerControl9 和 IVMRWindowlessControl9 在这里 我们终于 可以随心所欲的实现自定义的播放窗口了 欣赏着稍带回音效果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 省级教育期刊发表论文
- 高校人力资源管理中人工智能的创新应用
- 美甲店店铺日常管理制度
- 舞蹈培训班请假管理制度
- 产品货运中心管理制度
- 乙方投标流程管理制度
- 三星公司晋升管理制度
- 乡镇宣传橱窗管理制度
- 交通数据分级管理制度
- 企业会议接待管理制度
- 四川省文化和旅游企业安全生产管理责任清单参考模板(1.0版)
- (精心整理)初三数学几何的动点问题专题练习及答案
- 疾病预防控制体系建设与发展
- 核电工程施工隐患排查专项培训课件
- 河南省开封市体育中心PPP项目案例分析
- 基于UG NX 5.0的箱体零件的数控加工
- Q_SLB0402-2005 产品钢印及标记移植
- 一种基于SG3525的半桥高频开关电源
- 劳动者个人职业健康监护档案(样板)
- 空客A320-IPC手册使用介绍
- 严文井《小溪流的歌》语文版七上18课课文原文
评论
0/150
提交评论