MCI接口编程李德方PB10204044一、实验目的熟悉Windows下声卡编程的基本过程及原理,掌握Windows下MCI编程的基本知识。二、实验原理设计多媒体程序,关键是对多种媒体设备的控制和使用,在Windows3.1和Windows95系统中,对多媒体设备进行控制主要有三种方法:第一种方法是使用微软公司窗口系统中对多媒体支持的MCI,即媒体控制接口,MCI是多媒体设备和多媒体应用软件之间进行设备无关的沟通的桥梁。在VB和VC中,MCI都得到了很好的支持。第二种方法,通过调用Windows的API(应用程序接口)多媒体相关函数实现媒体控制。第三种方法是使用OLE(ObjectLinking&Embedding),即对象链接与嵌入技术,它为不同软件之间共享数据和资源提供了有力的手段。Windows多媒体系统函数在DLL中,在开发Windows多媒体应用程序时,最简单的方法是利用Windows的媒体控制接口(MCI)来实现。媒体控制接口属高层音频服务,其MCI设备驱动程序封装了操作波形设备的许多细节,因而编程量小,简单易用。(在VC5中,编制自己的多媒体程序时需要将winmm.lib库连接。有时还需要包括头文件mmsystem.h)。利用MCI高级函数编制的应用程序不能进行录入和播出数据的实时处理。如果需要做较高要求的数据实时处理,则需要利用Windows的多媒体开发工具(MDK)所提供的与设备无关低层音频服务接口函数。我们在本实验中用最简单的方法来实现声音的播放和录制—媒体控制接口编程。使用的windows多媒体API函数如下:MCI接口解释级别PlaySoundSndPlaySound是两个发声函数,只执行单一的播放WAVE文件功能的高级函数处于多媒体接口的顶点(命令-消息接口)mciSendCommandmciGetDeviceID两个高级命令接口命令消息和命令-字符串执行相同的功能,区别是单词和数字的区别最后的执行结果是一样的高级MCI接口(常用的多媒体文件I/O函数)mmioOpenmmioClosemmioReadmmioWritemmioSendMessagemmioDescendmmioAscend高级MCI函数即封装调用了这些I/O函数,用于处理RIFF文件,可执行各种复杂的操作低级多媒体函数三、代码介绍1、使用PlaySound函数播放声音文件:PlaySound(filename,NULL,SND_SYNC);2、使用sndPlaySound函数播放声音文件:sndPlaySound(filename,SND_SYNC);3、使用高级MCI函数播放声音文件:MCI_OPEN_PARMSmciopen;MCI_PLAY_PARMSmciplay;//filename_play存放了声音文件的路径mciopen.lpstrElementName=filename_play;mciopen.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_SEQUENCER;//打开对应的播放设备rtrn=mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE_ID|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciopen);//播放打开的声音文件wDeviceID=mciopen.wDeviceID;mciplay.dwCallback=(DWORD)hwnd;rtrn=mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay);//停止播放mciSendCommand(wDeviceID,MCI_STOP,0,NULL);mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL);4、录音:MCI_OPEN_PARMSmciopen;MCI_RECORD_PARMSmci1;mciopen.lpstrElementName=(LPCSTR);mciopen.lpstrDeviceType=waveaudio;//打开播放设备rtrn=mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciopen);//录制声音wDeviceID=mciopen.wDeviceID;mci1.dwCallback=(DWORD)hwnd;rtrn=mciSendCommand(wDeviceID,MCI_RECORD,MCI_NOTIFY,(DWORD)(LPVOID)&mci1);//停止录音mciSendCommand(wDeviceID,MCI_STOP,0,NULL);//保存录制的声音,filename_save是保存的文件名MCI_SAVE_PARMSmcisave;mcisave.lpfilename=filename_save;mcisave.dwCallback=(DWORD)hwnd;rtrn=mciSendCommand(wDeviceID,MCI_SAVE,MCI_SAVE_FILE|MCI_WAIT,(DWORD)(LPVOID)&mcisave);四、运行结果开始界面:五、思考题1什么是MCI接口?简述MCI所囊括的内容。答:MCI(MediaControlInterface),即媒体控制接口,向基于Windows操作系统的应用程序提供了高层次的控制媒体设备接口的能力。MCI接口包括了CDAudio(激光唱机)、Scanner(图像扫描仪)、VCR(磁带录像机)、Videodisc(激光视盘机)、DAT(数字化磁带音频播放机)、DigitalVideo(窗口中的数字视频)、Overlay(窗口中的模拟视频叠加设备)、MMMovie(多媒体影片演播器)、Sequencer(MIDI音序设备)、WaveAudio(波形音频设备)、Other(未定义的MCI设备)等多媒体的主要产品。2Windows下播放波形文件可以采用几种方法,各有什么优缺点?答:Windows下波形文件有四种播放方法。MessageBeep播放方式,sndPlaySound播放方式,MCI播放方式,WaveOut播放方式。波形文件的MessageBeep播放方式原理简单,操作灵活,不需声卡也能发出鸣叫声。但该方法仅适用于播放较短的波形文件,且波形文件必须要位于Windows目录下。sndPlaySound播放方式功能很强,可以播放磁盘文件或内存中的波形数据,还可以将波形文件作为资源来播放。但该方法有很大局限性,播放对象是比较小的文件(100KB)以内,其次,需要将几个波形文件连续播放时,不能体现出Windows的优越性,CPU利用率低。MCI播放方式提供了一个标准接口,将声卡,视卡,CD激光唱片等当做一个设备去处理。但代码较长,必须用后释放句柄。WaveOut是最低层的播放方式,能控制产生的声音(如音量,放音速度,音调)已达到音响硬件功能极限。但是代码量非常大,且需熟悉RIFF文件结构。3简述Windows下多媒体程序开发的特点。答:Windows的API对很多多媒体内容都可以支持。此外,directShow是非常重要的多媒体开发工具。WindowsMedia就是基于DirectShow的。