Re:请问如何同时播放多个音频?

[复制链接]
查看11 | 回复0 | 2021-1-29 05:15:10 | 显示全部楼层 |阅读模式
用VB播放Avi、Wave、midi文件http://tech.163.com 2006-06-2109:43:04 来源:webasp  网友评论1条论坛 Csdn上已经有好多朋友问过诸如:“如何播放Avi、Wave、midi文件”、:“谁知道用api播放avi,mpg的详细方法?要可以设定将图像放置到设定的窗体中”、“如何同时播放两个Wav文件”的问题,其实用一个类模块就一切搞定,不需要什么控件之类的东西下面这个类模块,我研究后将它修改得更好用了将下面这个类模块存为Mmedia.cls'----------------------------------------------------OptionExplicit'--------------TrueZq最新更新2001-01-12---------------------'文件名:MMedia.cls'说明::一个多媒体类,能播放Avi、Wave、Midi文件'用法:'DimMultimediaAsNewMmedia'Multimedia.mmOpenc:\test.wav'Multimedia.mmPlay'!记住:在程序结束时,一定要用SetMultimedia=nothing释放资源!!!'-----------------------------------------------------'-=-=-=-属性-=-=-=-'sFilename当前的文件名'nLength文件长度(只读)'nPosition当前位置'sStatus当前状态(只读)'bWaitTrue/False.决定是否等待播放完'-=-=-=-方法-=-=-=-=-'mmOpenFilename打开要播放的文件'mmClose关闭当前文件'mmPause暂停'mmStop停止停止后可以跳到开始再次播放'mmSeekPositionSeekstoapositioninthefile'mmPlay播放'--------------------------------------------------------------PrivatesAliasAsString'别名'PrivatehWndAsLongPrivatesFilenameAsString'当前的文件名PrivatenLengthAsSingle'文件长度
PrivatenPositionAsSingle'当前位置PrivatesStatusAsString'当前状态PrivatebWaitAsBoolean'决定是否等待播放完ConstWS_CHILD=H40000000'------------API声明-------------PrivateDeclareFunctionmciSendStringLibwinmm.dll_AliasmciSendStringA(ByVallpstrCommandAsString,_ByVallpstrReturnStringAsString,ByValuReturnLengthAsLong,_ByValhwndCallbackAsLong)AsLong'PrivateDeclareFunctionGetActiveWindowLibUSER32()AsInteger'当sTheFile是一个Avi文件时,参数hWnd指定动画在哪里播放'若hWnd=0,则新开一个窗口播放动画。'如果听不到Midi音乐,请在Windows下用媒体播放器测试一下。'文件名不能带空格PublicSubmmOpen(ByValsTheFileAsString,OptionalhWndAsLong=0)DimnReturnAsLongDimsTypeAsString'文件类型StaticnNumAsInteger
IfsAliasThen'关闭开始打开的文件mmCloseEndIf
If(Dir(sTheFile)=)Then'判断是否是一个存在的文件sFilename=文件sTheFile不存在!ExitSubElsesFilename=sTheFile'nNum=nNum+1EndIf'StopsAlias=sFilename'用文件名作别名,避免别名冲突!'判断文件类型SelectCaseUCase$(Right$(sTheFile,3))CaseWAVsType=WaveaudioCaseAVIsType=AviVideo
CaseMIDsType=SequencerCaseElse'未知文件格式,退出。ExitSubEndSelect
IfsType=AviVideoAndhWnd0ThennReturn=mciSendString(opensTheFileALIASsAlias_TYPEAVIVideoparenthWndstyleLTrim$(Str$(WS_CHILD)),0,0,0)ElsenReturn=mciSendString(OpensTheFileALIASsAlias_TYPEsType,,0,0)EndIf
EndSub'关闭当前打开的多媒体文件PublicSubmmClose()DimnReturnAsLong
'如果没有文件打开,则退出IfsAlias=ThenExitSub
nReturn=mciSendString(ClosesAlias,,0,0)sAlias=sFilename=
EndSub'暂停PublicSubmmPause()
DimnReturnAsLong
IfsAlias=ThenExitSubElseIfStatus=pausedThen'如果先前已经暂停了,则解除暂停mmPlayElsenReturn=mciSendString(PausesAlias,,0,0)EndIf'nPosition=PositionEndSub'播放PublicSubmmPlay()
DimnReturnAsLong
IfsAlias=ThenExitSubElseIfPosition=LengthThen'如果已经到末尾mmSeek0'跳到开始处EndIf
IfbWaitThennReturn=mciSendString(PlaysAliaswait,,0,0)ElsenReturn=mciSendString(PlaysAlias,,0,0)EndIfEndSub'停止'停止后跳到开始,以便再次播放PublicSubmmStop()
DimnReturnAsLong
IfsAlias=ThenExitSub
nReturn=mciSendString(StopsAlias,,0,0)mmSeek0'跳到开始位置EndSub'跳到指定的位置,并且处于暂停状态'当nPosition的值Length或者nPosition0时,将忽略这次操作PublicSubmmSeek(ByValnPositionAsSingle)
DimnReturnAsLongnReturn=mciSendString(SeeksAliastonPosition,,0,0)EndSub'方法Filename返回当前打开的文件名PropertyGetfilename()AsStringfilename=sFilenameEndProperty'指定要播放的文件名,然后将它打开'对于需要指定容器的Avi文件,不要以这种方式打开。PropertyLetfilename(ByValsTheFileAsString)mmOpensTheFileEndProperty'读取属性Wait的值'MsgboxMultimedia.WaitPropertyGetWait()AsBooleanWait=bWaitEndProperty'设置等待属性'用法:Multimedia.Wait=TruePropertyLetWait(bWaitValueAsBoolean)bWait=bWaitValueEndProperty'获得长度值PropertyGetLength()AsSingle
DimnReturnAsLong,nLengthAsIntegerDimsLengthAsString*255
IfsAlias=ThenLength=0ExitPropertyEndIfnReturn=mciSendString(StatussAliaslength,sLength,255,0)nLength=InStr(sLength,Chr$(0))Length=Val(Left$(sLength,nLength-1))EndPropertyPropertyLetPosition(ByValnPositionAsSingle)mmSeeknPositionEndProperty'获取当前位置PropertyGetPosition()AsSingle
DimnReturnAsInteger,nLengthAsInteger
DimsPositionAsString*255IfsAlias=ThenExitProperty
nReturn=mciSendString(StatussAliasposition,sPosition,255,0)nLength=InStr(sPosition,Chr$(0))Position=Val(Left$(sPosition,nLength-1))EndProperty'当前打开文件的状态'有以下几种:playingpausedstoppedPropertyGetStatus()AsString
DimnReturnAsInteger,nLengthAsIntegerDimsStatusAsString*255
IfsAlias=ThenExitPropertynReturn=mciSendString(StatussAliasmode,sStatus,255,0)
nLength=InStr(sStatus,Chr$(0))Status=Left$(sStatus,nLength-1)
EndProperty'从头开始播放PublicSubmmRestart()DimnReturnAsLong
IfsAlias=ThenExitSub
mmSeek0mmPlayEndSub'类的初始化PrivateSubClass_Initialize()'sAlias='别名初值为空EndSub'关闭打开的多媒体设备'当该类的对象所在的窗体(或模块)卸载时,自动调用该过程PrivateSubClass_Terminate()mmCloseEndSub'----------------------------------------------------[用法]1、比如要在窗体上播放一个动画,只需3个语句就搞定。DimMmAviAsNewMmediaMmAvi.mmOpenG:\resource\Avi\Test.avi,Me.hWndMmAvi.mmPlay2、循环播放PrivateSubTimer1_Timer()DimSAsStringS=当前文件:MmAvi.filenamevbCrLf当前位置:MmAvi.Position_总长度:MmAvi.Length当前状态:MmAvi.StatusLabel1.Caption=SIfMmAvi.Status=stoppedThenMmAvi.mmRestartEndsub3、同时播放几个文件(类型可以相同、可以不同)在Form1中加入PrivateMmWave(1)AsNewMmedia在需要播放的地方加上:MmWave(0).mmOpenG:\resource\wave\m16.wavMmWave(1).mmOpenG:\resource\wave\Welcom98.wavMmWave(0).mmPlayMmWave(1).mmPlay4、将动画放入一个圆形区域播放DimhrAsLongDimusew,usehDimMmAviAsNewMmediausew=Frame1.Width/Screen.TwipsPerPixelXuseh=Frame1.Height/Screen.TwipsPerPixelYusew=usehhr=CreateEllipticRgn(0,0,usew,useh)CallSetWindowRgn(Frame1.hWnd,hr,True)MmAvi.mmOpenG:\resource\Avi\start.avi,Frame1.hWndMmAvi.mmPlay
hxo (沙漠之胡) 在 ta 的帖子中提到:PublicDeclareFunctionsndPlaySoundLibwinmmAliassndPlaySoundA(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong我现在已经可以会用上面的API函数播放一个音频,但是如何能同时播放多个音频哩?先谢在前啦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行