3.2音频播放器的制作3.2.1多媒体编程基础3.2.2波形音频播放器3.2.1多媒体编程基础一、多媒体文件二、媒体控制接口MCI3RIFF不是一种新的文件格式,而是基于MSWindows的应用程序提供多媒体文件的框架和包络。RIFF是一种标记文件格式,用标记来标识信息。RIFF提供了一种组织文件的标准方法,可通过加上新的标记来将它扩展。RIFF格式是面向主块(Chunk)的,一个RIFF文件由一个或多个主块组成,其中每一个主块都指向下一主块。每一主块都有一个类型,后面跟随着一些数据。一、多媒体文件多媒体文件格式——资源文件交换格式(Resourceinterchangefileformat,RIFF)4RIFF文件的每个主块含有一个4字符ASCII串ID称为标记,另4字节说明主块的长度,最后为主块数据,RIFF主块的基本结构如下:typedefunsignedlongDWORD;typedefunsignedcharBYTE;typedefDWORDFORRCC;typedefstruct{FOURCCckID;//最多为4字符IDDWORDcksize;//数据字节数BYTEckData[ckSize];//含有实际数据的数组}CK;5RIFF主块RIFF主块类型有RIFF主块定义了RIFF文件的内容表主块允许嵌入额外的文件信息,如存档位置、版权信息、生成日期等子主块当基本主块不够时,允许将更多的信息加到基本主块上6RIFF主块的组织4字节7RIFF的扩展文件名文件类型格式类型文件扩展名波形音频文件WAVE.WAV音频视频交错文件AVI.AVIMIDI文件RMID.RMI独立于设备的位图文件RDIB.RDI调色文件PAL.PAL8WINDOWS的多媒体体系结构9多媒体服务Windows系统以及MMSYSTEM扩展部分提供了大量的多媒体服务函数,根据服务对象大致分为:高层音频服务(使用高层音频播放函数或MCI)使用简单,易于编程,但功能有限低层音频服务(函数用wave,midi,aux加In或Out前缀组成)可灵活有效控制音频,功能强,但对编程知识和技巧要求高动画播放服务(可使用MCI动画命令或多媒体影片演播函数)多媒体文件I/O服务(包括基本I/O、缓冲文件I/O和RIFF文件I/O,命令类似于mmioOpen,mmioCreateChunk)其他服务函数(操纵杆、计时器、屏幕保护等服务)10从RIFF文件中获取信息多媒体I/O函数函数名称函数功能mmioAdvance为mmioGetInfo函数提供了增强的文件I/O缓冲区mmioAscend退出RIFF文件中的主块mmioClose关闭由mmioOpen打开的RIFF文件mmioCreateChunk在由mmioOpen打开的RIFF文件中创建一个主块mmioDescend进入RIFF文件中的主块mmioFlush将RIFF的文件缓冲写入硬盘mmioGetInfo从由mmioOpen打开的RIFF文件中读入信息11mmioInstallIoProc安装或除去一个定制的I/0进程mmioRead从由mmioOpen打开的RIFF文件中读入指定的字节数mmioRename将指定的RIFF文件更名mmioSeek改变由mmioOpen打开的RIFF文件中的文件指针位置mmioSetBuffer允许或禁止缓冲区I/OmmioSetInfo改变由mmioOpen打开的RIFF文件中的信息mmioStringToFOURCC将字符串转换为4字符编码mmioWrite向由mmioOpen打开的RIFF文件中写入指定长度的字节数12如何读RIFF文件在读入RIFF文件时,首先必须打开RIFF文件,然后找到自己感兴趣的主块的位置并把文件指针放在数据的顶部HMMIOh;CStringpath;…if((h=mmioOpen(path,NULL,MMIO_READ))==NULL)returnFALSE;打开一个RIFF文件后,就可以从文件中读出信息了:if(mmioRead(h,&dataformat,(long)n)!=(long)n){mmioClose(h,0);returnFALSE;}13二、媒体控制接口(MCI)媒体控制接口(MCI,MultimediaControlInterface)成为控制接口和外设的基本方法,提供了一种与设备无关的控制多媒体外设的手段。MCI设备类型MCI能够控制两类设备:简单设备和复合设备。简单设备:不需要数据文件的设备,例如CD音频播放设备。对于这类设备,其播放的媒体内部已经包含了所需的数据。复合设备:需要数据文件的设备,如波形音频设备。14MCI所支持的设备类型设备类型说明设备类型说明animation动画设备scanner图形扫描设备CdaudioCD音频设备sequencerMIDI序列器Dat数字音频设备videodisc影碟播放设备Digitalvideo数字视频设备vcr录像机设备other未定义设备waveaidio波形音频设备overlay叠加视频设备15MCI函数接口MCI高级函数接口函数名称函数功能mciGetCreatorTask获得指定MCI设备的任务指针mciGetDeviceID获得MCI设备的标识符mciGetErrorString获得MCI错误信息mciGetYieldProc获得回调函数的地址mciSendCommand向指定MCI设备发送命令消息mciSendString向指定MCI设备发送命令字符串mciSetYieldProc设置回调函数的地址161.mciGetCreatorTask[原型]HANDLEmciGetCreatorTask(MCIDEVICEIDIDDevice)[功能]获得指定MCI设备的任务指针。[参数]IDDevice—任务所返回的设备ID。[返值]如果函数成功执行则返回所打开设备的指针,否则返回NULL。2.mciGetDeviceID[原型]MCIDEVICEIDmciGetDeviceID(LPCTRSTRlpszDevice)[功能]获得MCI设备的标识符。[参数]lpszDevice—指定设备的名称或别名的字符串。[返值]如果函数执行成功则返回指定设备的标识符,否则返回0。执行该函数所获得的设备标识符通常用于mciSendCommand函数。173.mciGetErrorString[原型]BOOLmciGetErrorString(DWORDfdwError,LPTSTRlpszErrorText,UINTcchErrorText)[功能]获得MCI错误信息。[参数]fdwError—mciSendCommand或mciSendString函数返回的错误码。lpszErrorText—描述错误码的字符串。cchErrorText—lpszErrorText字符串的长度。[返值]如果函数执行成功则返回TRUE,否则返回FALSE。184.mciGetYieldProc[原型]YIELDPROCmciGetYieldProc(MCIDEVICEIDIDDevice,LPDWORDlpdwYieldData);[功能]获得回调函数的地址。[参数]IDDeice—执行MCI命令的设备标识符。LpdwYieldData—将传给回调函数的输出数据缓冲区。[返值]如果函数执行成功则返回回调函数的地址,否则返回NULL。195.mciSendCommand[原型]MCIERRORmciSendCommand(MCIDEVICEIDIDDevice,UINTuMsg,DWORDfdwCommand,DWORDdwParam);[功能]向指定MCI设备发送命令消息。[参数]IDDevice—接收MCI命令的设备标识符。uMsg—命令消息。FdwCommand—MCI命令消息的标识位。dwParam—为指向MCI命令消息数据结构的指针。[返值]如果函数执行成功返回0。否则返回非0值。当出现MCI错误时返回值的低位字包含错误信息。如果错误和设备有关,则返回值的高位字为设备的标识符,否则高位字为0。将返回值传给mciGetErrorString()可以得到错误信息。206.mciSendString[原型]MCIERRORmciSendString(LPCTSTRlpszCommand,LPTSTRlpszReturnString,UINTcchReturn,HANDLEhwndCallback);[功能]向指定MCI设备发送命令字符串。[参数]lpszCommand—包含MCI命令的字符串。LpszReturnString—接收返回命令的字符串。cchRerurn—接受返回信息的字符串大小。HwndCallback—回调窗口句柄,该参数当指定了notify标志时有效。[返值]如果函数成功执行则返回0,否则返回非0值。当出现MCI错误时返回值的低位字节包含错误信息。如果错误与设备无关,则返回值的高位字为设备的标识符,否则高位为0。将返回值传给mciGetErrorString()可以得到错误信息。217.mciSetYieldProc[原型]UINTmciSetYieldProc(MCIDEVICEIDIDDevice,YIELDPROCyp,DWORDdwYieldData);[功能]设置回调函数的地址。[参数]IDDevice—回调函数作用的MCI设备标识符。yp—回凋函数的地址。DwYieldData—传送给回调函数的数据。[返值]如果函数成功执行返回TRUE,否则返回FALSE。MCI对媒体播放设备的控制主要是通过命令接口函数mciSendCommand()和字符串接口函数mciSendString()来完成的。调用命令接口函数之前需要初始化复杂的命令数据结构,因此它比命令字符串的使用更为复杂,相应它也为MCI及其播放设备提供了更为强大的控制能力。22MCI命令消息1.MCI_OPEN命令消息使用该命令初始化设备或文件,所有的设备都能由这一命令打开。MciSendCommand(MCIDEVICEIDwDeviceID,MCI_OPEN,DWORDdwFlags,(DWORD)(LPMCI_OPEN_PARMS)lpOpen);wDeviceID将接收命令信息的MCI设备ID;dwFlags是命令消息的标志,通常为MCI_WAIT和MCI_NOTIFY;lpOpen为指向MCI_OPEN_PARMS结构的指针23MCI_OPEN_PARMS数据结构的定义:typedefstruct{DWORDdwCallback;MCIDEVICEIDwDeviceID;LPCSTRlpstrDeviceType;LPCSTRlpstrElementName;LPCSTRlpstrAlias;}MCI_OPEN_PARMS;dwCallback指定使用MCI_NOTIFY标志的窗口句柄;wDeviceID返回MCI设备ID;lpstrDeviceType为MCI设备类型,这与要播放的媒体文件一致;lpstrElementName为设备元素;lpstrAlias为可选设备的别名。242.MCI_SET命令消息使用该命令设置设备信息mciSendCommand(MCIDEVICEIDwDeviceID,MCI_SET,DWORDdwFlags,(DWORD)(LPMCI_SET_PARMS)lpSet);wDeviceID将接收命令信息的MCI设备ID;dwFlags是命令消息的标志,通常为MCI_WAIT和MCI_NOTIFY;lpOpen为指向MCI_SET_PARMS结构的指针25MCI_SET_PARMS数据结构的定义:typedefstruct{DWORDdwCallback;DWORDdwTimeFormat;DWORDdwAudio;}MCI_SET_PARMS;dwCallback指定使用MCI_NOTIFY标志的窗口句柄;dwTim