北华航天工业学院计算机系制作VC++程序设计项目实践贾振华北华航天工业学院计算机系制作单击此处编辑母版标题样式第3章多媒体音频播放器学习目标:几种重要的音频格式媒体控制接口类MCI命令媒体控制接口类MCI设备mciSendString和mciSendCommand函数的使用北华航天工业学院计算机系制作单击此处编辑母版标题样式3.1几种重要的音频格式3.1.1波形音频波音音频是一种电子数字化的声音,是计算机播放音频的一种重要格式,它存储的是声音的波形信息,当播放波形音频时,不管播放文件的设备是何种类型,都会得到相似的声音,波形音频文件通常wav作为文件扩展名。由于采用波形音频存储电子化声音需要大量的存储空间,因此它一般只用于短时间的声音播放。波形音频主要有以下几个属性,他们决定了声音的质量。(1)采样平率(2)量化位数(3)声道数北华航天工业学院计算机系制作单击此处编辑母版标题样式3.1几种重要的音频格式3.1.2MIDI音频MIDI(MusicalInstrumentDigitalInterface)在多媒体音频中占有重要的位置,是播放和录制音乐的国际标准。它确定了连接音乐设备的电缆线、硬件和通信协议。多媒体PC只需要具有MIDI接口和MIDI合成器就可具备处理MIDI的功能。MIDI在处理音乐时是将MIDI音乐设备上产生的活动编码记录下来,将这些数据传递到MIDI合成器上就能重现原来的演奏。MIDI的消息有两种类型:状态字节和数字字节;状态字节u发送的类别(动作和函数);数字字节总是跟在状态字节后,表示发送消息的实际值。数字字节的个数取决与状态字节表示的消息类型。MIDI通过通道字节最高位区别这两种类型。最高位为1,表示状态字节,为0表示数字字节。所有MIDI消息通过通道来接收和发送。通道上能够传递不同乐器的声音。音序器根据通道传递的消息,让不同的乐器演奏不同声部。使用通道,使MIDI的音乐效果大大增强。但是如果不对声道和相应乐器作统一规定的话将会造成混乱。Windows使用通用的MIDI标准定义通道的分配。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.1几种重要的音频格式3.1.3CD音频CD音频采用红皮书标准,通过CD-ROM驱动器来播放CD音频。CD音频需要的存储量大,一张光盘约能存储70分钟左右的CD音频。国际标准化组织对光盘的数据格式作了详细的规定。红皮书是CD标准的第一个文本,发表于1981年,描述了CD-DA的信息和编码格式。其采样率为44.1kHz,每个样本量化位数为16位。一般情况下,整个光盘都用来存储CD音频数据,并划分为多个音轨,轨道的具体长度可以不定,通常一个音轨对应一首曲目。CD音频的长度用分、秒、帧的形式来衡量,最小的单位是帧,每一帧为1/75秒。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCIMCI提供了标准的播放多媒体设备和记录多媒体文件的命令,这些命令使得我们的应用程序可以与设备无关的方式控制音频和视频设备。对所有支持的媒体类型(音频、MIDI、CD音频、数字视频等)而言,这些命令的接口都是类似的。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令MCI支持命令字符串和命令消息两种方式控制MCI设别,我们可以在MCI应用程序中使用其中的任何一种或混合使用这两种方式。命令消息接口包含常数和结构信息。使用全局函数mciSendCommand向某个MCI设备发送消息。命令字符串接口则提供命令消息的文本版本,它是比命令消息接口要高级的MCI接口。使用命令字符串接口时,必须使用全局函数mciSendString向某个MCI设备发送字符串。MicrosoftWindows操作系统在向指定的MCI设备发送该字符串时将其解释成相应的命令消息。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令命令消息方式使用结构检索信息,这些结构包含了不同设备的不同信息。而命令字符串方式则将检索到的信息打包到一个字符串中,读者使用MCI命令字符串方式翻译该字符串。在一般不需要检查MCI命令返回值时,我们推荐读者使用MCI命令字符串方式操作MCI设备——它更易于理解和记忆,在本实例中,我们将使用命令消息方式而不是命令字符串方式。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令1.全局函数mciSendCommandmciSendCommand负责向指定的MCI设备发送一个命令消息,其函数原型为:MCIERRORmciSendCommand(MCIDEVICEIDIDDevice,UINTuMsg,DWORDfdwCommand,DWORDdwParam);其中的参数IDDevice表示接收该消息的MCI设备类型。MCI_OPEN命令消息不实用此参数,参数uMsg为相应的命令消息,参数fdwCommand为命令消息的标志,参数dwParam则为命令消息包含参数的结构地址。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令如果mciSendCommand成功发送命令消息,函数返回0,否则返回相应的MCI错误码。需要注意的是,错误码包含在返回的DWORD(双字)类型值的低地址字中。如果该错误与特定的设备有关,则高地址字为发生错误的驱动器标识,否则高地址字为0。有关MCI错误的信息,请参阅MCI错误类型一节。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令如果要检索mciSendCommand返回值的文本描述,可以使用全局函数mciGetErrorString.MCI命令消息的语法包含三个元素:常数消息值、包含命令参数的结构和确定命令选项和参数有效字段的标志集合。例如,下面的代码向指定的MCI设备发送一个MCI_PLAY命令:mciSendCommand(wDeviceID,//设备标识MCI_PLAY,//命令消息0,//标志(DWORD)(LPVOID)&mciPlayParms);//参数块北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令最后一个参数mciPlayParms为MCI_PLAY_PARMS类型的结构地址,其中可能包含了回放的开始和结束位置。大多数MCI命令消息都使用类似的结构包含足够的MCI操作信息。所有这些结构的第一个参数都是MCI操作完成后接收MM_MCINOTIFY通知消息的窗口句柄。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令2.全局函数mciSendString全局函数mciSendString负责向MCI设备发送一个命令字符串。接收命令的设备由字符串的内容指定。MCIERRORmciSendString(LPCTSTRlpszCommand,LPTSTRlpszReturnString,UINTcchReturn,HANDLEhwndCallback);北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令其中的参数lpszCommand表示MCI命令字符串(以“\0”结束)的地址,参数lpszReturnString则为返回字符串的缓冲区地址,参数cchReturn为参数lpszReturnString指定的字符缓冲区大小,如果命令字符串指定了通知(“notify”)标志,则参数hwndCallback则为回调窗口的句柄。mciSendString的返回值与mciSendCommand相同。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令MCI命令字符串的语法为典型的“动词——对象——修饰符”结构。每个命令字符串都包括一个命令、一个设备标识符和命令参数。其中的参数对部分命令可选的,而对于部分命令是必须的。一般地,一个命令字符串的形式为:commanddevice_idarguments其中,command指定了MCI命令,例如open、colse或play等;device_id标识了MCI驱动器的一个实例(device_id在打开设备时创建);arguments指定了命令所使用的标志和变量。这里的标志为MCI命令可识别的关键字,变量为MCI命令或标志使用的数字或字符串。例如,希望从指定的位置播放到指定的位置,可以使用下面的代码实现:北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令DWORDPlayFromTo(LPSTRlpstrAlias,DWORDdwFrom,DWORDdwTo){//形成命令串CharachCommandBuff[128];//发送命令串Waprintf(achCommandBuff,“paly%sfrom%uto%u”,lpstrAlias,dwFrom,dwTo);ReturnmciSendString(achCommandBuff,NULL,0,NULL);}这里的“from”和“to”是可识别的预定义标志。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令3.MCI命令的分类MCI定义了四种类型的命令:(1)系统命令:(2)必需命令(3)基本命令(4)扩展命令系统命令和必需命令为所有MCI设备都必须支持的最小命令集,而基本命令和扩展命令并不为所有的MCI设备支持。如果应用程序需要使用基本命令和扩展命令,则应该在使用该命令之前查询该设备是否支持它(使用查询命令MCI_GETDEVCAPS)。MCI命令见教材表3-2所示。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令4.MCI函数、宏和消息大多数MCI应用程序需要重复使用全局函数mciSendString和mciSendCommand。除了这两个函数之外,MCI还提供了其他几个不太常用的全局函数。全局函数mciGetErrorString的意义前文已经述及。此外,全局函数mciGetCreatorTask允许应用程序使用设备标识符检索创建该标识符的任务句柄。全局函数mciGetYieldProc与mciSetYieldProc可以指定或检索与“wait”(MCI_WAIT)标志相关的回调函数地址。北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令大多数MCI命令需要的设备标识符都由调用MCI_OPEN命令而得到。但在部分情况下,可能不希望打开该设备而获取设备标识符,此时可以使用全局函数mciGetDeviceID。不同的媒体可能使用不同的时间格式,这些时间格式包括HMS(时/分/秒)格式,MSF(分/秒/帧)格式和TMSF(轨/分/秒/帧)格式等。MCI提供了多个宏以进行媒体的时间格式变换,这些宏有:北华航天工业学院计算机系制作单击此处编辑母版标题样式3.2媒体控制接口类MCI3.2.1MCI命令MCI_HMS_HOUR:检索HMS值的小时字段;MCI_HMS_MINUTE:检索HMS值的分钟字段;MCI_HMS_SECOND:检索HMS值的秒字段;MCI_MAKE_HMS:创建HMF值;MCI_MAKE_MSF创建MFS值;MCI_MAKE_TMSF:创建TMSF值;MCI_MSF_FRAME:检索MSF值的帧字段;MCI_MSF_MINUTE:检索MSF值的分钟字段;MCI_MSF_SECOND:检索MSF值的秒字段;MCI_TMSF_FRAME:检索TMSF值的帧字段;MCI_TMSF_MINUTE检索TMSF值的分钟字段;MCI_TMSF_SECOND:检索TMSF