多媒体音频播放器.ppt_第1页
多媒体音频播放器.ppt_第2页
多媒体音频播放器.ppt_第3页
多媒体音频播放器.ppt_第4页
多媒体音频播放器.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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媒体控制接口类MCI,MCI提供了标准的播放多媒体设备和记录多媒体文件的命令,这些命令使得我们的应用程序可以与设备无关的方式控制音频和视频设备。对所有支持的媒体类型(音频、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)/参数块,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)/形成命令串CharachCommandBuff128;/发送命令串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值的秒字段;MCI_TMSF_TRACK:检索TMSF值的轨(音轨)字段。,3.2媒体控制接口类MCI3.2.1MCI命令,MCI同时提供了两个消息:MM_MCINOTIFY与MM_MCISIGNAL。前者用于通知应用程序MCI命令的完成状态(如果使用了“notify”即MCI_NOTIFY标志),后者只适用于数字视频设备,它用于通知应用程序MCI设备已经到达指定的位置。5.等待、通知与测试标志大多数MCI命令都具有一些特定的标志。等待标志“wait”(MCI_WAIT)和通知标志“notify”(MCI_NOTIFY)是最常见的,它们多多出现在所有的MCI命令中。测试标志“test”(MCI_TEST)只适用于数字视频设备和VCR设备。,3.2媒体控制接口类MCI3.2.1MCI命令,MCI命令通常直接返回,虽然大多数MCI命令实施的活动可能需要很长的时间才能完成。我们可以使用等待标志设置MCI命令的返回时间。使用MCI_WAIT标志将使得应用程序一直处于等待状态,直到所请求的MCI活动已经执行完毕。例如,下述播放命令将使得应用程序在回放没有完成前一直处于等待状态:mciSendString(playmydevicefrom0to100wait,lpszReturnString,lstrlen(lpszReturnString),NULL);,3.2媒体控制接口类MCI3.2.1MCI命令,需要注意的是,用于可以使用缺省的组合键Ctrl+Break中断等待状态。使用MCI_BREAK命令和相应的MCI_BREAK_PARMS结构参数可以重新定义该组合键。通知标志“notify”(MCI_NOTIFY)用于指定设备在MCI活动完成后向应用程序发送MM_MCINOTIFY消息,此时应用程序必须有一个处理该通知消息的窗口过程。一般地,一个MM_MCINOTIFY消息用于命令是否成功完成、失败、挂起或取消。,3.2媒体控制接口类MCI3.2.1MCI命令,使用此标志时,应用程序必须指定特定的回调消息窗口句柄。在全局函数mciSendString中,此窗口句柄为最后一个参数;在全局函数mciSendCommand中,此窗口句柄保存在结构参数的dwCallBack字段中。测试标志“test”(MCI_TEST)查询设备是否能够执行某个命令。如果该设备不能执行该命令则返回一个错误码。当使用此标志时,如果测试结果出现,控制将返回到应用程序。只有数字视频设备和VCR设备的除MCI_OPEN和MCI_CLOSE以外其他命令支持此标志。,3.2媒体控制接口类MCI3.2.2MCI设备,每个MCI多媒体设备都支持一组MCI核心命令集。不同的媒体设备支持不同的核心命令集。本节谈论MCI设备以及这些MCI设备是如何相应标准的MCI命令的。1.MCI设备控制控制媒体设备的方式非常简单,我们所需要做的全部工作就是首先打开设备、然后发送操作命令,最后关闭设备。例如,下面的命令字符串将播放CDAudio的第3至第6音轨:,3.2媒体控制接口类MCI3.2.2MCI设备,mciSendString(opencdaudio,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(setcdaudiotimeformattmsf,lpazReturnString,lstrlen(lpszReturnString),NULL);mciSendString(playcdaudiofrom3to6,lpazReturnString,lstrlen(lpszReturnString),NULL);mciSendString(closecdaudio,lpazReturnString,lstrlen(lpszReturnString),NULL);,3.2媒体控制接口类MCI3.2.2MCI设备,2.MCI设备类型与设备名称对某个设备类型而言,可能存在多个共享相同的命令集但操作不同类型数据的MCI驱动器。要唯一地区分这些MCI驱动器,需要标识对应的设备名称,见“System.ini”文件中的“mci”小节:mcicdaudio=mcicdasequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvMPEGVideo=mciqtz.drvvideodisc=mcipionr.drvvcr=mcivisca.drv,3.2媒体控制接口类MCI3.2.2MCI设备,3.打开MCI设备在使用MCI设备之前,必须使用open(MCI_OPEN)命令打开MCI设备,该命令负责将驱动器装入内存(如果该驱动器没有装入内存的话),并检索设备标识符。在使用新的设备标识符前,应该检查全局函数mciSendString或mciSendCommand返回的设备标识符的有效性。,3.2媒体控制接口类MCI3.2.2MCI设备,与其他MCI命令消息一样,MCI_OPEN具有一个机构参数,该参数的缺省类型为MCI_OPEN_PARMS,部分驱动器可能具有扩展的结构类型(WAV音频的MCI_WAVE_OPEN_PARMS结构)。除非必须使用扩展结构的附加参数,否则可以在任何MCI设备中使用缺省结构。注意,可以打开的设备数目只与可用内存的大小有关。,3.2媒体控制接口类MCI3.2.2MCI设备,在前面的代码中可以使用“alias”标志设置设备标识符的别名,别名提供了一种同时打开一个文件或设备的多个实例的手段,还可以使用命令字符串设置WAV文件的别名,如果使用全局函数mciSendCommand,则可以填充MCI_OPEN_PARMS结构的lpstrAlias成员。,3.2媒体控制接口类MCI3.2.2MCI设备,在打开MCI设备时,使用“type”标志可以引用设备类型而不是特定的设备驱动器。例如,下述代码使用“type”标志指定WAV音频文件“F:JuneJune.wav”,且设置别名为“june”:mciSendString(openF:JuneJune.wavtypewaveaudioaliaschimes,lpszReturnString,lstrlen(lpszReturnString),NULL);使用全局函数mciSendCommand时,设备类型由MCI_OPEN_PARMS结构中的lpstrDeviceType成员指定。,3.2媒体控制接口类MCI3.2.2MCI设备,已经知道,MCI设备分为简单设备和复合设备两类。CD音频和VCD视频就是简单设备,打开这些简单设备的方法有两种:其一,是设置一个接收注册表或INI文件中设置的设备名称的字符串(以“0”结束)指针,例如:mciSendString(openvideodisc,lpszReturnString,lstrlen(lpszReturnString),NULL);其二,也可以指定设备驱动器的实际名称。此时,应用程序将不再是与设备无关的了。,3.2媒体控制接口类MCI3.2.2MCI设备,WAV音频和MIDI音频则是复合设备的典型代表。打开复合设备的方法有三种:其一,只指定设备名称,此时没有指定任何复合数据文件。其二,只指定文件名,此时没有提供设备类型,相应的设备类型由Windowws操作系统注册表中的文件关联属性确定。其三,提供设备类型和文件名,此时MCI将忽视系统注册表中的文件关联属性。例如,可以将文件与“June.mus”与WAV音频相关联。,3.2媒体控制接口类MCI3.2.2MCI设备,mciSendString(openJune.mustypewaveaudio,lpszReturnString,lstrlen(lpszReturnString),NULL);如果MCI命令open(MCI_OPEN)只提供了文件名而没有文件扩展名,则相应的文件扩展名由“Win.ini”文件中的“mciextensions”小节获取。如果需要保存数据文件,则可以使用save(MCI_SAVE)命令。例如,下述代码打开一个新的WAV文件、开始录制、结束录制、保存关闭文件:,3.2媒体控制接口类MCI3.2.2MCI设备,mciSendString(opennewtypewaveaudioaliascapture,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(recordcapture,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(stopcapture,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(savecaptureorca.wav,lpszReturnString,lstrlen(lpszReturnString),NULL);mciSendString(closecapture,lpszReturnString,lstrlen(lpszReturnString),NULL);open(MCI_OPEN)命令的标志“shareable”(MCI_OPEN_SHAREABLE)用于确定该设备或文件是否允许其他应用程序共享访问。,3.2媒体控制接口类MCI3.2.2MCI设备,4.播放MCI设备Play命令(MCI_PLAY)实际播放一个MCI设备。如果播放命令没有任何参数,则MCI将从当前位置开始播放,直到文件结束、媒体结束或命令中断才停止。回放结束后,媒体的当前位置将保留在结尾处。可以使用定位命令seek(MCI_SEEK)改变当前位置。大多数MCI设备支持“from”标志(MCI_FROM)和“to”(MCI_TO)标志,它们用于确定MCI设备回放的开始和结束位置。需要注意的是,位置值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论