《第3章多媒体音频播放器优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第3章多媒体音频播放器优秀PPT.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章多媒体音频播放器章多媒体音频播放器现在学习的是第1页,共42页第第3 3章章 多媒体音频播放器多媒体音频播放器学习目标:学习目标:几种重要的音频格式几种重要的音频格式媒体控制接口类媒体控制接口类MCI命令命令媒体控制接口类媒体控制接口类MCI设备设备mciSendString和和mciSendCommand函数的使函数的使用用现在学习的是第2页,共42页3.13.1几种重要的音频格式几种重要的音频格式3.1.13.1.1波形音频波形音频波音音频是一种电子数字化的声音,是计算机播波音音频是一种电子数字化的声音,是计算机播放音频的一种重要格式,它存储的是声音的波形放音频的一种重要格式,
2、它存储的是声音的波形信息,当播放波形音频时,不管播放文件的设备信息,当播放波形音频时,不管播放文件的设备是何种类型,都会得到相似的声音,波形音频文是何种类型,都会得到相似的声音,波形音频文件通常件通常wav作为文件扩展名。由于采用波形音频作为文件扩展名。由于采用波形音频存储电子化声音需要大量的存储空间,因此它一存储电子化声音需要大量的存储空间,因此它一般只用于短时间的声音播放。般只用于短时间的声音播放。波形音频主要有以下几个属性,他们决定了声音波形音频主要有以下几个属性,他们决定了声音的质量。的质量。(1)采样平率)采样平率 (2)量化位数)量化位数 (3)声道数)声道数现在学习的是第3页,共
3、42页3.13.1几种重要的音频格式几种重要的音频格式3.1.2 MIDI3.1.2 MIDI音频音频MIDI(Musical Instrument Digital Interface)在多媒体音)在多媒体音频中占有重要的位置,是播放和录制音乐的国际标准。它确定了频中占有重要的位置,是播放和录制音乐的国际标准。它确定了连接音乐设备的电缆线、硬件和通信协议。多媒体连接音乐设备的电缆线、硬件和通信协议。多媒体PC只需要具有只需要具有MIDI接口和接口和MIDI合成器就可具备处理合成器就可具备处理MIDI的功能。的功能。MIDI在处理音乐时是将在处理音乐时是将MIDI音乐设备上产生的活动编码记录下音
4、乐设备上产生的活动编码记录下来,将这些数据传递到来,将这些数据传递到MIDI合成器上就能重现原来的演奏。合成器上就能重现原来的演奏。MIDI的消息有两种类型:状态字节和数字字节;状态字节的消息有两种类型:状态字节和数字字节;状态字节u发送发送的类别(动作和函数);数字字节总是跟在状态字节后,表示发送的类别(动作和函数);数字字节总是跟在状态字节后,表示发送消息的实际值。数字字节的个数取决与状态字节表示的消息类型。消息的实际值。数字字节的个数取决与状态字节表示的消息类型。MIDI通过通道字节最高位区别这两种类型。最高位为通过通道字节最高位区别这两种类型。最高位为1,表示状,表示状态字节,为态字节
5、,为0表示数字字节。表示数字字节。所有所有MIDI消息通过通道来接收和发送。通道上能够传递不同消息通过通道来接收和发送。通道上能够传递不同乐器的声音。音序器根据通道传递的消息,让不同的乐器演乐器的声音。音序器根据通道传递的消息,让不同的乐器演奏不同声部。使用通道,使奏不同声部。使用通道,使MIDI的音乐效果大大增强。但是的音乐效果大大增强。但是如果不对声道和相应乐器作统一规定的话将会造成混乱。如果不对声道和相应乐器作统一规定的话将会造成混乱。Windows使用通用的使用通用的MIDI标准定义通道的分配。标准定义通道的分配。现在学习的是第4页,共42页3.13.1几种重要的音频格式几种重要的音频
6、格式3.1.3 CD3.1.3 CD音频音频CD音频采用红皮书标准,通过音频采用红皮书标准,通过CD-ROM驱动器来驱动器来播放播放CD音频。音频。CD音频需要的存储量大,一张光音频需要的存储量大,一张光盘约能存储盘约能存储70分钟左右的分钟左右的CD音频。音频。国际标准化组织对光盘的数据格式作了详细的规国际标准化组织对光盘的数据格式作了详细的规定。红皮书是定。红皮书是CD标准的第一个文本,发表于标准的第一个文本,发表于1981年,描述了年,描述了CD-DA的信息和编码格式。其的信息和编码格式。其采样率为采样率为44.1kHz,每个样本量化位数为,每个样本量化位数为16位。位。一般情况下,整个
7、光盘都用来存储一般情况下,整个光盘都用来存储CD音频数据,音频数据,并划分为多个音轨,轨道的具体长度可以不定,并划分为多个音轨,轨道的具体长度可以不定,通常一个音轨对应一首曲目。通常一个音轨对应一首曲目。CD音频的长度用分、音频的长度用分、秒、帧的形式来衡量,最小的单位是帧,每一帧秒、帧的形式来衡量,最小的单位是帧,每一帧为为1/75秒。秒。现在学习的是第5页,共42页3.23.2媒体控制接口类媒体控制接口类MCIMCIMCI提供了标准的播放多媒体设备和记录多媒体提供了标准的播放多媒体设备和记录多媒体文件的命令,这些命令使得我们的应用程序可以文件的命令,这些命令使得我们的应用程序可以与设备无关
8、的方式控制音频和视频设备。对所有与设备无关的方式控制音频和视频设备。对所有支持的媒体类型(音频、支持的媒体类型(音频、MIDI、CD音频、数字音频、数字视频等)而言,这些命令的接口都是类似的。视频等)而言,这些命令的接口都是类似的。现在学习的是第6页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令MCI支持命令字符串和命令消息两种方式控制支持命令字符串和命令消息两种方式控制MCI设别,我们可以在设别,我们可以在MCI应用程序中使用其中应用程序中使用其中的任何一种或混合使用这两种方式。的任何一种或混合使用这两种方式。命令消息接口包含常
9、数和结构信息。使用全局函命令消息接口包含常数和结构信息。使用全局函数数mciSendCommand向某个向某个MCI设备发送消息。设备发送消息。命令字符串接口则提供命令消息的文本版本,它命令字符串接口则提供命令消息的文本版本,它是比命令消息接口要高级的是比命令消息接口要高级的MCI接口。使用命令接口。使用命令字符串接口时,必须使用全局函数字符串接口时,必须使用全局函数mciSendString向某个向某个MCI设备发送字符串。设备发送字符串。Microsoft Windows操作系统在向指定的操作系统在向指定的MCI设设备发送该字符串时将其解释成相应的命令消息。备发送该字符串时将其解释成相应的
10、命令消息。现在学习的是第7页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令命令消息方式使用结构检索信息,这些结构包含命令消息方式使用结构检索信息,这些结构包含了不同设备的不同信息。而命令字符串方式则将了不同设备的不同信息。而命令字符串方式则将检索到的信息打包到一个字符串中,读者使用检索到的信息打包到一个字符串中,读者使用MCI命令字符串方式翻译该字符串。命令字符串方式翻译该字符串。在一般不需要检查在一般不需要检查MCI命令返回值时,我们推荐命令返回值时,我们推荐读者使用读者使用MCI命令字符串方式操作命令字符串方式操作MCI设备设
11、备它更易于理解和记忆,在本实例中,我们将使用它更易于理解和记忆,在本实例中,我们将使用命令消息方式而不是命令字符串方式。命令消息方式而不是命令字符串方式。现在学习的是第8页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令1.全局函数全局函数mciSendCommandmciSendCommand负责向指定的负责向指定的MCI设备发送设备发送一个命令消息,其函数原型为:一个命令消息,其函数原型为:MCIERROR mciSendCommand(MCIDEVICEID IDDevice,UINT uMsg,DWORD fdwComman
12、d,DWORD dwParam);其中的参数其中的参数IDDevice表示接收该消息的表示接收该消息的MCI设备设备类型。类型。MCI_OPEN命令消息不实用此参数,参数命令消息不实用此参数,参数uMsg为相应的命令消息,参数为相应的命令消息,参数fdwCommand为为命令消息的标志,参数命令消息的标志,参数dwParam则为命令消息则为命令消息包含参数的结构地址。包含参数的结构地址。现在学习的是第9页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令如果如果mciSendCommand成功发送命令消息,函成功发送命令消息,函数返回
13、数返回0,否则返回相应的,否则返回相应的MCI错误码。需要注意错误码。需要注意的是,错误码包含在返回的的是,错误码包含在返回的DWORD(双字)类(双字)类型值的低地址字中。如果该错误与特定的设备有型值的低地址字中。如果该错误与特定的设备有关,则高地址字为发生错误的驱动器标识,否则关,则高地址字为发生错误的驱动器标识,否则高地址字为高地址字为0。有关。有关MCI错误的信息,请参阅错误的信息,请参阅MCI错误类型一节。错误类型一节。现在学习的是第10页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令如果要检索如果要检索mciSendC
14、ommand返回值的文本描返回值的文本描述,可以使用全局函数述,可以使用全局函数mciGetErrorString.MCI命令消息的语法包含三个元素:常数消息值、命令消息的语法包含三个元素:常数消息值、包含命令参数的结构和确定命令选项和参数有效包含命令参数的结构和确定命令选项和参数有效字段的标志集合。例如,下面的代码向指定的字段的标志集合。例如,下面的代码向指定的MCI设备发送一个设备发送一个MCI_PLAY命令:命令:mciSendCommand(wDeviceID,/设备标识设备标识MCI_PLAY,/命令消息命令消息0,/标志标志(DWORD)(LPVOID)&mciPlayParms)
15、;/参数块参数块现在学习的是第11页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令最后一个参数最后一个参数mciPlayParms为为MCI_PLAY_PARMS类型的结构地址,其中可能类型的结构地址,其中可能包含了回放的开始和结束位置。大多数包含了回放的开始和结束位置。大多数MCI命令命令消息都使用类似的结构包含足够的消息都使用类似的结构包含足够的MCI操作信息。操作信息。所有这些结构的第一个参数都是所有这些结构的第一个参数都是MCI操作完成后操作完成后接收接收MM_MCINOTIFY通知消息的窗口句柄。通知消息的窗口句柄。现在
16、学习的是第12页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令2.全局函数全局函数mciSendString全局函数全局函数mciSendString负责向负责向MCI设备发送一设备发送一个命令字符串。接收命令的设备由字符串的内容个命令字符串。接收命令的设备由字符串的内容指定。指定。MCIERROR mciSendString(LPCTSTR lpszCommand,LPTSTR lpszReturnString,UINT cchReturn,HANDLE hwndCallback);现在学习的是第13页,共42页3.23.2媒体
17、控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令其中的参数其中的参数lpszCommand表示表示MCI命令字符串命令字符串(以(以“0”结束)的地址,参数结束)的地址,参数lpszReturnString则为返回字符串的缓冲区地址,则为返回字符串的缓冲区地址,参数参数cchReturn为参数为参数lpszReturnString指定的指定的字符缓冲区大小,如果命令字符串指定了通知字符缓冲区大小,如果命令字符串指定了通知(“notify”)标志,则参数)标志,则参数hwndCallback则则为回调窗口的句柄。为回调窗口的句柄。mciSendString的返
18、回值与的返回值与mciSendCommand相同。相同。现在学习的是第14页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令MCI命令字符串的语法为典型的命令字符串的语法为典型的“动词动词对象对象修饰符修饰符”结构。每个命令字符串都包括一个结构。每个命令字符串都包括一个命令、一个设备标识符和命令参数。其中的参数命令、一个设备标识符和命令参数。其中的参数对部分命令可选的,而对于部分命令是必须的。对部分命令可选的,而对于部分命令是必须的。一般地,一个命令字符串的形式为:一般地,一个命令字符串的形式为:command device_id
19、arguments其中,其中,command指定了指定了MCI命令,例如命令,例如open、colse或或play等;等;device_id标识了标识了MCI驱动器的驱动器的一个实例(一个实例(device_id在打开设备时创建);在打开设备时创建);arguments指定了命令所使用的标志和变量。这指定了命令所使用的标志和变量。这里的标志为里的标志为MCI命令可识别的关键字,变量为命令可识别的关键字,变量为MCI命令或标志使用的数字或字符串。例如,希命令或标志使用的数字或字符串。例如,希望从指定的位置播放到指定的位置,可以使用下望从指定的位置播放到指定的位置,可以使用下面的代码实现:面的代码
20、实现:现在学习的是第15页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令DWORD PlayFromTo(LPSTR lpstrAlias,DWORD dwFrom,DWORD dwTo)/形成命令串形成命令串 Char achCommandBuff128;/发送命令串发送命令串 Waprintf(achCommandBuff,“paly%s from%u to%u”,lpstrAlias,dwFrom,dwTo);Return mciSendString(achCommandBuff,NULL,0,NULL);这里的这里的“fr
21、om”和和“to”是可识别的预定义标志。是可识别的预定义标志。现在学习的是第16页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令3.MCI命令的分类命令的分类MCI定义了四种类型的命令:定义了四种类型的命令:(1)系统命令:)系统命令:(2)必需命令)必需命令 (3)基本命令)基本命令 (4)扩展命令)扩展命令 系统命令和必需命令为所有系统命令和必需命令为所有MCI设备都必须支持设备都必须支持的最小命令集,而基本命令和扩展命令并不为所的最小命令集,而基本命令和扩展命令并不为所有的有的MCI设备支持。如果应用程序需要使用基本设备支持
22、。如果应用程序需要使用基本命令和扩展命令,则应该在使用该命令之前查询命令和扩展命令,则应该在使用该命令之前查询该设备是否支持它(使用查询命令该设备是否支持它(使用查询命令MCI_GETDEVCAPS)。)。MCI命令见教材表命令见教材表3-2所示。所示。现在学习的是第17页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令4.MCI函数、宏和消息函数、宏和消息大多数大多数MCI应用程序需要重复使用全局函数应用程序需要重复使用全局函数mciSendString和和mciSendCommand。除了这。除了这两个函数之外,两个函数之外,M
23、CI还提供了其他几个不太常用还提供了其他几个不太常用的全局函数。的全局函数。全局函数全局函数mciGetErrorString的意义前文已经述的意义前文已经述及。此外,全局函数及。此外,全局函数mciGetCreatorTask允许应允许应用程序使用设备标识符检索创建该标识符的任务用程序使用设备标识符检索创建该标识符的任务句柄。全局函数句柄。全局函数mciGetYieldProc与与mciSetYieldProc可以指定或检索与可以指定或检索与“wait”(MCI_WAIT)标志相关的回调函数地)标志相关的回调函数地址。址。现在学习的是第18页,共42页3.23.2媒体控制接口类媒体控制接口类
24、MCI MCI 3.2.1 MCI3.2.1 MCI命令命令大多数大多数MCI命令需要的设备标识符都由调用命令需要的设备标识符都由调用MCI_OPEN命令而得到。但在部分情况下,可能命令而得到。但在部分情况下,可能不希望打开该设备而获取设备标识符,此时可以不希望打开该设备而获取设备标识符,此时可以使用全局函数使用全局函数mciGetDeviceID。不同的媒体可能使用不同的时间格式,这些时间不同的媒体可能使用不同的时间格式,这些时间格式包括格式包括HMS(时(时/分分/秒)格式,秒)格式,MSF(分分/秒秒/帧帧)格式和格式和TMSF(轨(轨/分分/秒秒/帧)格式等。帧)格式等。MCI提供了多
25、个宏以进行媒体的时间格式变换,这些提供了多个宏以进行媒体的时间格式变换,这些宏有:宏有:现在学习的是第19页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令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
26、:检索检索MSF值的帧字段;值的帧字段;MCI_MSF_MINUTE:检索检索MSF值的分钟字段;值的分钟字段;MCI_MSF_SECOND:检索检索MSF值的秒字段;值的秒字段;MCI_TMSF_FRAME:检索检索TMSF值的帧字段;值的帧字段;MCI_TMSF_MINUTE 检索检索TMSF值的分钟字段;值的分钟字段;MCI_TMSF_SECOND:检索:检索TMSF值的秒字段;值的秒字段;MCI_TMSF_TRACK:检索检索TMSF值的轨(音轨)字段。值的轨(音轨)字段。现在学习的是第20页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1
27、 MCI命令命令MCI同时提供了两个消息:同时提供了两个消息:MM_MCINOTIFY与与MM_MCISIGNAL。前者用于通知应用程序。前者用于通知应用程序MCI命令的完成状态命令的完成状态(如果使用了(如果使用了“notify”即即MCI_NOTIFY标志),后者只适用于标志),后者只适用于数字视频设备,它用于通知应用程序数字视频设备,它用于通知应用程序MCI设备已经到达指定的位置。设备已经到达指定的位置。5.等待、通知与测试标志等待、通知与测试标志大多数大多数MCI命令都具有一些特定的标志。等待标志命令都具有一些特定的标志。等待标志“wait”(MCI_WAIT)和通知标志)和通知标志“
28、notify”(MCI_NOTIFY)是最)是最常见的,它们多多出现在所有的常见的,它们多多出现在所有的MCI命令中。测试标志命令中。测试标志“test”(MCI_TEST)只适用于数字视频设备和)只适用于数字视频设备和VCR设备。设备。现在学习的是第21页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令MCI命令通常直接返回,虽然大多数命令通常直接返回,虽然大多数MCI命令实命令实施的活动可能需要很长的时间才能完成。我们可施的活动可能需要很长的时间才能完成。我们可以使用等待标志设置以使用等待标志设置MCI命令的返回时间。使用命令的
29、返回时间。使用MCI_WAIT标志将使得应用程序一直处于等待状标志将使得应用程序一直处于等待状态,直到所请求的态,直到所请求的MCI活动已经执行完毕。活动已经执行完毕。例如,下述播放命令将使得应用程序在回放没有例如,下述播放命令将使得应用程序在回放没有完成前一直处于等待状态:完成前一直处于等待状态:mciSendString(play mydevice from 0 to 100 wait,lpszReturnString,lstrlen(lpszReturnString),NULL);现在学习的是第22页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.
30、2.1 MCI命令命令需要注意的是,用于可以使用缺省的组合键需要注意的是,用于可以使用缺省的组合键Ctrl+Break中断等待状态。使用中断等待状态。使用MCI_BREAK命命令和相应的令和相应的MCI_BREAK_PARMS结构参数可以结构参数可以重新定义该组合键。重新定义该组合键。通知标志通知标志“notify”(MCI_NOTIFY)用于指定)用于指定设备在设备在MCI活动完成后向应用程序发送活动完成后向应用程序发送MM_MCINOTIFY消息,此时应用程序必须有一消息,此时应用程序必须有一个处理该通知消息的窗口过程。一般地,一个个处理该通知消息的窗口过程。一般地,一个MM_MCINOT
31、IFY消息用于命令是否成功完成、消息用于命令是否成功完成、失败、挂起或取消。失败、挂起或取消。现在学习的是第23页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.1 MCI3.2.1 MCI命令命令使用此标志时,应用程序必须指定特定的回调消使用此标志时,应用程序必须指定特定的回调消息窗口句柄。在全局函数息窗口句柄。在全局函数mciSendString中,此中,此窗口句柄为最后一个参数;在全局函数窗口句柄为最后一个参数;在全局函数mciSendCommand中,此窗口句柄保存在结构中,此窗口句柄保存在结构参数的参数的dwCallBack字段中。字段中。测试标志测试标志“
32、test”(MCI_TEST)查询设备是否)查询设备是否能够执行某个命令。如果该设备不能执行该命令能够执行某个命令。如果该设备不能执行该命令则返回一个错误码。当使用此标志时,如果测试则返回一个错误码。当使用此标志时,如果测试结果出现,控制将返回到应用程序。只有数字视结果出现,控制将返回到应用程序。只有数字视频设备和频设备和VCR设备的除设备的除MCI_OPEN和和MCI_CLOSE以外其他命令支持此标志。以外其他命令支持此标志。现在学习的是第24页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备每个每个MCI多媒体设备都支持一组多媒
33、体设备都支持一组MCI核心命令集。核心命令集。不同的媒体设备支持不同的核心命令集。本节谈不同的媒体设备支持不同的核心命令集。本节谈论论MCI设备以及这些设备以及这些MCI设备是如何相应标准的设备是如何相应标准的MCI命令的。命令的。1.MCI设备控制设备控制控制媒体设备的方式非常简单,我们所需要做的控制媒体设备的方式非常简单,我们所需要做的全部工作就是首先打开设备、然后发送操作命令,全部工作就是首先打开设备、然后发送操作命令,最后关闭设备。例如,下面的命令字符串将播放最后关闭设备。例如,下面的命令字符串将播放CDAudio的第的第3至第至第6音轨:音轨:现在学习的是第25页,共42页3.23.
34、2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备mciSendString(open cdaudio,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(set cdaudio time format tmsf,lpazReturnString,lstrlen(lpszReturnString),NULL);mciSendString(play cdaudio from 3 to 6,lpazReturnString,lstrlen(lpszReturnString),NULL)
35、;mciSendString(close cdaudio,lpazReturnString,lstrlen(lpszReturnString),NULL);现在学习的是第26页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备2.MCI设备类型与设备名称设备类型与设备名称对某个设备类型而言,可能存在多个共享相同的对某个设备类型而言,可能存在多个共享相同的命令集但操作不同类型数据的命令集但操作不同类型数据的MCI驱动器。要唯驱动器。要唯一地区分这些一地区分这些MCI驱动器,需要标识对应的设备驱动器,需要标识对应的设备名称,见名称,见“S
36、ystem.ini”文件中的文件中的“mci”小节:小节:mcicdaudio=mcicdasequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvMPEGVideo=mciqtz.drvvideodisc=mcipionr.drvvcr=mcivisca.drv现在学习的是第27页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备3.打开打开MCI设备设备在使用在使用MCI设备之前,必须使用设备之前,必须使用open(MCI_OPEN)命令打开)命令打开MCI设备,该命
37、设备,该命令负责将驱动器装入内存(如果该驱动器没有装令负责将驱动器装入内存(如果该驱动器没有装入内存的话),并检索设备标识符。在使用新的入内存的话),并检索设备标识符。在使用新的设备标识符前,应该检查全局函数设备标识符前,应该检查全局函数mciSendString或或mciSendCommand返回的设返回的设备标识符的有效性。备标识符的有效性。现在学习的是第28页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备与其他与其他MCI命令消息一样,命令消息一样,MCI_OPEN具有一个具有一个机构参数,该参数的缺省类型为机构参数,该参数
38、的缺省类型为MCI_OPEN_PARMS,部分驱动器可能具有扩,部分驱动器可能具有扩展的结构类型(展的结构类型(WAV音频的音频的MCI_WAVE_OPEN_PARMS结构)。除非必须结构)。除非必须使用扩展结构的附加参数,否则可以在任何使用扩展结构的附加参数,否则可以在任何MCI设备中使用缺省结构。注意,可以打开的设备数设备中使用缺省结构。注意,可以打开的设备数目只与可用内存的大小有关。目只与可用内存的大小有关。现在学习的是第29页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备在前面的代码中可以使用在前面的代码中可以使用“ali
39、as”标志设置设备标志设置设备标识符的别名,别名提供了一种同时打开一个文标识符的别名,别名提供了一种同时打开一个文件或设备的多个实例的手段,还可以使用命令字件或设备的多个实例的手段,还可以使用命令字符串设置符串设置WAV文件的别名,如果使用全局函数文件的别名,如果使用全局函数mciSendCommand,则可以填充,则可以填充MCI_OPEN_PARMS结构的结构的lpstrAlias成员。成员。现在学习的是第30页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备在打开在打开MCI设备时,使用设备时,使用“type”标志可以引用标志
40、可以引用设备类型而不是特定的设备驱动器。例如,下述设备类型而不是特定的设备驱动器。例如,下述代码使用代码使用“type”标志指定标志指定WAV音频文件音频文件“F:JuneJune.wav”,且设置别名为,且设置别名为“june”:mciSendString(open F:JuneJune.wav type waveaudio alias chimes,lpszReturnString,lstrlen(lpszReturnString),NULL);使用全局函数使用全局函数mciSendCommand时,设备类型时,设备类型由由MCI_OPEN_PARMS结构中的结构中的lpstrDevice
41、Type成员指定。成员指定。现在学习的是第31页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备已经知道,已经知道,MCI设备分为简单设备和复合设备两设备分为简单设备和复合设备两类。类。CD音频和音频和VCD视频就是简单设备,打开这些视频就是简单设备,打开这些简单设备的方法有两种:简单设备的方法有两种:其一,是设置一个接收注册表或其一,是设置一个接收注册表或INI文件中设置文件中设置的设备名称的字符串(以的设备名称的字符串(以“0”结束)指针,例结束)指针,例如:如:mciSendString(open videodisc,lpsz
42、ReturnString,lstrlen(lpszReturnString),NULL);其二,也可以指定设备驱动器的实际名称。此时,其二,也可以指定设备驱动器的实际名称。此时,应用程序将不再是与设备无关的了。应用程序将不再是与设备无关的了。现在学习的是第32页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备WAV音频和音频和MIDI音频则是复合设备的典型代表。音频则是复合设备的典型代表。打开复合设备的方法有三种:打开复合设备的方法有三种:其一,只指定设备名称,此时没有指定任何复合其一,只指定设备名称,此时没有指定任何复合数据文件。
43、数据文件。其二,只指定文件名,此时没有提供设备类型,其二,只指定文件名,此时没有提供设备类型,相应的设备类型由相应的设备类型由Windowws操作系统注册表中操作系统注册表中的文件关联属性确定。的文件关联属性确定。其三,提供设备类型和文件名,此时其三,提供设备类型和文件名,此时MCI将忽视将忽视系统注册表中的文件关联属性。例如,可以将文系统注册表中的文件关联属性。例如,可以将文件与件与“June.mus”与与WAV音频相关联。音频相关联。现在学习的是第33页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备mciSendString(
44、open June.mus type waveaudio,lpszReturnString,lstrlen(lpszReturnString),NULL);如果如果MCI命令命令open(MCI_OPEN)只提供了文)只提供了文件名而没有文件扩展名,则相应的文件扩展名由件名而没有文件扩展名,则相应的文件扩展名由“Win.ini”文件中的文件中的“mci extensions”小节小节获取。如果需要保存数据文件,则可以使用获取。如果需要保存数据文件,则可以使用save(MCI_SAVE)命令。例如,下述代码打开)命令。例如,下述代码打开一个新的一个新的WAV文件、开始录制、结束录制、保存文件、开
45、始录制、结束录制、保存关闭文件:关闭文件:现在学习的是第34页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备mciSendString(open new type waveaudio alias capture,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(record capture,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(stop capture,lpszRetu
46、rnString,lstrlen(lpszReturnString),NULL);mciSendString(save capture orca.wav,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(close capture,lpszReturnString,lstrlen(lpszReturnString),NULL);open(MCI_OPEN)命令的标志)命令的标志“shareable”(MCI_OPEN_SHAREABLE)用)用于确定该设备或文件是否允许其他应用程序共享于确定该设备或文件是否允许其他应用
47、程序共享访问。访问。现在学习的是第35页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备4.播放播放MCI设备设备Play命令(命令(MCI_PLAY)实际播放一个)实际播放一个MCI设备。设备。如果播放命令没有任何参数,则如果播放命令没有任何参数,则MCI将从当前位将从当前位置开始播放,直到文件结束、媒体结束或命令中置开始播放,直到文件结束、媒体结束或命令中断才停止。回放结束后,媒体的当前位置将保留断才停止。回放结束后,媒体的当前位置将保留在结尾处。可以使用定位命令在结尾处。可以使用定位命令seek(MCI_SEEK)改变当前位置
48、。)改变当前位置。大多数大多数MCI设备支持设备支持“from”标志标志(MCI_FROM)和)和“to”(MCI_TO)标志,)标志,它们用于确定它们用于确定MCI设备回放的开始和结束位置。设备回放的开始和结束位置。需要注意的是,位置值的单位与设备使用的时间需要注意的是,位置值的单位与设备使用的时间格式相关。每个设备都具有一个缺省的时间格式。格式相关。每个设备都具有一个缺省的时间格式。然而在使用位置值之前,需要使用设置命令然而在使用位置值之前,需要使用设置命令set(MCI_SET)指定时间格式。这里推荐读者)指定时间格式。这里推荐读者在使用前后保存并恢复原始时间格式。在使用前后保存并恢复原
49、始时间格式。现在学习的是第36页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备5.停止、暂停、复位与关闭停止、暂停、复位与关闭MCI设备设备停止命令停止命令stop(MCI_STOP)挂起播放或录制命)挂起播放或录制命令。大多数设备同时支持暂停命令令。大多数设备同时支持暂停命令pause(MCI_PAUSE)。当重新使用播放命令)。当重新使用播放命令Play(MCI_PLAY)或录制命令)或录制命令record(MCI_RECORD)时,如果没有指定)时,如果没有指定“from”(MCI_FROM)标志,则从当前位置开)标志,则从
50、当前位置开始。如果没有指定始。如果没有指定“to”(MCI_TO)标志,将)标志,将结束位置为媒体的结尾处。结束位置为媒体的结尾处。部分部分MCI设备支持复位命令设备支持复位命令resume(MCI_RESUME),该命令不会改变再),该命令不会改变再次重放时的位置。次重放时的位置。现在学习的是第37页,共42页3.23.2媒体控制接口类媒体控制接口类MCI MCI 3.2.2 MCI3.2.2 MCI设备设备关闭命令关闭命令close(MCI_CLOSE)在)在MCI设备的的设备的的所有任务完成后关闭之。我们强烈推荐读者在完所有任务完成后关闭之。我们强烈推荐读者在完成成MCI任务后关闭之。任