您好,欢迎访问三七文档
视频播放器设计1需求分析由于计算机的普及,极大地改变了人们的生活。随之带来了开发各种软件的需求。家用型计算机主要用于家用软件、学习软件、游戏软件和多媒体和多媒体软件,以及播放CD、VCD、DVD、MP3等多媒体信息。然而多媒体播放器的开发仍然不能满足人们的需求,多媒体文件格式多样,但却没有一款播放器能够满足所有格式的解码。人们渴望解码能力更强大,功能更完备的多媒体播放器。“多媒体”是一种新型的信息处理与传播技术。有人认为它是信息及其传输媒介方面的一场根本革命。人们对新技术的渴望和欢迎、新奇感和占有欲、宣传热情和赞美态度,是发自内心的。特别是计算机多媒体技术的功能,令人大开眼界,惊叹不已。它在商业、信息检索、文化娱乐和教育等方面的应用效果明显,前景广阔。由多媒体播放器的开发现状看来,并没有哪一款播放器能适应所有多媒体文件的解读,随着视频、音频的迅猛发展,媒体文件的格式层出不穷,由过往美国在线(AOL)公司的Nullsoft部门开发的Winamp独占鳌头,到RealNetworks公司的RealPlayer和微软公司的WindowsMediaPlayer风靡全球,再到如今播放器开发的百花齐放的竞争时代,多媒体播放器的开发经历了许多风浪和变化,但是,仍然没有出现全能的播放器,始终没有跨越编码格式的局限,随着多媒体技术的不断发展,人们对多媒体软件的要求也不断高涨,所以对多媒体软件的开发也成为当今计算机开发的重要课题。目前的音频、视频格式繁多,研制格式覆盖面广的多媒体播放器前景非常广泛。随着计算机、家电、通信等技术的不断发展,多媒体技术有着广泛的开发前景,尤其是多媒体播放器的开发,开发格式覆盖面更广,兼容性更好,功能更完备的播放器势在必行。本文主要采用C++Builder2009作为开发工具,设计并实现一个多媒体播放器。可播放MP3,AVI,WMV,WMA,RM,RMVB,SWF等多种格式的多媒体文件,并且能够控制播放,暂停,停止,快进,后退,音量控制的调节,选择上一曲,选择下一曲,图像的显示,文件的计时,列表文件的添减操作等多种播放控制功能,界面简明,操作简单。2系统总体设计2.1DirectShow概述DirectShow是一种通过自定义或内置的大量的Filter(过滤器)来处理多媒体数据的体系结构。这些Filter大致分三类:SourceFilter(源过滤器)、TransformFilter(转换过滤器)、RenderFilter(呈现过滤器)。源过滤器主要负责获取数据,数据源可以是文件、网络、计算机采集卡或数字摄像机里的,然后数据向下传输到TransformFilter,它主要负责数据的格式转换,然后继续向下传输到RenderFilter,它主要负责数据的最终去向,将数据送给显卡声卡进行播放或输出变成文件存储起来,见图2-1。DirectShow应用程序源过滤器SourceFilters转换过滤器TransformFilters呈现过滤器RenderFilters过滤器图表管理器FiltersGraphManager应用程序应用程序音视频采集设备各种软硬件解码器声卡显卡事件命令图2-1DirectShow开发应用程序原理图过滤器Filter是建立在COM技术基础上的,每个Filter本身就是一个COM组件,各个Filter集合组成过滤器图(Filter.Graph),DirectShow提供FilterGraphManager组件来管理整个过滤器图,比如Filter间的连接和数据流动。Filter之间通过Pin(针脚)连接。更多感性认识DirectShow,可以DirectXSDK中的自带的实用的程序GraphEdit,位于安装目录\Bin\DXUtils\graphedt.exe。GraphEdit是构造FilterGraphManager的可视化工具,在GraphEdit中可以很方便地设计出过滤器图,并验证其可行性。比如:播放一个典型的Demo1.mpg文件(将文件拖动到GraphEdit窗口)所自动构建的FilterGraph。见图2-2。Demo.mpgMPEGAudioDecoderMPEG-1StreamSplitterMPEGVideoDecoderVideoRendererDefaultDirectSoundDevice图2-2MPEG文件播放的FilterGraph如图2所示,箭头方向即是数据的流动,可以看到:MPEG-1StreamSplitter属于SourceFilters,负责接收源文件数据;MPEGAudioDecoder、MPEGVideoDecoder属于TransformFilters;分别负责视频、音频的解码;DefaultDirectSoundDevice、VideoRenderer属于RenderFilters,分别负责对视频显示和音频播放。执行菜单Graph-Play,可以看到播放的影音文件。在Graph-InsertFilters可以看到DirectShow提供的大量的支持基本应用的Filter。2.2软件的总体架构AVI视频RMVB视频视频指针解码主界面用户图2-3软件架构2.3详细设计与实现下面在C++Builder中,利用DirectShow技术设计媒体播放器,介绍了DirectShow程序的一般编写方法。以两种方法实现:一种是直接用DirectXSDK;另一种是用基于DirectShow技术的第三方控件包DsPack。2.3.1直接用DirectXSDK中的DirectShow技术的媒体播放器。用DirectShow编写播放器,可以说主要包括三步:①创建一个FilterGraphManager组件。②根据实际的应用,创建一条完整的链路。比如播放一个本地文件:m_FilterGraph-RenderFile(“Demo1.mpg”,NULL);③调用FilterGraphManager(或某个Filter)上的各个接口方法进行控制。并完成FilterGramphManager与应用程序的事件交互。比如IMediaControl接口方法Run()、Stop()来控制媒体的播放与停止。在本实例中,第一步创建一个FilterGraphManager组件,由自定义的封装类CDXGraph来完成,它的实现文件是CDXGraph.cpp和CDXGraph.h。第二三步要实现与CDXGraph之问的事件交互。由主窗口MainForm(MainUnit.cpp和MainUnit.h)完成。该程序部分主要代码如下://定义基本接口。IGraphBuilder是最重要的接口,用于构造Filtergraph;IMediaControl播放控制接口,控制播放、停止、暂停等;IMediaEventEx:应用程序通过此接口获得播放过程中发生的事件,如播放完毕等。IBasicVideo、IBasicAudio分别是图像和声音控制接口;IVideoWindow视频窗口控制接口;IMediaSeeking用于媒体数据流的定位,提供对播放的精确控制,如获得当前播放位置等。IGraphBuilder*mGraph;IMediaControl*mMediaControl;IMediaEVentEx*mEvent;IBasicVideo*mBasicVideo;IBasicAudio*mBasicAudio;IVideoWindow*mVideoWindow;IMediaSeeking*mSeeking;//用API函数初始化COM组件库CoInitialize(NULL);//创建Filtergraph对象,得到IGraphBuilder接口的接口指针mGrphHRESULThr=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,(void**)&mVideowindow);hf=mGraph-QueryInterface(IID_lMediaSeeking,(void**)&mseeking);//连接输入输出Pin针脚,连接各个Filterhr=mGraph-ConnectDirect(inOutputPin,inInputPin,inMediaTyp);//IGraphBuilder接口的方法RenderFile来连接给定的媒体文件,完成FilterGraph的构建。m_FilterGraph-RenderFile(m_SourceFile.c_str());//设置视频窗口并设置消息通知窗口m_FilteGraph-SetDisplaywindow(Panell-Handle);m_FilteGraph-SetNotifyWindow(this-Handle);//开始播放m_FilteGraph-Run();……//关闭COM组件库,释放资源CoUtlinitialize();2.3.2基于DirectShow技术的第三方控件包DSPack的媒体播放器Dspack2.34是C++Builder中用于做DirectShow开发的免费VCL控件。下载地址:.progdigy.com/。DSPack的安装可以参考相关文档。图2-4组件面板上的DSPack2.34Dspack2.34中有七个组件:FilterGraph、VideoWindow、SampleGrabber、Filter、ASFWriter、DSTrackBar、DSVideoWindowEx2。见图5-1。FilterGraph组件基本对应于DirectShow中的FilterGraphManager,FilterGraph的创建和控制由它完成。Filter组件可以充当DirectShow中的各种Filter,VideoWindow组件相当于是一个RenderingFilter,用来显示采集到的视频图像。其它各组件的详细说明可以参照DSPack安装目录下的帮助文档help.chm[2-3]。程序由一个主窗体MainForm组成。MainForm窗体上放置FilterGraph组件,属性Name命名为FilterGraph,Mode属性为gmNormal;放置VideoWindow组件,FilterGraph属性设置为FilterGraph;放置DSTrackBar组件,用于显示播放进度;其它放置0penDialog、MainMenu、四个Button组件,Caption分别设置为打开、播放、暂停、停止。MainForm中主要代码如下:Buttonl的0nclick事件添加如下代码:if(0penDialog-Execute())|FilterGraph-Active=TRUE;//初始化各个Filter,并建立FilterGraphFilterGraph-RenderFile(OpenDialog-FileNalm);//播放文件名给FilterGraph}Button2的OnClick事件添加如下代码:FilterGraph-Play();//控制FilterGraph的播放Button3、Button
本文标题:视频播放器设计分析
链接地址:https://www.777doc.com/doc-4587335 .html