我们有时会希望为自己的程序增加音效,例如警告声等,这就需要播放WAV文件。较简单的做法,我们可以使用多媒体控件(VB和Delphi都提供了MCI控件)来完成,但这样做无疑会增加系统负担和使程序体积增大(使用OCX的话尤其明显)。如果我们的程序并非一个多媒体程序而仅仅是用来播放音效的话,就更不划算了。有没有更理想的方法呢?答案是肯定的,Windows已经为我们提供了一个关于多媒体处理的动态连接库WINMM.DLL(旧版本为MMSYSTEM.DLL),通过调用它所提供的API函数,我们就可以使用MCI指令进行多媒体方面的操作了。 让我们先来了解一下什么是MCI指令,MCI的全称是MediaControlInterface(媒体控制接口)。实际上MCI是一个高级的函数调用接口,我们可以把它看作是一个解释器,通过它,我们就可以直接和外部音频或视频设备打交道了。 接下来,就需要了解一下需要用到的API和MCI指令。有三个与MCI有关的API,它们是:mciSendString(),mciExecute()和mciGetErrorString()。mciSendString函数的功能是传送指令字符串给MCI,mciExecute的功能和mciSendString一样,不同的是当发生错误时mciExecute会弹出对话框显示错误信息。mciGetErrorString的功能是将MCI错误代码转换为字符串。现在假设我们的编程环境是VB或Delphi,下面就在这两种环境的情况中介绍其使用方法。 在VB中,调用API函数必须先进行声明,它们的格式分别为: DeclareFunctionmciExecuteLib“winmm.dll"Alias“mciExecute"(ByVallpstrCommandAsString)AsLong DeclareFunctionmciSendStringLib“winmm.dll“Alias“mciSendStringA"(ByVallpstrCommandAsString,ByVallpstrReturnStringAsString,ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong DeclareFunctionmciGetErrorStringLib“winmm.dll"Alias“mciGetErrorStringA"(ByValdwErrorAsLong,ByVallpstrBufferAsString,ByValuLengthAsLong)AsLong 在Delphi中相对较简单,由于Delphi已经将多媒体相关的API声明预编译在MMSYSTEM.DCU文件中,所以我们只需要在单元的Uses语句后加上mmsystem即可在本单元中使用上述三个API函数了。 接着再介绍一些常用的MCI指令。 MCI指令一般格式为:MCI指令设备名[参数] 打开多媒体设备:open,如:openCDAudio、openc:\windows\chimes.wavtypewaveaudio。 播放多媒体设备:play,如:playCDAudiofrom5000to20000(播放CD的第5秒到第20秒)、playc:\windows\chimes.wav。 关闭多媒体设备:close,如:closeall(关闭所有多媒体设备)。 得到设备状态信息:status,如:statuscdaudionumberoftrack(得到CD的曲目总数) 有了这些预备知识,就可以将MCI和API结合起来进行多媒体编程了。 例如,要在程序中使用音效(播放WAV文件),要求如果WAV文件不存在的话要求忽略错误(即不弹出出错信息),则程序如下(以VB为例,Delphi中类似): DimResultasInteger DimReturnStrAsString*1024'注意,必须指定String的长度 Result=mciSendString(“playc:\windows\chimes.wav",ReturnStr,1024,0)'其中ReturnStr为某些MCI指令执行后传送给程序的文字信息 以上这段程序可以播放指定的WAV文件,如果成功执行,则Result的值为0,如果文件不存在或出现其他错误,错误代码会传送给Result,但程序不会中断。若要根据错误代码自行处理错误信息,可以使用mciGetErrorString函数处理: DimErrStrAsString*1024 ifResult=0then msgbox“播放成功" Else i%=GetErrorString(ReturnStr,ErrStr,1024) msgboxErrStr EndIf 下面,我们举一个完整的程序作为例子(还是以VB为例),我们可以用API写一个CD播放器来代替使用多媒体控件。这样做的好处很明显,当你把程序编译成为EXE文件后复制给朋友的时候,你再也不必附加其他OCX文件(如果是Delphi的话,EXE文件体积也可以减小)。 在VB中新建一个工程,在Form1中添加6个按钮和一个Timer控件,属性如下(效果如图): 名称:Command1,Caption:弹出 名称:Command2,Caption:播放 名称:Command3,Caption:暂停 名称:Command4,Caption:下一首 名称:Command5,Caption:上一首 名称:Command6,Caption:退出 名称:Timer1,Interval:1000 接着,我们就可以编写代码了,如下: '函数声明 PrivateDeclareFunctionmciExecuteLib“winmm.dll"(ByVallpstrCommandAsString)AsLong PrivateDeclareFunctionmciSendStringLib“winmm.dll"Alias“mciSendStringA"(ByVallpstrCommandAsString,ByVallpstrReturnStringAsString,ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong DimCurAsInteger'保存当前正在播放的曲目号 DimTotalAsInteger'保存CD曲目总数 '弹出CD-ROM PrivateSubCommand1_Click() i%=mciExecute(“setcdaudiodooropen") EndSub '播放 PrivateSubCommand2_Click() i%=mciExecute("playcdaudio") EndSub '暂停 PrivateSubCommand3_Click() i%=mciExecute(“pausecdaudio") EndSub '播放下一首 PrivateSubCommand4_Click() DimReturnStrAsString*128 i%=mciExecute(“setcdaudiotimeformattmsf")'设置from后的时间格式 IfCur<TotalTheni%=mciExecute(“playcdaudiofrom"+Str(Cur+1)) EndSub '播放上一首 PrivateSubCommand5_Click() DimReturnStrAsString*128 i%=mciExecute(“setcdaudiotimeformattmsf") IfCur>1Theni%=mciExecute(“playcdaudiofrom"+Str(Cur-1)) EndSub '中止CD的播放并退出 PrivateSubCommand6_Click() i%=mciExecute(“stopcdaudio") i%=mciExecute(“closecdaudio") End EndSub '程序启动时打开CDAudio设备并得到曲目总数 PrivateSubForm_Load() DimReturnStrAsString*128 i%=mciSendString(“opencdaudio",ReturnStr,128,0) i%=mciSendString(“statuscdaudionumberoftracks",ReturnStr,128,0) Total=Val(ReturnStr) EndSub '退出时中止CD的播放 PrivateSubForm_Unload(CancelAsInteger) i%=mciExecute(“stopcdaudio") i%=mciExecute(“closecdaudio") EndSub '每隔一秒监测当前播放的曲目号 PrivateSubTimer1_Timer() OnErrorResumeNext DimReturnStrAsString*128 i%=mciSendString(“statuscdaudiocurrenttrack",ReturnStr,128,0) Cur=Val(ReturnStr) EndSub 好了,现在这个CD播放器已经可以工作了,如果你再为它扩充一些有趣的功能的话,就是一个完整的小软件了。->
|