第三篇多媒体开发与编程多媒体开发是多媒体技术的一个重要方面,也是计算机专业人员可充分发挥自己长处的地方。
本篇主要介绍,在Windows环境下进行多媒体开发的,各种应用程序编程接口的使用方法。
本篇首先介绍多媒体开发的一般概念,比较两类媒体集成工具的优劣;接着给出在Windows中播放波形音频的方法与函数;然后通过实例,介绍基于ActiveX控件的媒体播放器编程。
本篇的重点之一是讨论传统的Windows高/底层多媒体编程接口MCI和MMAPI,对后者主要介绍MIDI和MMIO编程。
本篇的另一个重点内容,是介绍微软公司所推崇的(多媒体和计算机游戏的开发接口)DirectX SDK编程。
先概述DirectX的发展历史和版本演化、功能结构与组件模块,重点介绍DirectX的主要组件Direct3D和DirectSound的基本编程方法,并给出若干实例。
本篇包含如下3章:●第12章多媒体开发与音视频播放●第13章MCI和MMAPI编程●第14章DirectX编程简介第12章多媒体开发与音视频播放本章先介绍多媒体开发的要素、过程、人员和工具,然后给出播放波形音频文件的3个高层函数,最后通过实例介绍基于ActiveX控件的媒体播放器编程。
12.1 多媒体开发概述多媒体的开发有人、环境和工具三个要素,其开发过程与人员有关,其开发工具分为素材准备和媒体集成两大类,而其中的媒体集成工具又可分成编程和著作两类。
12.1.1 开发要素●人——开发者= 设计人员+ 编程人员●环境——软硬件= 多媒体计算机+ 多媒体操作系统●工具——开发软件= 素材准备工具+ 媒体集成工具(编程/著作)12.1.2 开发过程与人员多媒体开发的过程与相关人员如图12-1所示。
图12-1 多媒体的开发过程与相关人员12.1.3 开发工具多媒体的开发工具可以分为素材准备和媒体集成两大类,而其中的集成工具又可进一步分成编程和著作两类。
本书重点介绍集成工具中的编程类。
1.素材准备工具素材准备和媒体编辑的用软件有:●文字:Word、WordPerfect、WPS、Cool 3D;●音频:Cool Edit、Audio Editor、Wave Flow、Cakewalk;●图形:Illustrator、Corel Draw、AutoCAD;●图像:Photoshop、ACDSee;●动画:Flash、Silverlight/Expression Blend、GIF Animator、3DS、Maya;●视频:Video Studio、Premiere、After Effects;●综合:MediaStudio、Fireworks。
2.媒体集成工具多媒体的集成工具有两类:著作与编程,前者针对普通用户,后者则为计算机专业人员所使用。
1)著作工具可将著作工具分成如下4类:●基于图标(流程图)——按对象/事件顺序组织数据,以流程图为骨干,通用。
如Authorware、Icon Author;●基于时间(时序)——按时间顺序组织数据/事件,用时线方式表达媒体元素之间的相互关系,特别适合于动画。
如Director、Action!;●基于页(脚本/卡片)——将媒体对象连接于页(卡片/节点)上,以面向对象方式处理媒体元素,用属性定义/脚本规范媒体元素,超文本功能强,特别适合于电子图书、MCAI。
如ToolBook、PowerPoint、HyperCard;●基于网页(标记语言)——Web网页,基于HTML/XML、JavaScript/VBScript、ASP/JSP。
如FrontPage(SharePoint Designer和Expression Web Designer)、Dreamweaver。
2)编程工具●编程接口(API)——MCI、MMAPI、DirectX、WPF;●语言工具——Visual C++、Visual C#、Visual Basic、C++ Builder、Delphi、Java等;3)比较两种媒体集成工具的优缺点与适用范围的比较见表12-1。
12.2 播放波形音频文件本节介绍Windows中可用来播放音频文件的3种高层函数,包括只能播放系统声音的MessageBeep、Win16中就有的可以播放波形文件的老函数sndPlaySound、以及Win32引进的功能强大的播放波形文件的新函数PlaySound。
函数原型为:BOOL MessageBeep (UINT uType);该函数调用后马上返回,若成功返回TRUE,否则返回FALSE。
其中,参数uType为声音类型,其可取值见表12-2。
这些系统事件的声音,可用控制面板中声音与音频设备程序来设置和指定,保存在注册表中。
若系统没有安装音频设备,则会使用计算机本身的小喇叭来发声;否则,会调用声卡来播放对应的波形文件。
可以用MMAPI的SDK函数waveOutGetNumDevs来判断系统是否安装了音频设备,其原型为:UINT waveOutGetNumDevs(VOID); // 返回系统中安装的音频设备数。
例如:if (waveOutGetNumDevs() == 0) {MessageBox(L"No audio device!", L"Error" ); return;} 12.2.2 sndPlaySound函数原型为:BOOL sndPlaySound ( LPCSTR lpszSound, UINT fuSound ); 其中,lpszSound可为注册系统声音的表项,也可为盘中的波形文件,为NULL则停止正在播放的任何声音。
fuSound为标志参数(无符号整数),可取值为表12-3中所列诸符号常量的位或“|”。
为了结束异步或循环播放,可以用lpszSound=NULL来调用sndPlaySound函数。
如:sndPlaySound(L"SystemAsterisk", SND_ASYNC); // 异步播放系统的星号声sndPlaySound(strWaveFile, SND_LOOP | SND_ASYNC); // 异步循环播放指定的波形文件sndPlaySound(NULL, 0); // 停止声音的播放注意:对采用相对路径的波形文件,系统先在当前目录中查找,若没有,再到标准的搜索路径中去查找。
若没有找到指定的系统声音或波形文件,则播放系统缺省声音;若没有定义系统缺省声音,则不播放任何声音并返回FALSE。
另外,为了使包含sndPlaySound、PlaySound或MCI函数的程序能够编译通过,必须包含多媒体头文件mmsystem.h,并在项目属性中添加对多媒体库winmm.lib的链接。
12.2.3 PlaySoundsndPlaySound是为了与Win16兼容而保留的老函数,而PlaySound是Win32引进的新函数,它的功能更强大,sndPlaySound只不过是它的子集。
其函数原型为:BOOL PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);其中参数●pszSound(含义与fdwSound的设置有关):⏹若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别名、文件名或资源ID;⏹若fdwSound标志没有设置这些值,则先在注册表或win.ini中寻找串为pszSound的声音,若没有,则视其为文件名;⏹若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。
若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGE。
●hmod(含义也与fdwSound的设置有关):⏹若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄;⏹若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULL。
●fdwSound——似sndPlaySound的fuSound,为标志参数,它除了可取fuSound可取的6个值外,还可以取表12-4中所列的值。
例如:PlaySound(L"c:\\sounds\\sample.wav", NULL, SND_ASYNC); 或PlaySound(ar.GetFile()->GetFilePath(), NULL, SND_ASYNC);若定义了波形资源,如:IDR_SAMPLE WAVE "res\\sample.wav",则可用下面的语句来播放:PlaySound(MAKEINTRESOURCE(IDR_SAMPLE),AfxGetInstanceHandle(), SND_ RESOURCE); 也可以用PlaySound来播放系统声音,如PlaySound(L"SystemHand", NULL, SND_ASYNC);12.3 播放流媒体文件本节介绍,如何利用媒体播放器(Media Player)ActiveX控件,来编写一个支持大多数标准格式(如AVI、ASF、MPEG、WAV、MIDI、MP3、WMA等,但不支持RM和MOV)的流媒体文件播放器。
下面给出编写媒体播放器程序的具体方法和步骤。
12.3.1 添加ActiveX 媒体播放器控件我们先创建一个基于对话框的MFC 应用程序MPlay 。
为了能够在项目中使用媒体播放器控件,必须先将媒体播放器控件添加到对话框编辑器工具箱中。
这需要在你的系统中,已经正确安装了微软公司的媒体播放器。
添加ActiveX 媒体播放器控件的具体做法有两种:1.先在工具箱中添加ActiveX 媒体播放器控件,再将其加入到对话框资源中打开工具箱窗口,在其空白区单击鼠标右键,在弹出菜单中选中“选择项”菜单项;也可以选VS 的“工具\选择工具箱项”菜单项;在弹出的“选择工具箱项”对话框中,选择“COM 组件”页;滚动到列表框的底部,选中“Windows Media Player ”项,按“确定”钮,关闭对话框。
系统会将一个“ Windows Media Player ”控件,加入到工具箱的对话框编辑器栏的底部,参见图12-2~3,这样你就可以将其加入到对话框资源中了。
2.直接将ActiveX 媒体播放器控件插入对话框资源你也可以简单地在对话框资源中单击鼠标右键,在弹出菜单中选中“插入ActiveX 控件”菜单项(参见图12-4);在打开的“插入ActiveX 控件”对话框(参见图12-5)中,滚动列表框,选择底部的“Windows Media Player ”项,按“确定”钮,关闭对话框。