基于directshow视频播放器的开发与设计_第1页
基于directshow视频播放器的开发与设计_第2页
基于directshow视频播放器的开发与设计_第3页
基于directshow视频播放器的开发与设计_第4页
基于directshow视频播放器的开发与设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC 程序设计报告 XXXX 学学院院 软软件件设设计计 题题 目 目 基于基于 DirectShow 的视频播放的视频播放 器器 所所 在在 系 系 计算机科学系计算机科学系 专专 业 业 计算机科学与技术计算机科学与技术 学学 号 号 作者姓名 作者姓名 指导教师 指导教师 2013 年年 10 月月 5 日日 VC 程序设计报告 基于 DirectShow 的视频播放器 摘要 摘要 DirectShow 是微软 Windows SDK 中的流媒体开发平台 它基于 COM 技术 采用 DirectShow 开发视频播放软件 具有快捷 代码量少和程序稳健的特点 本文介绍用 DirectShow 开发视频播放器的基本过程 关键词 关键词 DirectShow COM 视频播放器 Abstract DirectShow based on COM technology is an important component of Microsoft Windows platform SDK Developing video player using DirectShow has the benefits of quickness reduced code and robustness This paper introduces the basic procedure of developing video player basing DirectShow Keyword DirectShow COM Video Player VC 程序设计报告 目录 1 引言 2 2 DirectShow 介绍 2 2 1 DirectShow 系统 2 2 2 DirectShow 技术 3 2 2 1 过滤器 Filter 3 2 2 2 针脚 Pin 3 2 2 3 Filter Graph 4 2 2 4 Filter Graph Manager 4 2 3 基于 DirectShow 的应用程序开发 4 2 4 播放媒体文件 4 3 视频播放器的开发 5 3 1 开发环境的配置 5 3 2 基于对话框的 MFC 应用程序 5 3 3 编辑对话框界面 6 3 4 视频窗口控制 6 3 5 封装类 CDXGraph 7 3 6 创建 Filter Graph 7 3 7 处理 Filter Graph 的事件 7 3 7 1 消息映射 7 3 7 2 图表消息响应函数 8 3 7 3 打开按钮响应函数 9 3 7 4 播放按钮响应函数 9 3 7 5 暂停按钮响应函数 9 3 7 6 停止按钮响应函数 10 3 7 7 进度条的实现 10 4 程序测试 11 5 参考文献 11 VC 程序设计报告 1 引言 DirectShow 是微软公司在 ActiveMovie 和 Video for Windows 的基础上推 出的新一代基于 COM Component Object Model 的流媒体处理的开发包 与 DirectX 开发包一起发布 DirectShow 为多媒体流的捕捉和回放提供了强有力 的支持 运用 DirectShow 可以很方便地从支持 WDM 驱动模型的采集卡上捕获 数据 并且进行相应的后期处理乃至存储到文件中 这样使在多媒体数据库管 理系统 MDBMS 中多媒体数据的存取变得更加方便 DirectShow 广泛地支持各种媒体格式 包括 Asf Mpeg Avi Dv Mp3 Wave 等等 使得多媒体数据的回放变得轻而易举 另外 DirectShow 还集成了 DirectX 其它部分 比如 DirectDraw DirectSound 的技术 直接支持 DVD 的播放 视频的非线性编辑 以及与数字摄像机的数据交换 本文基于 DirectShow 实现能播放多种格式文件 AVI MPEG WAV 的视频播 放器 2 DirectShow 介绍 2 1 DirectShow 系统 DirectShow 的架构如图 1 所示 图中央最大的一块即是 DirectShow 系统 虚线以下是 Ring 0 特权级别的硬件设备 虚线以上是 Ring 3 特权级别的应用 层 DirectShow 系统位于应用层中 它使用一种叫 Filter Graph 的模型来管 理整个数据流的处理过程 参与数据处理的各个功能模块叫做 Filter 各个 Filter 在 Filter Graph 中按一定的顺序连接成一条 流水线 协调工作 1 VC 程序设计报告 图 1 DirectShow 架构 2 2 DirectShow 技术 2 2 1 过滤器 Filter 过滤器是 DirectShow 的基本 建筑 单元 DirectShow 把数字媒体的处 理 播放 捕获和格式转换 划分为一些独立的步骤 过滤器就是完成一个或多 个步骤的 COM 对象 按照功能来分 Filter 大致分为 3 类 Source Filter Transform Filter 和 Rendering Filter Source Filter 主要负责获取数据 数据源可以 是文件 因特网计算机里的采集卡 WDM 驱动的或 VFW 驱动的 数字摄像机等 然后将数据往下传输 Transform Filter 主要负责数据的格式转换 例如数据 流分离 合成 解码 编码等 然后将数据继续往下传输 Rendering Filter 主要负责数据的最终去向 将数据送给显卡 声卡进行多媒体的演示 或者 输出到文件进行存储 2 2 2 针脚 Pin Filter 一般由一个或多个 Pin 组成 Filter 之间通过 Pin 相互连接 构成 一条顺序的链路 Filter 的分类亦可根据 Filter 包含的输入 Pin 或者输出 Pin 的数量进行 如图 2 所示 仅含有输出 Pin 没有输入 Pin 的 Filter 为 Source Filter 既有输入 Pin 又有输出 Pin 的 Filter 为 Transform Filter 仅有输 入 Pin 没有输出 Pin 的 Filter 为 Rendering Filter VC 程序设计报告 图 2 Filter 通过 Pin 连接 2 2 3 Filter Graph 在DirectShow中 一个播放程序必需实例化一个或多个过滤器 并把它们 连接起来 这样数据才能从一个过滤器到达另一个 经过它们的处理 直到表 现过滤器 所有这些过滤器和它们之间的连接被称为过滤器图 Filter Graph 2 2 4 Filter Graph Manager Filter Graph Manager 过滤器图表管理器是DirectShow架构的核心 它是 在过滤器图表中控制各个过滤器的一个COM对象 主要有以下的功能 1 协调Filter之间的状态改变 Graph中的Filter的状态改变应该一致 因此 应用程序并将状态改变的命令直接发给Filter 而是将相应的状态改变的命令 发送给Filter graph Manager 由manager 将命令分发给Graph中每一个 Filter 2 建立一个参考时钟 Graph中的Filter都采用的同一个时钟 参考时钟 reference clock 以确保所有的数据流同步 视频帧或音频帧应该被提交 的时间 presentation time 是相对于参考时钟来确定的 Filter graph Manager 应该选择一个参考时钟 可以选择声卡上的时钟 也可以选择系统时 钟 3 将Graph的消息返回给应用程序 Graph管理器采用事件机制将Graph中发生 的事件通知给应用程序 这个机制类似于Windows 的消息循环机制 4 提供方法构建Filter Graph Graph 管理器给应用程序提供了将Filter 添 加进Graph的方法 连接Filter的方法 断开Filter连接的方法 但是 Graph管理器没有提供如何将数据从一个Filter发送到另一个Filter 的方法 这个工作是由Filter在内部通过Pin来独立完成的 2 3 基于 DirectShow 的应用程序开发 基于 DirectShow 的应用程序开发一般过程如图所示 1 VC 程序设计报告 图 3 基于 DirectShow 的应用程序开发过程 第一阶段 创建一个 Filter Graph Manager 组件 第二阶段 根据实际的应用 创建一条完整的 Filter 链路 第三阶段 调用 Filter Graph Manager 上 或直接在某个 Filter 上 的 各个接口方法进行控制 并且完成 Filter Graph Manager 与应用程序的事件交 互 2 4 播放媒体文件 DirectShow 提供了大量的 Filter 用以支持最基本的应用 根据实际需要 也可以定制自己的 Filter 它的最基本的应用莫过于回放一个媒体文件 如下 图是一个典型的 AVI 文件回放的链路 图 4 本地 AVI 文件的回放链路 其中 箭头方向即使数据的方向 Filter Source 属于 Source Filters 它用于管理硬盘上指定的播放文件 并根据 AVI Splitter 的要求提供数据 AVI Splitter 和 AVI Decompressor 属于 Transform Filters 其中 AVI Splitter 负责向 Filter Source 索取数据 并将取得的音频和视频进行分离 然后分别从各自的输出 pin 输出 AVI Decompressor 负责视频的解码 Video Renderer 和 Default DirectSound Device 负责同步播放声音 3 视频播放器的开发 3 1 开发环境的配置 VC 程序设计报告 选择 Microsoft DirectX 9 0 SDK Summer 2004 和 Microsoft Visual C 6 0 作为 Directshow 播放器的开发平台 3 1 1 下载静态库 strmbasd lib 并复制到 C Program Files Microsoft DirectX 9 0 SDK Summer 2004 Lib 路径下 3 1 2 使用 stdcall 函数调用协议和多线程 c 语言运行时库 即在 VC 菜单中 选择 Project Settings C C 在弹出对话框中 Category 中选择 Code generation 再在 Calling convention 中选择 stdcal l Use run time library 选择 Debug Multithreaded Dll 3 1 3 配置必要的链接库文件 即在 VC 的菜单中选择 Project Settings Link 在弹出对话框中 Category 中选择 General 再在 Object library modules 输入 strmbasd lib uuid lib winmm lib 3 1 4 确认 Direct SDK 的 include 目录和 lib 目录都已经加入到 VC 的系统编 译环境 选择 Tools Options directions 选择 include files 目录 加入如 下路径 图 5 VC 中路径配置 3 2 基于对话框的 MFC 应用程序 使用 VC 的项目向导生成一个基于对话框的 MFC 应用程序 项目名称为 SimplePlayer 并在 CsimplePlayerApp 中添加 COM 库初始化 反初始化代码 BOOL CSimplePlayerApp InitInstance CoInitialize NULL COM 库初始化 CSimplePlayerDlg dlg m pMainWnd int nResponse dlg DoModal VC 程序设计报告 int CSimplePlayerApp ExitInstance CoUninitialize COM 库反初始化 return CWinApp ExitInstance 3 3 编辑对话框界面 在资源编辑器中编辑主对话框界面 如下图 图 6 播放器界面设计 3 4 视频窗口控制 定义一个视频窗口的控制对象 CStatic mVideoWindow 在主对话框的 初始化函数 OnInitDialog 中增加修改视频窗口的函数 mVideoWindow ModifyStyle 0 WS CLIPCHILDREN 并添加 WM ERASEBKGND 消息 响应 代码如下 BOOL CSimplePlayerDlg OnEraseBkgnd CDC pDC 为视频窗口擦除背景 否则当被其他窗口遮蔽后会变成默认的灰色 CRect rc mVideoWindow GetWindowRect 获得窗口的矩形边界 ScreenToClient pDC ExcludeClipRect 排除被视频窗口覆盖的裁剪区域 VC 程序设计报告 return CDialog OnEraseBkgnd pDC 擦除对话框剩下的区域 3 5 封装类 CDXGraph 把 Filter Graph 的各种相关操作封装成一个类 CDXGraph 包括 Filter Graph Manager 的创建及其各种控制接口等 在主对话框类中 定义一个 CDXGraph 的指针 CDXGraph mFilterGraph 3 6 创建 Filter Graph 根据用户选择的源文件 创建相应的回放 Filter Graph 代码如下 void CSimplePlayerDlg DestroyGraph void if mFilterGraph mFilterGraph Stop 停止滤器图表 mFilterGraph SetNotifyWindow NULL 窗口消息处理 delete mFilterGraph mFilterGraph NULL void CSimplePlayerDlg CreateGraph void DestroyGraph 确保 mFilterGraph 为空 mFilterGraph new CDXGraph 新建 Filter Graph if mFilterGraph Create 创建 Filter Graph Manager mFilterGraph RenderFile mSourceFile 获取源数据 mFilterGraph SetDisplayWindow mVideoWindow GetSafeHwnd 设置显示窗口mFilterGraph SetNotifyWindow this GetSafeHwnd VC 程序设计报告 窗口消息处理 mFilterGraph Pause 显示第一帧 3 7 处理 Filter Graph 的事件 3 7 1 消息映射 定义消息映射 代码如下 AFX MSG CSimplePlayerDlg virtual BOOL OnInitDialog afx msg void OnPaint afx msg HCURSOR OnQueryDragIcon afx msg void OnButtonOpen 打开视频文件 afx msg void OnButtonPlay 播放视频文件 afx msg void OnButtonPause 暂停视频文件 afx msg void OnButtonStop 停止视频文件 afx msg void OnTimer UINT nIDEvent 计时器 afx msg void OnHScroll UINT nSBCode UINT nPos CScrollBar pScrollBar 进度条 AFX MSG afx msg LRESULT OnGraphNotify WPARAM inWParam LPARAM inLParam 处理图表事件 DECLARE MESSAGE MAP 3 7 2 图表消息响应函数 LRESULT CSimplePlayerDlg OnGraphNotify WPARAM inWParam LPARAM inLParam IMediaEventEx pEvent NULL VC 程序设计报告 if mFilterGraph unsigned long eventParam1 0 eventParam2 0 while SUCCEEDED pEvent GetEvent 循环从事件队列中获取事件 switch eventCode case EC COMPLETE 播放完成 OnButtonPause mFilterGraph SetCurrentPosition 0 设置当前位置 break case EC USERABORT 用户终止 case EC ERRORABORT 异常 OnButtonStop break default break return 0 VC 程序设计报告 3 7 3 打开按钮响应函数 void CSimplePlayerDlg OnButtonOpen CString strFilter AVI File avi avi 打开文件类型提 示 strFilter MPEG File mpg mpeg mpg mpeg strFilter Wave File wav wav strFilter All Files CfileDialog dlgOpen TRUE NULL NULL OFN PATHMUSTEXIST OFN HIDEREADONLY strFilter this 打开文件对话框 if IDOK dlgOpen DoModal mSourceFile dlgOpen GetPathName CreateGraph 创建相应的回放 Filter Graph 3 7 4 播放按钮响应函数 void CSimplePlayerDlg OnButtonPlay if mFilterGraph mFilterGraph Run 运行图表 if mSliderTimer 0 mSliderTimer SetTimer SLIDER TIMER 100 NULL 设置计 时器 VC 程序设计报告 3 7 5 暂停按钮响应函数 void CSimplePlayerDlg OnButtonPause if mFilterGraph mFilterGraph Pause 暂停图表 if mSliderTimer 0 mSliderTimer SetTimer SLIDER TIMER 100 NULL 开始计 时 3 7 6 停止按钮响应函数 void CSimplePlayerDlg OnButtonStop if mFilterGraph mFilterGraph SetCurrentPosition 0 设置当前位置 mFilterGraph Stop 停止图表 if mSliderTimer KillTimer mSliderTimer 停止计时器 mSliderTimer 0 VC 程序设计报告 3 7 7 进度条的实现 1 为进度条控件添加控制类 CsliderCtrl mSliderGraph 2 在主对话框的初始化函数 OnInitDialog 中 初始化进度控件 mSliderGraph SetRange 0 100 mSliderGraph SetPos 0 3 实现进度的即时显示 用一个定时器 不断地调用 ImediaSeeking GetCurrentPosition 接口方法获得当前的播放时间点 然

温馨提示

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

评论

0/150

提交评论