一小段播放音频的代码(类模块)
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
出于工作需要,写了一小段播放音乐的程序(我不太擅长多媒体方面的编程),基于开放共享的思想,现分享一下。
//实际在使用中不必写成类模块,我是担心我后续编程中粗心大意,丢失ID才写的
//MarkID 部分本来想改成栈式分配,呃~因为懒,没改......
//分享的主要原因是我之前用关键词VB mciSendCommand搜不出来相关详细例程,多以mciSendString为主,但我觉得mciSendCommand应该简单些,所有就根据其他语言例程简单学了一下[滑稽]
2021年10月28日 15点10分 1
level 11
余思培 楼主
2021年10月28日 15点10分 2
level 11
余思培 楼主
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
2021年10月28日 15点10分 3
level 13
mciSendCommand好像对mid播放有问题,我以前做连连看播放mid时,发觉还是mciSendString好,具体也没怎么测试不好说(以前好像是mciSendCommand加载mid时比mciSendString慢,四年前的事了记不清了,后来改用了mciSendString)
2021年10月28日 15点10分 4
这个不太清楚,我接触多媒体编程也不多//ps:28号那天吞楼了,我现在才看到,我当时还在疑惑怎么突然就从3楼跳到6楼了,嗯~五楼到现在还看不到......
2021年11月01日 11点11分
mciSendString内部也是走的mciSendCommand,而mciSendCommand的MPEGVideo设备类型是走的ActiveMovie。反正这三个API的midi播放都不好,播放midi音乐的话,我建议直接上DirectMusic,这API支持换切dls格式的音色库。
2021年11月02日 02点11分
level 11
余思培 楼主
加载与播放
暂停、继续播放与卸载
获取音乐时长、错误信息记录
2021年10月28日 15点10分 6
level 11
余思培 楼主
这里提到错误代码,这里补一下MCI的错误代码查看,很简单
2021年10月28日 15点10分 7
level 7
专业
2021年10月28日 23点10分 8
level 6
你用的哪个版本,我的是VB6,在代码那里,写的都是一坨,回车后都是顶个的
2021年10月29日 02点10分 9
边写边测试VB6,写完测试VSC,截图VSC
2021年10月29日 02点10分
另外VB6写的时候tab增加缩进,shift+tab减少缩进,缩进长度选项可以设置,一般都是4个空格
2021年10月29日 02点10分
level 14
我个人建议最好不要再用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
2021年11月02日 02点11分 10
这里还有我写的扩展特效例子:https://pan.baidu.com/s/1V8M7aKLvPFl3YBG-XN3lRA 提取码: 9ym8 ,里面有环境混响(房间、石室、走廊、山洞、森林、城市、下水道、水下等)、回声、均衡器(很多音乐播放器都有这个)、3D空间定位(主要用于游戏的听声辩位和多普勒效应)等特效。
2021年11月02日 03点11分
我之前为了实现这些功能网上找了不少MCI例子,没想到ActiveMovie都有[泪]
2021年11月02日 04点11分
@余思培 对啊,MCI功能最完整的就MPEGVideo设备类型,然而它的这个设备就是拿ActiveMovie来封装的,所以后来我就基本上完全抛弃mci了。
2021年11月02日 05点11分
level 14
接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
2021年11月02日 06点11分 11
1