第3章多媒体音频播放器

上传人:小**** 文档编号:243134421 上传时间:2024-09-16 格式:PPT 页数:42 大小:511.50KB
返回 下载 相关 举报
第3章多媒体音频播放器_第1页
第1页 / 共42页
第3章多媒体音频播放器_第2页
第2页 / 共42页
第3章多媒体音频播放器_第3页
第3页 / 共42页
点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,北华航天工业学院计算机系 制作,单击此处编辑母版标题样式,单击此处编辑母版标题样式,VC+,程序设计项目实践,贾振华,第,3,章 多媒体音频播放器,学习目标:,几种重要的音频格式,媒体控制接口类,MCI,命令,媒体控制接口类,MCI,设备,mciSendString,和,mciSendCommand,函数的使用,3.1,几种重要的音频格式,3.1.1,波形音频,波音音频是一种电子数字化的声音,是计算机播放音频的一种重要格式,它存储的是声音的波形信息,当播放波形音频时,不管播放文件的设备是何种类型,都会得到相似的声音,波形音频文件通常,wav,作为文件扩展名。由于采用波形音频存储电子化声音需要大量的存储空间,因此它一般只用于短时间的声音播放。,波形音频主要有以下几个属性,他们决定了声音的质量。,(,1,)采样平率 (,2,)量化位数 (,3,)声道数,3.1,几种重要的音频格式,3.1.2 MIDI,音频,MIDI,(,Musical Instrument Digital Interface,)在多媒体音频中占有重要的位置,是播放和录制音乐的国际标准。它确定了连接音乐设备的电缆线、硬件和通信协议。多媒体,PC,只需要具有,MIDI,接口和,MIDI,合成器就可具备处理,MIDI,的功能。,MIDI,在处理音乐时是将,MIDI,音乐设备上产生的活动编码记录下来,将这些数据传递到,MIDI,合成器上就能重现原来的演奏。,MIDI,的消息有两种类型:状态字节和数字字节;状态字节,u,发送的类别(动作和函数);数字字节总是跟在状态字节后,表示发送消息的实际值。数字字节的个数取决与状态字节表示的消息类型。,MIDI,通过通道字节最高位区别这两种类型。最高位为,1,,表示状态字节,为,0,表示数字字节。,所有,MIDI,消息通过通道来接收和发送。通道上能够传递不同乐器的声音。音序器根据通道传递的消息,让不同的乐器演奏不同声部。使用通道,使,MIDI,的音乐效果大大增强。但是如果不对声道和相应乐器作统一规定的话将会造成混乱。,Windows,使用通用的,MIDI,标准定义通道的分配。,3.1,几种重要的音频格式,3.1.3 CD,音频,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,媒体控制接口类,MCI 3.2.1 MCI,命令,MCI,支持命令字符串和命令消息两种方式控制,MCI,设别,我们可以在,MCI,应用程序中使用其中的任何一种或混合使用这两种方式。,命令消息接口包含常数和结构信息。使用全局函数,mciSendCommand,向某个,MCI,设备发送消息。,命令字符串接口则提供命令消息的文本版本,它是比命令消息接口要高级的,MCI,接口。使用命令字符串接口时,必须使用全局函数,mciSendString,向某个,MCI,设备发送字符串。,Microsoft Windows,操作系统在向指定的,MCI,设备发送该字符串时将其解释成相应的命令消息。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,命令消息方式使用结构检索信息,这些结构包含了不同设备的不同信息。而命令字符串方式则将检索到的信息打包到一个字符串中,读者使用,MCI,命令字符串方式翻译该字符串。,在一般不需要检查,MCI,命令返回值时,我们推荐读者使用,MCI,命令字符串方式操作,MCI,设备,它更易于理解和记忆,在本实例中,我们将使用命令消息方式而不是命令字符串方式。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,1.,全局函数,mciSendCommand,mciSendCommand,负责向指定的,MCI,设备发送一个命令消息,其函数原型为:,MCIERROR,mciSendCommand(MCIDEVICEID,IDDevice, UINT,uMsg, DWORD,fdwCommand, DWORD,dwParam,);,其中的参数,IDDevice,表示接收该消息的,MCI,设备类型。,MCI_OPEN,命令消息不实用此参数,参数,uMsg,为相应的命令消息,参数,fdwCommand,为命令消息的标志,参数,dwParam,则为命令消息包含参数的结构地址。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,如果,mciSendCommand,成功发送命令消息,函数返回,0,,否则返回相应的,MCI,错误码。需要注意的是,错误码包含在返回的,DWORD,(双字)类型值的低地址字中。如果该错误与特定的设备有关,则高地址字为发生错误的驱动器标识,否则高地址字为,0,。有关,MCI,错误的信息,请参阅,MCI,错误类型一节。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,如果要检索,mciSendCommand,返回值的文本描述,可以使用全局函数,mciGetErrorString,. MCI,命令消息的语法包含三个元素:常数消息值、包含命令参数的结构和确定命令选项和参数有效字段的标志集合。例如,下面的代码向指定的,MCI,设备发送一个,MCI_PLAY,命令:,mciSendCommand(wDeviceID, /,设备标识,MCI_PLAY, /,命令消息,0, /,标志,(,DWORD)(LPVOID)&mciPlayParms,); /,参数块,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,最后一个参数,mciPlayParms,为,MCI_PLAY_PARMS,类型的结构地址,其中可能包含了回放的开始和结束位置。大多数,MCI,命令消息都使用类似的结构包含足够的,MCI,操作信息。所有这些结构的第一个参数都是,MCI,操作完成后接收,MM_MCINOTIFY,通知消息的窗口句柄。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,2.,全局函数,mciSendString,全局函数,mciSendString,负责向,MCI,设备发送一个命令字符串。接收命令的设备由字符串的内容指定。,MCIERROR,mciSendString(LPCTSTR,lpszCommand, LPTSTR,lpszReturnString,UINT,cchReturn, HANDLE,hwndCallback,);,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,其中的参数,lpszCommand,表示,MCI,命令字符串(以“,0”,结束)的地址,参数,lpszReturnString,则为返回字符串的缓冲区地址,参数,cchReturn,为参数,lpszReturnString,指定的字符缓冲区大小,如果命令字符串指定了通知(“,notify”,)标志,则参数,hwndCallback,则为回调窗口的句柄。,mciSendString,的返回值与,mciSendCommand,相同。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,MCI,命令字符串的语法为典型的“动词,对象,修饰符”结构。每个命令字符串都包括一个命令、一个设备标识符和命令参数。其中的参数对部分命令可选的,而对于部分命令是必须的。一般地,一个命令字符串的形式为:,command,device_id,arguments,其中,,command,指定了,MCI,命令,例如,open,、,colse,或,play,等;,device_id,标识了,MCI,驱动器的一个实例(,device_id,在打开设备时创建);,arguments,指定了命令所使用的标志和变量。这里的标志为,MCI,命令可识别的关键字,变量为,MCI,命令或标志使用的数字或字符串。例如,希望从指定的位置播放到指定的位置,可以使用下面的代码实现:,3.2,媒体控制接口类,MCI 3.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);,这里的“,from”,和“,to”,是可识别的预定义标志。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,3. MCI,命令的分类,MCI,定义了四种类型的命令:,(,1,)系统命令: (,2,)必需命令,(,3,)基本命令 (,4,)扩展命令,系统命令和必需命令为所有,MCI,设备都必须支持的最小命令集,而基本命令和扩展命令并不为所有的,MCI,设备支持。如果应用程序需要使用基本命令和扩展命令,则应该在使用该命令之前查询该设备是否支持它(使用查询命令,MCI_GETDEVCAPS,)。,MCI,命令见教材表,3-2,所示。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,4. MCI,函数、宏和消息,大多数,MCI,应用程序需要重复使用全局函数,mciSendString,和,mciSendCommand,。除了这两个函数之外,,MCI,还提供了其他几个不太常用的全局函数。,全局函数,mciGetErrorString,的意义前文已经述及。此外,全局函数,mciGetCreatorTask,允许应用程序使用设备标识符检索创建该标识符的任务句柄。全局函数,mciGetYieldProc,与,mciSetYieldProc,可以指定或检索与“,wait”,(,MCI_WAIT,)标志相关的回调函数地址。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,大多数,MCI,命令需要的设备标识符都由调用,MCI_OPEN,命令而得到。但在部分情况下,可能不希望打开该设备而获取设备标识符,此时可以使用全局函数,mciGetDeviceID,。,不同的媒体可能使用不同的时间格式,这些时间格式包括,HMS,(时,/,分,/,秒)格式,,MSF(,分,/,秒,/,帧,),格式和,TMSF,(轨,/,分,/,秒,/,帧)格式等。,MCI,提供了多个宏以进行媒体的时间格式变换,这些宏有:,3.2,媒体控制接口类,MCI 3.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,: 检索,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,媒体控制接口类,MCI 3.2.1 MCI,命令,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,媒体控制接口类,MCI 3.2.1 MCI,命令,MCI,命令通常直接返回,虽然大多数,MCI,命令实施的活动可能需要很长的时间才能完成。我们可以使用等待标志设置,MCI,命令的返回时间。使用,MCI_WAIT,标志将使得应用程序一直处于等待状态,直到所请求的,MCI,活动已经执行完毕。,例如,下述播放命令将使得应用程序在回放没有完成前一直处于等待状态:,mciSendString(play,mydevice,from 0 to 100 wait,lpszReturnString,lstrlen(lpszReturnString,), NULL);,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,需要注意的是,用于可以使用缺省的组合键,Ctrl+Break,中断等待状态。使用,MCI_BREAK,命令和相应的,MCI_BREAK_PARMS,结构参数可以重新定义该组合键。,通知标志“,notify”,(,MCI_NOTIFY,)用于指定设备在,MCI,活动完成后向应用程序发送,MM_MCINOTIFY,消息,此时应用程序必须有一个处理该通知消息的窗口过程。一般地,一个,MM_MCINOTIFY,消息用于命令是否成功完成、失败、挂起或取消。,3.2,媒体控制接口类,MCI 3.2.1 MCI,命令,使用此标志时,应用程序必须指定特定的回调消息窗口句柄。在全局函数,mciSendString,中,此窗口句柄为最后一个参数;在全局函数,mciSendCommand,中,此窗口句柄保存在结构参数的,dwCallBack,字段中。,测试标志“,test”,(,MCI_TEST,)查询设备是否能够执行某个命令。如果该设备不能执行该命令则返回一个错误码。当使用此标志时,如果测试结果出现,控制将返回到应用程序。只有数字视频设备和,VCR,设备的除,MCI_OPEN,和,MCI_CLOSE,以外其他命令支持此标志。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,每个,MCI,多媒体设备都支持一组,MCI,核心命令集。不同的媒体设备支持不同的核心命令集。本节谈论,MCI,设备以及这些,MCI,设备是如何相应标准的,MCI,命令的。,1. MCI,设备控制,控制媒体设备的方式非常简单,我们所需要做的全部工作就是首先打开设备、然后发送操作命令,最后关闭设备。例如,下面的命令字符串将播放,CDAudio,的第,3,至第,6,音轨:,3.2,媒体控制接口类,MCI 3.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);,mciSendString(close,cdaudio,lpazReturnString,lstrlen(lpszReturnString,), NULL);,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,2. MCI,设备类型与设备名称,对某个设备类型而言,可能存在多个共享相同的命令集但操作不同类型数据的,MCI,驱动器。要唯一地区分这些,MCI,驱动器,需要标识对应的设备名称,见“,System.ini,”,文件中的“,mci,”,小节:,mci,cdaudio,=,mcicda,sequencer=,mciseq.drv,waveaudio,=,mciwave.drv,avivideo,=,mciavi.drv,MPEGVideo,=,mciqtz.drv,videodisc=,mcipionr.drv,vcr,=,mcivisca.drv,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,3.,打开,MCI,设备,在使用,MCI,设备之前,必须使用,open,(,MCI_OPEN,)命令打开,MCI,设备,该命令负责将驱动器装入内存(如果该驱动器没有装入内存的话),并检索设备标识符。在使用新的设备标识符前,应该检查全局函数,mciSendString,或,mciSendCommand,返回的设备标识符的有效性。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,与其他,MCI,命令消息一样,,MCI_OPEN,具有一个机构参数,该参数的缺省类型为,MCI_OPEN_PARMS,,部分驱动器可能具有扩展的结构类型(,WAV,音频的,MCI_WAVE_OPEN_PARMS,结构)。除非必须使用扩展结构的附加参数,否则可以在任何,MCI,设备中使用缺省结构。注意,可以打开的设备数目只与可用内存的大小有关。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,在前面的代码中可以使用“,alias”,标志设置设备标识符的别名,别名提供了一种同时打开一个文件或设备的多个实例的手段,还可以使用命令字符串设置,WAV,文件的别名,如果使用全局函数,mciSendCommand,,则可以填充,MCI_OPEN_PARMS,结构的,lpstrAlias,成员。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,在打开,MCI,设备时,使用“,type”,标志可以引用设备类型而不是特定的设备驱动器。例如,下述代码使用“,type”,标志指定,WAV,音频文件“,F:June,June.wav,”,,且设置别名为“,june,”,:,mciSendString(open,F:June,June.wav,type,waveaudio,alias chimes,lpszReturnString,lstrlen(lpszReturnString,), NULL);,使用全局函数,mciSendCommand,时,设备类型由,MCI_OPEN_PARMS,结构中的,lpstrDeviceType,成员指定。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,已经知道,,MCI,设备分为简单设备和复合设备两类。,CD,音频和,VCD,视频就是简单设备,打开这些简单设备的方法有两种:,其一,是设置一个接收注册表或,INI,文件中设置的设备名称的字符串(以“,0”,结束)指针,例如:,mciSendString(open,videodisc,lpszReturnString,lstrlen(lpszReturnString,), NULL);,其二,也可以指定设备驱动器的实际名称。此时,应用程序将不再是与设备无关的了。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,WAV,音频和,MIDI,音频则是复合设备的典型代表。打开复合设备的方法有三种:,其一,只指定设备名称,此时没有指定任何复合数据文件。,其二,只指定文件名,此时没有提供设备类型,相应的设备类型由,Windowws,操作系统注册表中的文件关联属性确定。,其三,提供设备类型和文件名,此时,MCI,将忽视系统注册表中的文件关联属性。例如,可以将文件与“,June.mus,”,与,WAV,音频相关联。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,mciSendString(open,June.mus,type,waveaudio,lpszReturnString,lstrlen(lpszReturnString,), NULL);,如果,MCI,命令,open,(,MCI_OPEN,)只提供了文件名而没有文件扩展名,则相应的文件扩展名由“,Win.ini,”,文件中的“,mci,extensions”,小节获取。如果需要保存数据文件,则可以使用,save,(,MCI_SAVE,)命令。例如,下述代码打开一个新的,WAV,文件、开始录制、结束录制、保存关闭文件:,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,mciSendString(open,new type,waveaudio,alias capture,lpszReturnString,lstrlen(lpszReturnString,), NULL);,mciSendString(record,capture,lpszReturnString,lstrlen(lpszReturnString,), NULL);,mciSendString(stop,capture,lpszReturnString,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,)用于确定该设备或文件是否允许其他应用程序共享访问。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,4.,播放,MCI,设备,Play,命令(,MCI_PLAY,)实际播放一个,MCI,设备。如果播放命令没有任何参数,则,MCI,将从当前位置开始播放,直到文件结束、媒体结束或命令中断才停止。回放结束后,媒体的当前位置将保留在结尾处。可以使用定位命令,seek,(,MCI_SEEK,)改变当前位置。,大多数,MCI,设备支持“,from”,标志(,MCI_FROM,)和“,to”,(,MCI_TO,)标志,它们用于确定,MCI,设备回放的开始和结束位置。,需要注意的是,位置值的单位与设备使用的时间格式相关。每个设备都具有一个缺省的时间格式。然而在使用位置值之前,需要使用设置命令,set,(,MCI_SET,)指定时间格式。这里推荐读者在使用前后保存并恢复原始时间格式。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,5.,停止、暂停、复位与关闭,MCI,设备,停止命令,stop,(,MCI_STOP,)挂起播放或录制命令。大多数设备同时支持暂停命令,pause,(,MCI_PAUSE,)。当重新使用播放命令,Play,(,MCI_PLAY,)或录制命令,record,(,MCI_RECORD,)时,如果没有指定“,from”,(,MCI_FROM,)标志,则从当前位置开始。如果没有指定“,to”,(,MCI_TO,)标志,将结束位置为媒体的结尾处。,部分,MCI,设备支持复位命令,resume,(,MCI_RESUME,),该命令不会改变再次重放时的位置。,3.2,媒体控制接口类,MCI 3.2.2 MCI,设备,关闭命令,close,(,MCI_CLOSE,)在,MCI,设备的的所有任务完成后关闭之。我们强烈推荐读者在完成,MCI,任务后关闭之。,注意,当我们关闭外部,MCI,设备时(使用自己的媒体而不是文件,例如,CD,音频),驱动器将使得该设备保留当前操作模式不变。即使我们已经从内存中删除了该设备的驱动器,,CD,音频也将持续播放到结束处才能够停止下来。,3.2,媒体控制接口类,MCI 3.2.3,使用,mciSendString,和,mciSendCommand,1.,使用,mciSendString,(参考教材源程序),2.,打开,MCI,设备(参考教材源程序),3.,播放,MCI,设备(参考教材源程序),4.,设置时间格式(参考教材源程序),5.,检索,CD,音频信息,(参考教材源程序),3.3,实现步骤,参考教材,运行界面如图,3-2,所示:,图,3-2,程序运行界面,3.4,本章小结,本实例介绍了几种重要的音频格式、媒体控制接口类,MCI,的基础知识(包括,MCI,命令、,MCI,设备等)以及,mciSendString,和,mciSendCommand,函数的使用,在此基础上设计与实现了简单的多媒体音频播放器。,本实例可以播放常见的音频格式文件(,mp3,,,wav,,,mid,,,wma,等格式),随时播放、停止音频文件等。但该播放器的功能是有限的,只实现了最简单的功能。读者可以根据自己的需要,参看联机帮助进行补充和完善。,Thank You !,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!