1、* 1单击此处编辑母版标题样式单击此处编辑母版副标题样式高等学校 21世纪教材 多媒体技术教程 人民邮电出版社国防科学技术大学 版权所有第五章 多媒体软件基础(二)* 2单击此处编辑母版标题样式单击此处编辑母版副标题样式高等学校 21世纪教材 多媒体技术教程 人民邮电出版社国防科学技术大学 版权所有5.4 多媒体程序设计基础5.4.1 媒体控制接口 (MCI)概述 媒体控制接口 (MCI, Media Control Interface)在控制音频、视频等多媒体外围设备方面,提供了与设备无关的应用程序。 由于 MCI的设备无关性,系统升级十分方便,从而大大提高了应用系统的开发效率。 MCI设备
2、驱动器可以直接或通过 Windows提供的低级多媒体函数控制媒体硬件。5.4.1 媒体控制接口 (MCI)MCI编程接口 命令 -消息接口 应用信息传递方式与 MCI设备进行通信 。 如WORD wDeviceID;MCI_PLAY_PARMS mciPlayParms;MciSendCommand(wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID) 是为需要 C语言接口以控制多媒体设备的应用程序而设计的 。5.4.1 媒体控制接口 (MCI)MCI命令集 命令 字符串接口中的命令描述了 MCI命令集,每一条命令在命令 消息接口中都有对应的命令消息。例如: close命令
3、字符串等同于 MCI_CLOSE命令消息。 MCI命令可分成四类:系统命令、需求命令、基本命令和扩展命令 。 5.4.1 媒体控制接口 (MCI)MCI命令集 MCI命令由一字符串组成,语法如下:Command device_name arguments其中: command : MCI所使用的命令;device_name: 指设备类型、文件名或别名;arguments : 指令所带的参数列表。5.4.1 媒体控制接口 (MCI)关于 MCI设备 MCI设备驱动程序可以按简单和复合设备进行分类。简单设备重放时不需要数据文件。 视盘机和激光唱盘机 (CD)都是简单设备。复合设备重放时需要数据文件
4、。 MIDI序列和波形音频播放机都是复合设备。与复合设备相关的数据文件叫设备元素 MIDI文件和 WAVE文件都是设备元素的例子 5.4.1 媒体控制接口 (MCI)设备名 对于某一给定的设备类型,可能有几种MCI驱动程序共享命令集,但使用不同的数据格式。如动画设备就有几种驱动程序使用同一命令集,但使用不同的文件格式。要单独标识 MCI驱动程序, MCI使用设备名。 设备名是在注册中的 mci部分标出的,这一部分标明了所有 Windows MCI设备驱动程序。5.4.1 媒体控制接口 (MCI)设备名 下面是典型的 mci部分的一部分。mciwaveaudio=mciwave.drvseque
5、ncer=mciseq.drvMMMovie=mcimmp.drvCdaudio=mcicda.drv 键名 (在等号左边 )是设备名,与键名相对的值 (在等号的右边 )标识 MCI驱动程序的文件名,设备名通常与该驱动程序中的设备类型名是相同的。5.4.1 媒体控制接口 (MCI)设备名 如果用一个已经在 mci部分中存在的设备名安装 MCI设备驱动程序, Windows就给新驱动程序的设备名加上一个整数,以产生一个独特的设备名。在前面的例子中,用 cdaudio设备名安装的驱动程序其设备名为 cdaudio1,而以后的cdaudio设备名应为 cdaudio2 5.4.1 媒体控制接口 (M
6、CI)打开 MCI设备 在使用 MCI设备以前,用户必须打开该设备将其初始化;打开设备就将它的驱动程序装入了内存 (如果该程序还没有装入 ),并且建立一个设备标识符用来指定在后续命令中的设备 (命令字符串接口不使用该设备的标识符 )。5.4.1 媒体控制接口 (MCI)打开 MCI设备 有几种方法可以指定用户要打开的设备: 对于简单设备,用户只需指定设备名将其打开。 对于复合设备,用户只需指定设备名、设备元素或二者同时指定来打开这个设备。 如,下列命令字符串用指定设备名的方法打开一个CD音频设备Open cdaudio 下面的命令字符串用指定设备名和设备元素的方法打开一个波形音频复合设备。Op
7、en bell.wav type waveaudio 也可以象下面给出的例子那样只指定设备的元素来打开一个复合设备。Open bells.wav5.4.1 媒体控制接口 (MCI)打开 MCI设备 打开一个复合设备时,如果只指定设备元素,则MCI用设备元素文件的扩展名确定要打开哪一个设备。 注册中包含一个与文件扩展名和相应的 MCI设备类型相关的 mci extensions部分。 下面是 mci extensions部分的一部分。mci extensionswav=wavaudiomid=sequencerrmi=sequencer5.4.1 媒体控制接口 (MCI)MCI设备类型 MCI命
8、令通过设备标识符 (即设备名称 )来存取和控制设备:Open cdaudio/打开 CD音响播放设备play cdaudio/如果 CD唱盘已经在演播器中,而且设备正常,唱盘将从第一道开始播放Pause cdaudio/暂停或停止唱盘的播放close cdaudio/当程序完成了对某一多媒体设备的访问时,应关闭设备5.4.1 媒体控制接口 (MCI)MCI设备类型 所有 MCI命令都通过多媒体 API函数mciSendString传送给媒体控制接口。该函数取一个 MCI命令串,传递给 MCI驱动程序,然后将出错消息或返回代码返回到用户提供的缓冲区。函数原型如下:DWORD mciSendStr
9、ing ( LPSTR ipstrCommand, LPSTR ipstrReturnString, WORD wReturnLenth, HANDLE hCallback); 第一个参数是 MCI命令串,第二个参数是用来存放返回代码的缓冲区地址,第三个参数时缓冲区的长度,第四个参数是回调函数地址。5.4.1 媒体控制接口 (MCI)MCI设备类型 下面是一个调用 mciSendString函数的例子:#includechar buff55;mciSendString(“open cdaudio“, buff , strlen(buff) , NULL);/该命令打开了 cdaudio CD-
10、ROM播放器,若出错则错误代码返回给 buff字符数组。 5.4.1 媒体控制接口 (MCI) 基于消息的 MCI 媒体控制接口是访问多媒体设备的一种出色的、独立于设备的方式。然而基于字符串命令的本质决定了 MCI并不总是像它应该做到的那样快捷 。open test.wav type waveaudioplay test.wav from 1 to 5close test.wav/打开 test.wav文件 ,从位置 1至位置 5播放 ,然后关闭文件。 对于所列出的每一行,媒体控制接口必须把消息拆成分量,并把指令翻译成命令。这个过程要花费一定时间。尽管时间量很小,但在耗时的操作中,其影响可能是
11、很大的。5.4.1 媒体控制接口 (MCI)基于消息的 MCI 基于消息的 MCI,它使用与mciSendCommand API 函数一起的消息 (实际上,是在 MMSYSTEM.H中定义的常量 )。通过使用消息,应用程序在访问多媒体设备时能快一点,这是因为系统不再需要解释命令字符串。用基于字符串的 MCI实现的每一操作可用基于消息的 MCI完成 。5.4.1 媒体控制接口 (MCI)基于消息的 MCI的使用 一条基于消息的 MCI命令包括三部分; 第一部分是指定要执行的 MCI命令的一个常量。这些常量以标识符 MCI_开头并由一个说明性的名称 ,诸如MCI_OPEN或 MCI_STOP 第二
12、部分是一个 (或一组 )用来指定 MCI消息子选项的标志。这些标志确定了可以得到什么类型的信息以及如何执行 MCI函数。 第三部分是一个结构,它确定了命令的附加参数。依靠消息,该结构含有可传递给 MCI驱动程序的信息,或含有从 MCI驱动程序返回的值。 消息通过 mciSendCommand函数传递。 MciSendCommand函数在 MMSYSTEMH中定义5.4.1 媒体控制接口 (MCI) 打开 MCI设备 在使用 MCI设备之前,必须通过 MCI_OPEN消息对其初始化。 有两种打开设备的方法,这取决于要打开的设备的类型: 若要打开一简单设备 (不需要文件名的设备,如 CD音频驱动器
13、或视盘播放器 ),必须填写 MCI_OPEN_PARMS结构的 lpstrDeviceType元素,以指定要打开的设备:DWORD result;MCI_OPEN_PARMS Openparms;OpenParms.LpstrDeviceType = “cdaudio“;Result = mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_TYPE,(DWORD)(LPVOED)WdeviceID = OpenParms.WDeviceID; 5.4.1 媒体控制接口 (MCI) 打开 MCI设备 若要打开一复合设备 (需要文件名的设备 ),必须为媒体在 MCI_
14、OPEN_PARMS数据结构的 lpstrElementName元素中指定文件名:DWORD result;MCI_OPEN_PARMS OpenParms;OpenParms.lpstrDeviceType = “Waveaudio“;OpenParms.lpstrElementName = “test.wav“Result=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID) wDeviceID = OpenParms.wDeviceID; 除了 MCI_OPEN_TYPE标志之外,还必须给
15、定 MCI _OPEN_ELEMENT标志 (两者用 C的 |运算符 “或 “在一起 )。同样,设备标识符将被返回到 MCI_OPEN_PARMS数据结构的 wDeviceID元素中。 5.4.1 媒体控制接口 (MCI)访问 MCI设备 在设备打开之后,使用 mciSendCommand函数发送附加的消息,必须使用从 MCI_OPEN返回的设备标识符作为函数的第一个参数。 例如在 CD音频设备打开之后,可以用下列代码开始播放:DWORD result;MCI_PLAY_PARMS PlayParms;Rdsult=mciSendCommand(DeviceID,MCI_PLAY,0, (DW
16、ORD)(LPVOID)5.4.1 媒体控制接口 (MCI) 访问 MCI设备 若是启动波形音频复合设备,可使用类似的命令。此外,在程序中应该测试 mciSendCommand函数的返回值:DWORD result;Char buffer255;Result = mciSendCommand();If (result)mciGetErrorString (result, buffer, sizeof(buffer);MessageBox( hWnd, buffer, “MCI Device“, MB_OK);Return; 当程序完成了对设备的访问之后,应用程序应该关闭MCI设备。要关闭一 M
17、CI设备,可对打开的设备发送MCI_CLOSE消息,该命令释放设备,从而使其它应用程序可以访问这个设备。 5.4.2 多媒体 API函数 API是应用程序编程接口 (Application Program Interface)的缩写,这是一组供应用程序使用的命令,用以向计算机的操作系统请求或执行更低级的设备访问操作 。多媒体 API函数 与 MCI有关的高级函数是: mciSendString() :传送指令字符串给 MCI; mciExecute() :可视为 mciSendString的简化函数 ,如果无法执行,会以一个对话框显示错误信息; mciGetErrorString() :解释
18、MCI错误代码所表示的意思。5.4.2 多媒体 API函数 波形音频函数 波形音频函数包括高层波形音频函数和低层音频函数 高层波形音频函数 函数 描 述MessageBeep 播放 对应给 定的系 统报 警波形声音PlaySound 播放 对应给 定的文件名或注册 项 的波形声音sndPlaySound 播放 对应给 定的文件名或注册 项 的波形声音5.4.2 多媒体 API函数 波形音频函数 低层波形音频函数 低层波形音频函数以 wav为前缀,共有 6类,提供如下服务:查询音频设备打开和关闭设备驱动程序分配和准备音频数据块管理音频数据块应用 MMTIME结构处理错误* 27单击此处编辑母版标
19、题样式单击此处编辑母版副标题样式高等学校 21世纪教材 多媒体技术教程 人民邮电出版社国防科学技术大学 版权所有5.5 多媒体应用设计5.5.1 多媒体应用的类型 开发系统。这一类系统实际上就是被用来开发应用的工具性或支持类软件系统,如创作工具、数据库系统、著作语言、多媒体编辑器等。 Title。 Title是一类多媒体应用的总称,主要是指具有一定主题的应用型光盘产品,如大百科全书、词典、教科书、某一专题的介绍。 演示系统。为某一单位或某一应用专门设计的演示系统。 教育培训。 娱乐。多媒体的游戏、影视节目等均属这一类。 专门应用系统。此类系统是为特定目的设计的,如多媒体会议系统、医学诊断系统等,具有本身鲜明的专业特色。5.5.2 多媒体应用设计过程应用目标分析 脚本编写各种媒体信息的数据准备创作设计测试维护5.5.2 多媒体应用设计过程需求分析确定应用目标建立应用内容知识结构使用的对象