当前位置:数据分析 > mciSendString的两个陷阱

mciSendString的两个陷阱

  • 发布:2023-10-06 04:57

-->

我刚刚修正了我使用的小闹钟的代码。

坑1:REPEAT选项的范围

以前都好好的,但是当我选择.wav文件时,就没有声音了...

嘿,MCI 绝对支持 .wav...

仔细想想,我曾经选择.mp3作为我的闹钟。这和这有什么关系吗?

查看源代码。

strSend = "播放" & STRING_SOUND_ALIAS & "重复"
调用 mciSendString(strSend, rbuf, 0, 0)

  

为了把我从睡梦中叫醒(通常我睡得很沉……),我选择了REPEAT选项来循环播放。

是的,是的。我记得在某处读到过,PLAY 命令的 REPEAT 选项只能用于 MPEGVideo 类型文件。 (这么晚了,录完就想直接睡觉,不想找片源。)

很简单,打开的时候以MPEGVideo的形式打开就可以了。

strSend = "OPEN " & Chr$(34) & 文件名 & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " 类型 MPEGVIDEO"
调用 mciSendString(strSend, rbuf, 0, 0)

  

坑2:文件名长度

应该没问题...来吧,试试吧。

D:\音乐\主题\Anison Piano ~marasy 动画歌曲钢琴翻唱~ marasy\marasy - Anison Piano ~marasy 动画歌曲钢琴翻唱~.wav

嗯?没有特殊字符,为什么玩不了呢? (我没有写调试输出,所以如果看成黑匣子,我看到的只是无法播放。)总长度也明显小于MAX_PATH,文件夹名和文件名长度也正常。

看mciSendString()的返回字符串太麻烦了,我们来推理一下。

你看,MCI是一个历史悠久的东西,所以……历史悠久!在这种情况下可能产生影响的历史悠久的东西很可能是 8.3 文件名(短文件名)。

这很容易处理。 Windows API,GetShortPathName(),不要重新发明轮子。

strShortFilename = String$(MAX_PATH, vbNullChar)
调用 GetShortPathName(文件名, strShortFilename, MAX_PATH)
strShortFilename = Strip(strShortFilename)
strSend = "OPEN " & Chr$(34) & strShortFilename & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " 类型 MPEGVIDEO"
调用 mciSendString(strSend, rbuf, 0, 0)

  

(注意,上面的代码有一个小陷阱,如果没有对字符串进行“修剪”去除多余的vbNullChar,则无法播放。不过,我认为没有必要单独提及,所以我把它放在括号里。它在里面。)

睡觉

至少我只是用了几个样本测试了一下,都通过了。今天早上你应该能够醒来...设置闹钟然后去睡觉。

把这篇文章当作一个备忘录...不要抱太大希望...

最后MCI其实是调用对应的注册解码器来工作的,所以其实如果安装了对应的解码器,就可以播放对应格式的音频文件。当然,原始PCM和波形必须直接使用原生API来解决,对吧...如果微软的人不这么认为,我也没办法...

-->

相关文章

热门推荐