版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 导言 媒体(medium)在计算机行业里,媒体有两种含义:其一是指传播信息的载体,如语言、文字、图像、视频、音频等等;其二是指存贮信息的载体,如ROM、RAM、磁带、磁盘、光盘等,目前,主要的载体有CD-ROM、VCD、网页等。多媒体是近几年者出现的新生事物,正在飞速发展和完善之中。 我们所提到多媒体技术中的媒体主要是指前者,就是利用电脑把文字、图形、影象、动画、声音及视频等媒体信息都数位化,并将其整合在一定的交互式界面上,使电脑具有交互展示不同媒体形态的能力。它极大的改变了人们获取信息的传统方法,符合人们在信息时代的阅读方式。多媒体技术的发展改变了计算机的使用领域,使计算机由办公室、实验
2、室中的专用品变成了信息社会的普通工具,广泛应用于工业生产管理、学校教育、公共信息咨询、商业广告、军事指挥与训练,甚至家庭生活与娱乐等领域。音频技术发展较早,几年前一些技术已经成熟并产品化,甚至进入了家庭,如数字音响。音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。 音频数字化目前是较为成熟的技术,多媒体声卡就是采用此技术而设计的,数字音响也是采用了此技术取代传统的模拟方式而达到了理想的音响效果。音频采样包括两个重要的参数即采样频率和采样数据位数。不同的采样数据位数决定了不同的音质,采样位数越高,存贮数据量越大,音质也越好。但主要方面集中在音频压缩上,目前最新的MPEG语音压
3、缩算法可将声音压缩六倍。语音合成是指将正文合成为语言播放,目前国外几种主要语音的合成水平均已到实用阶段,汉语合成几年来也有突飞猛进的发展,实验系统正在运行。在音频技术中难度最大最吸引人的技术当属语音识别,虽然目前只是处于实验研究阶段,但是广阔的应用前景使之一直成为研究关注的热点之一。 虽然视频技术发展的时间较短,但是产品应用范围已经很大,与MPEG压缩技术结合的产品已开始进入家庭。视频技术包括视频数字化和视频编码技术两个方面。 视频数字化是将模拟视频信号经模数转换和彩色空间变换转为计算机可处理的数字信号,使得计算机可以显示和处理视频信号。目前采样格式有两种:Y:U:V4:1:1和Y:U:V4:
4、2:2,前者是早期产品采用的主要格式,Y:U:V4:2:2格式使得色度信号采样增加了一倍,视频数字化后的色彩、清晰度及稳定性有了明显的改善,是下一代产品的发展方向。视频编码技术是将数字化的视频信号经过编码成为电视信号,从而可以录制到录像带中或在电视上播放。对于不同的应用环境有不同的技术可以采用。2 基于DirectShow的播放器软件开发基础 DirectX是微软推出的一套基于Windows系统的多媒体应用程式接口API函数。在开发中,DX分为两个部分,一个是运行库,通过DX编译出来的程序必须要有运行库的支持,另外一个是开发库,也就是常说的SDK,这部分是在编译DX程序中是必需的。2.1 Mi
5、crosoft DirectShow SDK2.1.1 DirectX及成员组成DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足
6、,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。 DirectX 是一组低级“应用程序编程接口 (API)”,可为 Windows 程序提供高性能的硬件加速多媒体支持。Windows 支持 DirectX 8.0,它能增强计算机的多媒体功能。使用 DirectX 可访问显卡与声卡的功能,从而使程序可提供逼真的三维 (3D) 图形与令人如醉如痴的音乐与声音效果。 DirectX 使程序能够轻松确定计算机的硬件性能,然后设置与之匹配的程序参数。该程序使得多媒体软件程序能够在基于 Windows 的具有 DirectX 兼容硬件与驱动程序的计算机上运行,同时可确保多媒体程序能够充分利
7、用高性能硬件。 DirectX 包含一组 API,通过它能访问高性能硬件的高级功能,如三维图形加速芯片和声卡。这些 API 控制低级功能(其中包括二维 (2D) 图形加速)、支持输入设备(如游戏杆、键盘和鼠标)并控制着混音及声音输出。构成 DirectX 的下列组件支持低级功能: Microsoft DirectDraw Microsoft DirectDraw API 支持快速访问计算机视频适配器的加速硬件功能。它支持在所有视频适配器上显示图形的标准方法,并且使用加速驱动程序时可以更快更直接地访问。DirectDraw 为程序(如游戏和二维图形程序包)以及 Windows 系统组件(如数字视
8、频编解码器)提供了一种独立于设备之外的方法来访问特定显示设备的功能,而不要求用户提供设备功能的其它信息。 Microsoft Direct3D API (Direct3D) :为大多数新视频适配器内置的 3-D 调色功能提供界面。Direct3D 是一种低级的 3-D API,它为软件程序提供一种独立于设备之外的方法以便与加速器硬件进行有效而强大的通信。Direct3D 包含专用 CPU 指令集支持,从而可为新型计算机提供进一步加速支持。 Microsoft DirectSound API :为程序和音频适配器的混音、声音播放和声音捕获功能之间提供了链接。DirectSound 为多媒体软件程
9、序提供低延迟混合、硬件加速以及直接访问声音设备等功能。维护与现有设备驱动程序的兼容性时提供该功能。 Microsoft DirectMusic API :是 DirectX 的交互式音频组件。与捕获和播放数字声音样本的 DirectSound API 不同,DirectMusic 处理数字音频以及基于消息的音乐数据,这些数据是通过声卡或其内置的软件合成器转换成数字音频的。DirectMusic API 支持以“乐器数字界面 (MIDI)”格式进行输入,也支持压缩与未压缩的数字音频格式。DirectMusic 为软件开发人员提供了创建令人陶醉的动态音轨的能力,以响应软件环境中的各种更改,而不只是
10、用户直接输入更改。 Microsoft DirectInput API :为游戏提供高级输入功能并能处理游戏杆以及包括鼠标、键盘和强力反馈游戏控制器在内的其它相关设备的输入。 Microsoft DirectPlay API: 支持通过调制解调器、Internet 或局域网连接游戏。DirectPlay 简化了对通信服务的访问,并提供了一种能够使游戏彼此通信的方法而不受协议或联机服务的限制。DirectPlay 提供了多种游说服务,可简化多媒体播放器游戏的初始化,同时还支持可靠的通信协议以确保重要游戏数据在网络上不会丢失。DirectPlay 8.0 的新功能即支持通过网络进行语音通信,从而可
11、大大提高基于多媒体播放器小组的游戏的娱乐性,同时该组件还通过提供与玩游戏的其他人对话的功能而使团体游戏更具魅力。 Microsoft DirectShow API: 提供了可在您的计算机与 Internet 服务器上进行高品质捕获与回放多媒体文件的功能。DirectShow 支持各种音频与视频格式,包括“高级流式格式 (ASF)”、“音频-视频交错 (AVI)”、“数字视频 (DV)”、“动画专家组 (MPEG)”、“MPEG 音频层 3 (MP3)”、 “Windows 媒体音频/视频 (WMA/WMV)”以及 WAV 文件。DirectShow 还具有视频捕获、DVD 回放、视频编辑与混合
12、、硬件加速视频解码以及调谐广播模拟与数字电视信号等功能。2.1.2 DirectShow SDKDirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,与DirectX开发包一起发布。目前,DirectX最新版本为9.0。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取
13、变得更加方便。 它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。 DirectShow使用一种叫Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter;各个Filter在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。大家可以看到,按照功能来分,Filter大致分为三类:Sour
14、ce Filters、Transform Filters和Rendering Filters。Source Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;Transform Fitlers主要负责数据的格式转换、传输;Rendering Filtes主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。值得注意的是,三个部分并不是都只有一个Filter去完成功能。恰恰相反,每个部分往往是有几个Fitler协同工作的。比如,Transform Filters可能包含了一个Mpeg的解码F
15、ilter、以及视频色彩空间的转换Filter、音频采样频率转换Filter等等。除了系统提供的大量Filter外,我们可以定制自己的Filter,以完成我们需要的功能2.2 DirectShow开发环境配置2.2.1 生成DirectShow开发库使用DirectShow SDK开发用户自己的程序需要几个静态链接库:quartz.lib、strmbasd.lib 、STRMBASE.Lib、和strmiids.Lib。中间两个lib需要用户自己编译生成,而其他两个微软已经提供。表1列出了使用DirectShow SDK开发程序所有要使用的库。表1 DirectShow SDK常用库库名功能说
16、明strmiids.lib定义了DirectShow标准的输出类标志(CLSID)和接口标识(IID)strmbasd.lib流媒体开发用到的库,Debug、Debug_Unicode版本STRMBASE.Lib流媒体开发用到的库,Release、Release_Unicode版本quartz.lib定义了导出函数AMGetErrorTextwinmm.lib使用Windows多媒体编程用到的库基于VC+2005开发软件使用的DirectShow SDK,首先需要用户编译DirectShow自带的源码工程baseclasses,以生成DirectShow SDK的不同版本的库。同时由于Dire
17、ctShow SDK是早期的VC开发软件,所以在使用VC+2005时要注意出现的编译问题。2.2.2 Visual C+开发环境配置有了DirectShow SDK库,用户就可以使用这些库来开发自己的程序了。为了能让VC+自动搜寻到SDK库和头文件,还需要对VC+的开发环境进行配置。添加库或路径的时候,根据要求,添加Debug、Release、Debug_Unicode、Release_Unicode版本的库所在的路径。2.2.2.1 更改添加include路径D:DXSDKIncludeD:DXSDKSamplesC+DirectShowBaseClassesD:DXSDKSamplesC+
18、CommonInclude2.2.2.2 更改添加lib路径D:DXSDKLibD:DXSDKSamplesC+DirectShowBaseClassesDebugD:DXSDKSamplesC+DirectShowBaseClassesDebug_UnicodeD:DXSDKSamplesC+DirectShowBaseClassesReleaseD:DXSDKSamplesC+DirectShowBaseClassesRelease_Unicode2.2.2.3 添加链接库支持基于DirectShow SDK开发流媒体应用程序,一般需要链接strmiids.Lib和quartz.Lib,前
19、者定义了DirectShow标准的输出类标志(CLSID)和接口标识(IID),后者定义了导出函数AMGetErrorText。在编译生成DirectShow的baseclasses库strmbasd.Lib、STRMBASE.Lib时,由于该工程是生成库而不是应用程序,所以在编译该项目时VC+2005没有链接器选项。但是在开发其他应用可执行程序时,需要添加DirectShow SDK库的支持。添加路径:项目>属性>配置属性>链接器>输入>附加依赖选项,输入strmiids.Lib和quartz.Lib。在程序中使用DirectShow SDK类或接口的代码中,还
20、要添加#include <dshow.h>。如果程序中没有使用dshow,而是包含了streams.h,则库文件需要链接strmbasd.lib、winmm.lib。3 基于DIRECTSHOW的播放器软件设计的具体实现3.1 系统分析设计3.1.1 FilterGraph 结构设计 滤波链表管理器(Filter Graph Manager)控制和管理插入的各种滤波器,判断其引脚(Pin)的方向和媒体类型,根据滤波器的类型决定是否可以连接。多媒体播放器的一大特点是播放时我们预先不知道媒体格式,也不知道该用哪种解码器。但是,DirectShow可以通过IGraphBuilder接口的
21、RenderFile方法,自动剖析媒体格式并连接系统中的解码器。接着,就可以使用IMediaControl控制流媒体播放、暂停和停止。IMediaEventEx控制媒体消息和状态;IMediaSeeking控制媒体播放位置和速度。以上所有这些滤波器及接口就是利用IGraphBuilder接口作为滤波器链表管理器(Filter Graph Manager)的。3.1.2 GraphEdit模拟实现 我们已经知道GraphEdit管理滤波器的插入、连接和运行,以快速构建一个使用DirectShow的滤波器链表。我们设计使用DirectShow的多媒体播放器,首先借助GraphEdit模拟实现,验证
22、插入的滤波器的运行特点,体会滤波器的操作过程。现在以回放预先捕获的纯视频文件D:Example.avi,使用该工具软件完成媒体播放。启动GraphEdit.Exe,选择“开始”->“程序”->“Microsoft DirectX 9.0 SDK”->“DirectX Utilites”->“GraphEdit”,如图1。 图1 GraphEdit工具单击工具栏中的Insert Filter按钮,开启“Which filters do you want to insert?”对话框。如图2 图2 滤波器管理对话框 图3 插入滤波器 单击“DirectShow Filter
23、s”前的加号,展开所属子项,如图3 所示。选择“file source”子项,单击“inert Filters”按钮插入原滤波器。在第3步中,会弹出选择文件对话框。选择预回放的avi文件,这里选择的是“example.Avi”然后单击打开按钮。单击图3 中“DirectShow Filters”下的“Vedio Rederer”子项,单击图3.3中“insert Filter”按钮。结果如图4。图4 插入滤波器后界面最后连接滤波器的引脚,“output”引脚接“VMR Input0”引脚,如图5所示。我们发现,由原先的两个滤波器增加了“avi spliter”和“color space con
24、verter”滤波器,实际上这个过程就是DirectShow的接口自动判断媒体类型,添加滤波器而智能链接的。图5 链接滤波器引脚图至此,就完成了构建回放example.Avi文件的滤波器链表。单击工具栏中播放按钮,运行链表,就能播放媒体文件了。3.1.3 界面设计我设计的流媒体播放器的主界面类似于操作系统的传统媒体播放器(media player)。以对话框的形式设计主界面,窗口内支持右键快捷菜单。3.1.3.1 创建对话框应用程序启动Visual Studio 2005 选择“文件”->“新建”->“项目”命令,启动“新建项目对话框。选择项目类型中的“Visual C+”选项下的
25、“MFC”子项,然后选中右边的模板“MFC应用程序”。将项目命名为MediaPlayer,确定存放位置。然后单击确定,启动了“MFC应用程序向导”。单击下一步按钮,选择应用程序类型。VC+2005支持单文档、多个文档和对话框应用程序,选择MFC的使用方式,选择程序是否使用Unicode库。这里只改变应用程序类型为“基于对话框”。单击下一步,选择界面功能。主框架样式包括最小化框、最大化框、最小化、最大化、系统菜单和关于框,将对话框的标题设置为“多媒体播放器”。单击下一步,选择程序高级功能。这些功能包括上下文的帮助、是否支持ActiveX控件、Windows套接字等功能。设置向导生成的类。可以更改
26、类名。单击完成,至此建立了对话框应用程序的基本框架。3.1.3.2 修改对话框添加6个按钮控件button、2个滑动条控件slider control和1个图像控件picture control。表2 控件列表控件说明IDC_BUTTON_OPEN“打开”按钮控件DC_BUTTON_PLAY “播放”按钮控件IDC_BUTTON_PAUSE“暂停”按钮控件IDC_BUTTON_STOP“停止”按钮控件IDC_BUTTON_GRASP“抓图”按钮控件IDC_BUTTON_EXIT“退出”按钮控件IDC_SLIDER_PLAY播放滑动条按钮控件IDC_SLIDER_VOLUME 声音滑动条按钮控件
27、IDC_VIDEO_WINDOW图像显示按钮控件3.1.3.3 添加菜单资源在确保项目已经打开的情况下,选择VC+2005的视图->资源试图命令。在资源试图属性页内单击右键,选择添加资源命令,激活添加资源对话框。选择Menu子项,然后单击新建。单击“请在此键入”,输入菜单内容,依次根据表3中的菜单内容添加菜单。表3 菜单列表菜单说明ID_MENU_OPENFILE打开媒体文件ID_MENU_CLOSEFILE 关闭媒体文件ID_MENU_PLAY播放媒体文件ID_MENU_STOP停止媒体文件ID_MENU_NORMALRATE正常播放速率ID_MENU_HALFRATE1/2速率播放文
28、件ID_MENU_DOUBLERATE双倍速率播放文件ID_MENU_GRABIMAGE抓图并存盘ID_MENU_FULLSCREEN全屏显示图像ID_MENU_MUTE静音开关控制ID_MENU_ALWAYSONTOP窗口总在最顶端显示ID_MENU_EXIT退出多媒体播放器3.1.3.4 添加位图资源在添加资源对话框中,选中Bitmap选项,然后单击导入按钮,在弹出对话框中选择一个图片文件并将其打开。命名其ID为IDB_BITMAP_BKGROUND,将该图片作为背景欢迎图片。3.2 实现媒体控制类DirectShow SDK对开发者来说是一套库函数,使用过程大体来说是先创建,然后使用,最
29、后销毁,媒体的播放控制和图像显示等动作都是由SDK完成的。为了系统开发方便、易升级和功能扩展,作者把有关SDK的功能开发函数封装在类CDXGraph中。应用程序使用其中的成员函数和变量完成媒体的播放及显示,该类包含了回放媒体时需要的几乎所有动作和控制方法,该方案使用了大部分成员函数,还有少量方法函数没有使用。开发者可以在该案例基础上,使用该类构建出功能更强大、回放控制更灵活的多媒体播放器。3.2.1 CDXGraph类初始化CDXGraph类封装了有关DirectShow的接口和方法。CDXGraph类的实现在CDXGraph.cpp中,头文件为CDXGraph.h。CDXGraph类为播放媒
30、体文件准备了几乎所有的操作,包括音频控制、抓图、全屏和任意定位等高级功能。具体代码如下:class CDXGraphpublic:IGraphBuilder*pGraph;/滤波器链表管理器IMediaControl*pMediaControl;/媒体控制接口,如run、stop、pauseIMediaEventEx*pMediaEvent;/媒体事件接口IBasicVideo*pBasicVideo;/视频基本接口IBasicAudio*pBasicAudio;/音频基本接口IVideoWindow*pVideoWindow;/视频窗口接口IMediaSeeking*pMediaSeekin
31、g;/媒体定位接口public:CDXGraph();virtual CDXGraph();public:virtual bool Create(void);/生成滤波器链表管理器virtual void Release(void);/释放所有接口virtual bool Attach(IGraphBuilder * inGraphBuilder);/IGraphBuilder * GetGraph(void);/Not outstanding reference countIMediaEventEx * GetEventHandle(void);/返回IMediaEventEx指针/根据引脚
32、方向连接滤波器bool ConnectFilters(IPin * inOutputPin, IPin * inInputPin, const AM_MEDIA_TYPE * inMediaType = 0);/断开连接滤波器void DisconnectFilters(IPin * inOutputPin);/设置显示窗口bool SetDisplayWindow(HWND inWindow);/设置窗口通知消息bool SetNotifyWindow(HWND inWindow);/窗口大小改变处理函数bool ResizeVideoWindow(long inLeft, long inT
33、op, long inWidth, long inHeight);/处理事件void HandleEvent(WPARAM inWParam, LPARAM inLParam);/媒体运行状态bool Run(void); / Control filter graphbool Stop(void);bool Pause(void);bool IsRunning(void); / Filter graph statusbool IsStopped(void);bool IsPaused(void);/设置显示窗口全屏显示bool SetFullScreen(BOOL inEnabled);boo
34、l GetFullScreen(void);/ 媒体定位bool GetCurrentPosition(double * outPosition);bool GetStopPosition(double * outPosition);bool SetCurrentPosition(double inPosition);bool SetStartStopPosition(double inStart, double inStop);bool GetDuration(double * outDuration);bool SetPlaybackRate(double inRate);/设置媒体音量:
35、 range from -10000 to 0, and 0 is FULL_VOLUME.bool SetAudioVolume(long inVolume);long GetAudioVolume(void);/设置音频平衡: range from -10000(left) to 10000(right), and 0 is both.bool SetAudioBalance(long inBalance);long GetAudioBalance(void);/剖析媒体文件/bool RenderFile(char * inFile);bool RenderFile(TCHAR * in
36、File);/抓图bool SnapshotBitmap(TCHAR *outFile);/const char * outFile);int m_nVolume;void ChangeAudioVolume(int nVolume);/静音开关void Mute();void UnMute();private:/供GraphEdit调试时使用void AddToObjectTable(void) ;void RemoveFromObjectTable(void);/查询有关接口bool QueryInterfaces(void);类的构造器中将所有的指针清零。同时,MediaPlayer.c
37、pp文件的IniInstance()函数中对COM初始化:CoInitialize();。3.2.2 创建Graph滤波器链表根据上一章介绍的使用DirectShow开发流媒体应用程序,首先创建滤波器链表管理器,然后在该链表下查询、使用各种接口,包括媒体控制接口、媒体事件接口、基类音频、视频接口、视频窗口接口、媒体定位接口等。创建滤波链表管理Graph图的代码如下:bool CDXGraph:Create(void)if (!pGraph)/创建滤波链表管理器pGraphif(SUCCEEDED(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_IN
38、PROC_SERVER,IID_IGraphBuilder, (void *)&pGraph)AddToObjectTable();/添加到目标列表以使用GraphEdit调试/访问pGraph中有关接口return QueryInterfaces();pGraph = 0;return false;上述程序中,如果滤波器链表不为空,即再次调用该函数则不再重复创建。若为空,则创建链表管理器pGraph,然后把pGraph添加到目标列表以便于使用GraphEdit程序进行调试。最后基于pGraph查询各种接口。在滤波链表管理器pGraph中,查询、初始化必须的DirectShow接口。b
39、ool CDXGraph:QueryInterfaces(void)if (pGraph)HRESULT hr = NOERROR;/查询媒体控制接口hr |= pGraph->QueryInterface(IID_IMediaControl, (void *)&pMediaControl);/查询媒体事件接口hr |= pGraph->QueryInterface(IID_IMediaEventEx, (void *)&pMediaEvent);/查询基类视频接口hr |= pGraph->QueryInterface(IID_IBasicVideo, (v
40、oid *)&pBasicVideo);/查询基类音频接口hr |= pGraph->QueryInterface(IID_IBasicAudio, (void *)&pBasicAudio);/查询视频窗口接口hr |= pGraph->QueryInterface(IID_IVideoWindow, (void *)&pVideoWindow);/查询媒体定位接口hr |= pGraph->QueryInterface(IID_IMediaSeeking, (void *)&pMediaSeeking);if (pMediaSeeking)
41、/查询媒体定位接口成功,则设置时间格式pMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);return SUCCEEDED(hr);return false;上述程序中,在滤波器管理器不为空的情况下,查询各种必需的接口。每次操作的结果放置在hr中,最后判断hr的值。3.2.3 图像窗口设计首先打开媒体文件,渲染、剖析其媒体格式并连接对应解码器。bool CDXGraph:RenderFile(TCHAR * inFile)if (pGraph)if (SUCCEEDED(pGraph->RenderFile(inFil
42、e, NULL)/渲染媒体文件,构建滤波器链表,若成功则返回真值。return true;return false;上述程序中,由于传入的文件名是单字符串,但是DirectShow SDK底层使用的是宽字符串,所以需要首先进行转换,然后调用链表管理器的方法RenderFile,自动剖析媒体格式,选择对应的滤波器并连接起来,最后成功则返回真值,否则返回值“0”。设置媒体显示窗口,把输入窗口句柄与DirectShow控制接口pVideoWindow捆绑。bool CDXGraph:SetDisplayWindow(HWND inWindow)if (pVideoWindow)/ 首先隐藏视频窗口p
43、VideoWindow->put_Visible(OAFALSE);pVideoWindow->put_Owner(OAHWND)inWindow); /获取输入窗口的显示区域RECT windowRect;:GetClientRect(inWindow, &windowRect);pVideoWindow->put_Left(0);pVideoWindow->put_Top(0);pVideoWindow->put_Width(windowRect.right - windowRect.left);pVideoWindow->put_Height(
44、windowRect.bottom - windowRect.top);pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);pVideoWindow->put_MessageDrain(OAHWND) inWindow);/ 回复视频窗口if (inWindow != NULL)pVideoWindow->put_Visible(OATRUE);elsepVideoWindow->put_Visible(OAFALSE);return true;return false;上述程序
45、的任务是把传入的视频窗口与DirectShow的视频窗口接口捆绑。首先隐藏视频窗口,设置视频窗口所属为传入的显示窗口。然后获取传入的显示窗口的区域,并把该区域设置到DirectShow的视频窗口,包括左边、上边的起点坐标、窗口的宽和高、窗口的显示模式及窗口的消息处理方式等。最后恢复视频窗口,完成视频窗口的设置。设置窗口消息通知,首先在文件CDXGraph.h中自定义消息WM_GRAPHNOTIFY#define WM_GRAPHNOTIFY (WM_USER+20)实现窗口消息、事件通知函数SetNotifyWindow,输入显示窗口句柄inWindowbool CDXGraph:SetNot
46、ifyWindow(HWND inWindow)if (pMediaEvent)pMediaEvent->SetNotifyWindow(OAHWND)inWindow, WM_GRAPHNOTIFY, 0);return true;return false;上述程序实现消息处理的窗口设置,媒体的播放等事件以消息的方式通知给主窗口。消息标识为用户自定义。3.2.4 媒体播放控制媒体控制包括运行(Run)、暂停(pause)、停止(stop),播放媒体的定位和静音开关。if (pGraph && pMediaControl)if (!IsRunning()if (SUCCE
47、EDED(pMediaControl->Run()return true;程序中,3个操作过程基本相同,首先判断链表和媒体控制接口不为空,则判断是否处于待检查的状态,如果没有则开始执行,然后返回真值表示成功,否则返回0。媒体播放的定位,包括文件时间长度、设置/获取当前播放位置和设置回放速率等。bool CDXGraph:GetDuration(double * outDuration)if (pMediaSeeking)_int64 length = 0;if (SUCCEEDED(pMediaSeeking->GetDuration(&length)*outDuratio
48、n = (double)length) / 10000000.;return true;return false;bool CDXGraph:GetCurrentPosition(double * outPosition).bool CDXGraph:SetCurrentPosition(double inPosition).bool CDXGraph:SetPlaybackRate(double inRate).上述程序是对文件播放的定位设置。设置过程基本相同,首先确保媒体定位接口不为空,然后使用媒体定位接口下的方法实现定位。需要特别注意的是定位的单位为100ns,而外部时间是以秒为单位的,
49、注意之间转换。静音开关的操作代码如下:pBasicAudio->put_Volume(-10000);long lVolume = (m_nVolume - 100) * 100;pBasicAudio->put_Volume(lVolume);静音开关是通过使用基类音频的方法put_Volume完成的,静音是把音量值设置为最小(-10000),关闭静音即恢复原来的音量。3.2.5 全屏显示及抓图存盘实现全屏显示是媒体播放器最基本的功能之一,DirectShow的视频窗口接口有专门的方法支持片、全屏显示功能。抓图存盘也是播放器基本功能,基类视频接口提供获取当前播放的视频帧数据。bo
50、ol CDXGraph:SetFullScreen(BOOL inEnabled)if (pVideoWindow)HRESULT hr = pVideoWindow->put_FullScreenMode(inEnabled?OATRUE : OAFALSE);return SUCCEEDED(hr);return false;上述程序传入BOOL值表示是否设置为全屏显示,函数put_FullScreenMode是视频窗口接口方法。3.3 实现一个简单的媒体播放器最简单的媒体播放器包括打开、播放和停止文件。现在就来实现这个最简单的播放器。为打开按钮添加鼠标单击事件响应,双击按钮。voi
51、d CMediaPlayerDlg:OnBnClickedButtonOpen()CString strFilter = _T("AVI File (*.avi) | *.avi|");strFilter += "MPEG File (*.mpg; *.mpeg) | *.mpg; *.mpeg|"strFilter += "MP3 File (*.mp3) | *.mp3|"strFilter += "WMA File (*.wma) | *.wma|"strFilter += "All File (*
52、.*) | *.*|"CFileDialog dlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, strFilter, this);if (dlg.DoModal() = IDOK)m_sourceFile = dlg.GetPathName();m_mediaFileName =GetFileTitleFromFileName(m_sourceFile,1);CreateGraph();上述程序中,以只读方式打开文件,且过滤出流媒体文件格式。获取媒体格式的路径和文件名。然后根据媒体文件名创建滤波器链表,链接这些滤波器。
53、剖析媒体文件格式,自动查询对应的解码器,并播放第一帧流媒体数据,然后暂停。渲染媒体文件,把显示图像窗口与DirectShow SDK的视频窗口接口捆绑,如下:void CMediaPlayerDlg:CreateGraph()DestroyGraph(); /销毁滤波器链表图m_pFilterGraph = new CDXGraph(); /创建CDXGraph对象if (m_pFilterGraph->Create() /创建滤波器链表管理器/if (!m_pFilterGraph->RenderFile(ch)/渲染媒体文件,构建滤波器链表TCHAR *ch1 = m_sour
54、ceFile.GetBuffer(m_sourceFile.GetLength();if (!m_pFilterGraph->RenderFile(ch1)/渲染媒体文件,构建滤波器链表MessageBox(_T("无法渲染此媒体文件!请确认是否安装相关解码器插件!n 或者此媒体文件已损坏!"),_T("系统提示"),MB_ICONWARNING); return;m_sourceFile.ReleaseBuffer(); /设置图像显示窗口m_pFilterGraph->SetDisplayWindow(m_videoWindow.GetS
55、afeHwnd(); /设置窗口消息通知m_pFilterGraph->SetNotifyWindow(this->GetSafeHwnd();/显示第一帧图像m_pFilterGraph->Pause();是否是否销毁滤波器链表图是否成功创建CDXGraph对象构建滤波器链表创建滤波器链表管理器渲染媒体文件设置窗口消息通知设置图像显示窗口显示第一帧图像是否成功弹出提示消息窗口返回图6 媒体播放流程图由于所有对DirectShow SDK的控制是封装在类CDXGraph中实现的,所以首先创建一个CDXGraph对象,然后创建滤波器链表管理器,接着把读取文件路径名修改为宽字符形式。渲染媒体文件,自动剖析媒体格式,构建滤波器链表。若渲染成功,则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年活动视频剪辑服务合同
- 2026年网站维护合同协议2026
- 土地承包经营权合同2026年分配协议
- 2026年薪资变更合同
- 云服务器租用合同2026年技术支持
- 《信息技术基础(上册)》课件 模块三课题五
- 家用电器和用火安全课件
- 家校社家长培训课件
- 培训课件质量要求
- 教练安全道德课件
- 20G520-1-2钢吊车梁(6m-9m)2020年合订本
- 范里安-微观经济学:现代观点1
- GB/T 18659-2023封闭管道中流体流量的测量电磁流量计使用指南
- 商业银行经营学(第六版)全书电子教案
- 九九乘除法口诀空表(A4打印版)
- 天线产品及技术培训材料
- 哈弗H7保养手册
- 化工原理课程设计-乙醇-水体系常压二元填料精馏塔设计
- 110kv变电站安全距离110kv变电站设计规范
- 机场ppt课件 140414-机场灯光
- 材料力学课件压杆的稳定性
评论
0/150
提交评论