视频播放器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
视频播放器设计
1 需求分析
由于计算机的普及,极大地改变了人们的生活。随之带来了开发各种软件的需求。家用型计算机主要用于家用软件、学习软件、游戏软件和多媒体和多媒体软件,以及播放CD、VCD、DVD、MP3等多媒体信息。然而多媒体播放器的开发仍然不能满足人们的需求,多媒体文件格式多样,但却没有一款播放器能够满足所有格式的解码。人们渴望解码能力更强大,功能更完备的多媒体播放器。
“多媒体”是一种新型的信息处理与传播技术。有人认为它是信息及其传输媒介方面的一场根本革命。人们对新技术的渴望和欢迎、新奇感和占有欲、宣传热情和赞美态度,是发自内心的。特别是计算机多媒体技术的功能,令人大开眼界,惊叹不已。它在商业、信息检索、文化娱乐和教育等方面的应用效果明显,前景广阔。
由多媒体播放器的开发现状看来,并没有哪一款播放器能适应所有多媒体文件的解读,随着视频、音频的迅猛发展,媒体文件的格式层出不穷,由过往美国在线(AOL)公司的Nullsoft部门开发的Winamp独占鳌头,到Real Networks公司的Real Player和微软公司的Windows Media Player风靡全球,再到如今播放器开发的百花齐放的竞争时代,多媒体播放器的开发经历了许多风浪和变化,但是,仍然没有出现全能的播放器,始终没有跨越编码格式的局限,随着多媒体技术的不断发展,人们对多媒体软件的要求也不断高涨,所以对多媒体软件的开发也成为当今计算机开发的重要课题。目前的音频、视频格式繁多,研制格式覆盖面广的多媒体播放器前景非常广泛。
随着计算机、家电、通信等技术的不断发展,多媒体技术有着广泛的开发前景,尤其是多媒体播放器的开发,开发格式覆盖面更广,兼容性更好,功能更完备的播放器势在必行。本文主要采用C++ Builder2009作为开发工具,设计并实现一个多媒体播放器。可播放MP3,AVI,WMV,WMA,RM,RMVB,SWF等多种格式的多媒体文件,并且能够控制播放,暂停,停止,快进,后退,音量控制的调节,选择上一曲,选择下一曲,图像的显示,文件的计时,列表文件的添减操作等多种播放控制功能,界面简明,操作简单。
2 系统总体设计
2.1DirectShow概述
DirectShow是一种通过自定义或内置的大量的Filter(过滤器)来处理多媒体
数据的体系结构。这些Filter大致分三类:Source Filter(源过滤器)、Transform Filter(转换过滤器)、Render Filter(呈现过滤器)。源过滤器主要负责获取数据,数据源可以是文件、网络、计算机采集卡或数字摄像机里的,然后数据向下传输到Transform Filter,它主要负责数据的格式转换,然后继续向下传输到Render Filter,它主要负责数据的最终去向,将数据送给显卡声卡进行播放或输出变成文件存储起来,见图2-1。
图2-1 DirectShow 开发应用程序原理图
过滤器Filter 是建立在COM 技术基础上的,每个Filter 本身就是一个COM 组件,各个Filter 集合组成过滤器图(Filter .Graph),DirectShow 提供Filter Graph Manager 组件来管理整个过滤器图,比如Filter 间的连接和数据流动。Filter 之间通过Pin(针脚)连接。
更多感性认识DirectShow ,可以DirectX SDK 中的自带的实用的程序
GraphEdit ,位于安装目录\Bin\DXUtils\graphedt.exe 。GraphEdit 是构造Filter Graph Manager 的可视化工具,在GraphEdit 中可以很方便地设计出过滤器图,并验证其可行性。比如:播放一个典型的Demo1.mpg 文件(将文件拖动到GraphEdit 窗口)所自动构建的Filter Graph 。见图2-2。
图2-2 MPEG 文件播放的Filter Graph
如图2所示,箭头方向即是数据的流动,可以看到:MPEG-1 Stream Splitter 属于Source Filters ,负责接收源文件数据;MPEG Audio Decoder 、MPEG Video Decoder 属于Transform Filters ;分别负责视频、
音频的解码;Default DirectSound Device 、Video Renderer 属于Render Filters ,分别负责对视频显示和音频播放。执行菜单Graph->Play ,可以看到播放的影音文件。在Graph->Insert Filters 可以看到DirectShow 提供的大量的支持基本应用的Filter 。
2.2软件的总体架构
图2-3 软件架构
2.3 详细设计与实现
下面在C++ Builder中,利用DirectShow技术设计媒体播放器,介绍了DirectShow程序的一般编写方法。以两种方法实现:一种是直接用DirectX SDK;另一种是用基于DirectShow技术的第三方控件包DsPack。
2.3.1 直接用Direct X SDK中的DirectShow技术的媒体播放器。
用DirectShow编写播放器,可以说主要包括三步:
①创建一个Filter Graph Manager组件。
②根据实际的应用,创建一条完整的链路。比如播放一个本地文件:
m_FilterGraph->RenderFile(“Demo1.mpg”,NULL);
③调用Filter Graph Manager(或某个Filter)上的各个接口方法进行控制。并完成Filter Gramph Manager与应用程序的事件交互。比如IMediaControl接口方法Run()、Stop()来控制媒体的播放与停止。
在本实例中,第一步创建一个Filter Graph Manager组件,由自定义的封装类CDXGraph来完成,它的实现文件是CDXGraph.cpp和CDXGraph.h。第二三步要实现与CDXGraph之问的事件交互。由主窗口MainForm(MainUnit.cpp和MainUnit.h)完成。
该程序部分主要代码如下:
//定义基本接口。IGraphBuilder是最重要的接口,用于构造Filter graph;IMediaControl播放控制接口,控制播放、停止、暂停等;IMediaEventEx:应用程序通过此接口获得播放过程中发生的事件,如播放完毕等。IBasicVideo、IBasicAudio分别是图像和声音控制接口;IVideoWindow视频窗口控制接口;IMediaSeeking用于媒体数据流的定位,提供对播放的精确控制,如获得当前播放位置等。
IGraphBuilder *mGraph;
IMediaControl *mMediaControl;
IMediaEVentEx *mEvent;
IBasicVideo *mBasicVideo;
IBasicAudio *mBasicAudio;
IVideoWindow *mVideoWindow;
IMediaSeeking *mSeeking;
//用API函数初始化COM组件库CoInitialize(NULL);
//创建Filter graph对象,得到IGraphBuilder接口的接口指针mGrph
HRESULT hr=CoCreateInstance(CLSID_FilteGraph,NULL,
CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void * *)&mGraph);
//用QueryInterface()函数获取接口指针
hr = mGraph -> QueryInterface(IID_IMediaControl,
(void * *)&mMediaControl);
hr = mGraph -> QueryInterface(IID_IMediaEventEx,
(void * *)&mEvent);
hr = mGraph -> QueryInterface(IID_IBasicVideo,
(void * *)&mBasicVideo);
hr = mGraph -> QueryInterface(IID_IBasicAudio,
(void * *)&mBasicAudio);
hr = mGraph -> QueryInterface(IID_Ⅳideowindow,