使用mciSendString函数实现循环播放音频文件

Unfair

发布日期: 2018-12-27 16:34:25 浏览量: 2172
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

背景

在初学的时候,就开始使用mciSendString这个函数来播放音乐了。那时写的小游戏,都是使用PlaySound来播放时间比较短的音效,使用mciSendString来播放时间比较长的背景音乐。但是,那时就有个问题一直困扰着我,就是如何使用函数mciSendString实现循环播放音乐呢?因为,默认情况下,音乐只播放一遍,完毕音乐就停了。

直到后来,我Q群的一位网友,无意中为我解答了疑惑,因为ta在群里发了两三行音频循环播放的代码,然后,我把它放到程序里,没想到确实可以循环播放了,一看mciSendString中构造的命令,恍然大悟。

现在,我就把循环播放的实现过程,写成文档分享给大家。

函数介绍

mciSendString 函数

mciSendString函数向MCI设备发送命令字符串。 在命令字符串中指定发送命令的设备。mciSendString是用来播放多媒体文件的API指令,可以播放MPEG、AVI、WAV、MP3等

函数声明

  1. MCIERROR mciSendString(
  2. LPCTSTR lpszCommand,
  3. LPTSTR lpszReturnString,
  4. UINT cchReturn,
  5. HANDLE hwndCallback
  6. );

参数

  • lpszCommand
    指向指定MCI命令字符串的以null结尾的字符串的指针。 有关列表,请参阅多媒体命令字符串。
  • lpszReturnString
    指向接收返回信息的缓冲区的指针。 如果不需要返回信息,该参数可以为NULL。
  • cchReturn
    由lpszReturnString参数指定的返回缓冲区的大小(以字符为单位)。
  • hwndCallback
    如果在命令字符串中指定了“notify”标志,则处理回调窗口。

返回值

  • 如果成功返回零,否则返回错误。

实现思路

对mciSendString函数的使用,关键是构造播放命令。通常出错,都是命令行没有写正确的缘故。那么播放音频可以分成三个步骤:

  • 打开音频文件,命令为 “open yellow.mp3 alias start”,意思是打开音频文件“yellow.mp3”,并使用“start”这个标号作为音频文件的代码,下面对“start”操作就是对“yellow.mp3”操作。其中,“yellow.mp3”这里可以填音频文件路径,但是注意路径不要有空格;若路径有空格,可以给路径加上双引号。“start”是“yellow.mp3”的代号,名称可以任意,有 alias 指定

  • 循环播放音频,命令为“play start repeat”,意思是循环播放“start”代号的音频文件。其中,“repeat”表示循环播放,如果不加,则默认只播放一遍

  • 关闭音频文件,命令为“close start”,意思是关闭“start”代号的音频文件。当不播放音频文件是,可以关闭文件,节约资源

编程实现

导入库文件

  1. #include <MMSystem.h>
  2. #pragma comment(lib, "winmm.lib")

循环播放音频文件

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. // 打开音频文件
  4. ::mciSendString("open yellow.mp3 alias start", NULL, 0, NULL);
  5. // 循环播放
  6. // 循环播放适用于.mp3格式,但不适用.wav格式
  7. ::mciSendString("play start repeat", NULL, 0, NULL);
  8. printf("play music...\n");
  9. system("pause");
  10. // 关闭音频文件
  11. ::mciSendString("close start", NULL, 0, NULL);
  12. printf("close music!\n");
  13. system("pause");
  14. return 0;
  15. }

程序测试

我们直接运行程序,音频成功播放,而且循环播放成功。继续运行程序,则音频成功关闭。所以,测试成功。

总结

这个程序主要是要了解mciSendString的播放命令,注意不要写错就好。

其中,在测试的时候,发现了个问题,需要大家注意一下:.WAV音频文件,在设置循环播放“repeat”时,不能播放成功,去掉“repeat”正常播放。而.MP3音频文件,则正常。所以推测,可能循环播放仅适用于.MP3格式,不适用于.WAV等其他音频格式文件。

上传的附件 cloud_download mciSendString_RepeatPlaySound_Test.7z ( 143.35kb, 7次下载 )

发送私信

我连自己都猜不透,怎敢奢求别人来懂我

7
文章数
13
评论数
最近文章
eject