cMCI函数 加载音乐(传入音乐文件路径),返回由类分配的ID(以下简称ID),dwDeviceID由类模块代为保存 Public Function MusicLoad(ByVal sPath As String) As Long 播放音乐(传入ID),从头开始播放,返回值默认为0,出错为-1,以下无特别说明同此例 Public Function MusicPlay(ByVal dwID As Long) As Long 暂停音乐 Public Function MusicStop(ByVal dwID As Long) As Long 继续播放音乐 Public Function MusicCont(ByVal dwID As Long) As Long 关闭音乐,返回值恒均为0 Public Function MusicClose(ByVal dwID As Long) As Long 获取音乐时长,返回音乐ms时长,可能不太准确 Public Function GetLen(ByVal dwID As Long) As Long 错误信息记录,传入错误代码与错误描述,返回值恒为0 Public Function ErrRecord(ByVal dwErrCode As Long, ByRef sErrDesc As String) As Long
我个人建议最好不要再用mci了,VB6的话用ActiveMovie反而比mci方便很多,不需要自己声明API,直接引用quartz.dll就可以了。 首先在VB6菜单栏中找到“工程”→“引用”,然后勾选列表中的“ActiveMovie control type library”,然后写下此代码: Option Explicit Dim mc As New FilgraphManager Dim ba As IBasicAudio Dim mp As IMediaPosition Private Sub Form_Load() ' 加载要播放的文件(可多次RenderFile多个文件,播放时会重叠在一起同时播) mp.RenderFile App.Path & "XXX文件.mp3" '加载文件 ' VB6的Set可以转换对象接口 Set ba = mc Set mp = mc mp.Run ' 开始播放 mp.Pause ' 暂停播放 mp.Stop ' 停止播放 ' 注意:ActiveMovie的音量单位为毫贝,百分比音量需要通过公式进行转换。 ba.Volume = AmplitudeToMillibels(音量) ' 提示:声道平衡的单位也是为毫贝,百分比仍需要通过公式进行转换。 ba.Balance = 左右声道平衡 ' 提示:播放速度会改变音调高低(男声以1.25倍左右播放就会变成女声,同理女声0.8倍左右播放就会变成男声) mp.Rate = 播放速度 ' 进度和时长 获取播放时长 = mp.Duration ' 单位为秒,可用小数部分表示到微秒级的值 获取播放进度 = mp.CurrentPosition ' 和获取播放时长一样 mp.CurrentPosition = 设置播放进度 ' 最小为0,最大为mp.Duration(和MCI不同的是,它不会导致暂停,如果原来是播放状态则继续播放,如果原来是暂停状态则继续暂停)。 End Sub '振幅音量(百分比)转毫贝音量(1分贝=100毫贝) Public Property Get AmplitudeToMillibels(ByVal Ratio As Single) As Long If Ratio <= 0.00001! Then AmplitudeToMillibels = DSBVOLUME_MIN ' = -10000 ElseIf Ratio >= 0! Then AmplitudeToMillibels = DSBVOLUME_MAX ' = 0 Else AmplitudeToMillibels = Log(Ratio) * 0.434294481903252 ' = Log10(Ratio) End If End Property
接10楼,才发现刚刚的计算音量的公式不小心写错了,忘记 * 2000 了。 解释一下,分贝音量和振幅音量的关系:每增加20分贝表示振幅变为10倍(注意:+40分贝振幅为10*10=100倍,而不是10+10=20倍),同理每减少20分贝表示振幅变为0.1倍(-40分贝表示0.01倍振幅),约+6分贝振幅放大1倍(-6分贝缩小1倍)。 '振幅音量(百分比)转毫贝音量(1分贝=100毫贝) Property Get AmplitudeToMillibels(ByVal Ratio As Single) As Long If Ratio <= 1E-5! Then AmplitudeToMillibels = DSBVOLUME_MIN ' = -10000 ElseIf Ratio >= 1! Then AmplitudeToMillibels = DSBVOLUME_MAX ' = 0 Else AmplitudeToMillibels = Log(Ratio) * 868.58896380650365530225783783321 ' = Log10(Ratio) * 2000 End If End Property