媒体函数 mciSendString 基本使用方法详解
rqliushuangyu · · 科技·工程
mciSendString
是 Windows 多媒体 API 中的一个函数,用于向媒体控制接口 (MCI) 发送命令字符串。它是控制多媒体设备(如音频、视频播放器等)的高级接口。一般又来发出声音,控制方法简单易懂。
函数原型
MCIERROR mciSendString(
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
一般后三个不会使用。第一个是控制命令,使用char
。
接下来说明如何使用
-
准备\ 想要使用
mciSendString
,须在“编译选项”的“在链接时将加入以下参数”加入一句-lwinmm
。\ 头文件:#include <windows.h> #include <mmsystem.h> // 包含mciSendString声明 #pragma comment(lib, "winmm.lib") // 链接必要的库
有时运行会有警告,可以忽略。
-
打开媒体文件\ 可以使用
mciSendStirng
了!\ 想要播放音乐,首先需要打开(open
)音乐。格式:open 音乐位置名称
,一般这样就可以。\ 如,在子文件夹Music
中有一首音乐,名称test_music.wav
,那么使用方式为mciSendString("open Music//test_music.wav",NULL,0,NULL);//后三个用不着
有时C++无法识别文件类型,可以加
type 文件类型
。一般如果地址太长,可以使用
alias 自定义名称
。这样可以简化后面的内容。结合起来长这样:mciSendString("open Music//test_music.wav type waveaudio alias wone",NULL,0,NULL);//后三个用不着 //对命令进行解释:打开Music/test_music.wav,文件类型为wav(waveaudio),取名为wone
如果文件类型是
mp3
,那么waveaudio
要改成mpegvideo
,建议大家都加上,要不然会出现奇奇怪怪的问题(我遇到过,就是Sleep
函数时间变短)。 -
播放音乐\ 接上文,播放就是
play
,是不是很好记? 如果使用了alias
,则长这样:mciSendString("play wone",NULL,0,NULL);//后三个用不着 //解释:播放定义名为wone的音乐,就是路径为Music/test_music.wav的音乐
如果没有使用
alias
,就这样:mciSendString("play Music//test_music.wav",NULL,0,NULL);//后三个用不着 //解释:播放路径为Music/test_music.wav的音乐
这一切的前提是已经
open
了音乐! -
暂停播放\ 就是
pause
,暂停的意思。\ 如果使用了alias
,为:mciSendString("pause wone",NULL,0,NULL);//后三个用不着 //解释:暂停播放定义名为wone的音乐,就是路径为Music/test_music.wav的音乐
如果没有使用
alias
,为:mciSendString("pause Music//test_music.wav",NULL,0,NULL);//后三个用不着 //解释:暂停播放路径为Music//test_music.wav的音乐
-
继续播放\ 就是
resume
。~作者很懒,~ 直接把前面的pause
部分改成resume
就可以了。直接从上次暂停处继续播放! -
停止播放\ 看起来很像“暂停播放”,但这个不是的,使用的是
stop
,相当于暂停并回到开头。跟resume
一样,更改就行。想要重新播放,要使用play
哦!并且是从头开始。 -
关闭媒体设备 使用
close
,把这段播放“缓存”删除,在使用open
重新打开这首音乐之前,不能再次播放此音乐。和resume
,stop
,pause
一样的使用方法。
还有一个重点,播放音乐(play
或resume
)后,播放时长要自己设定,使用Sleep(DWORD dwMilliseconds)
函数。你要是不知道Sleep
函数,建议你别看了。
如果你不知道音乐时长,可以用wait
,是不是很智能?
接着前面的wone
,模板:
mciSendString("play wone wait", NULL, 0, NULL);
//解释:播放定义名为wone的音乐,也就是Music/test_music.wav,并等待至播放结束(wait的作用)。
想要无限循环播放,使用repeat
,直接把前面的wait
处改成repeat
即可。
想要获取当前播放位置,这是个问题。有方法,以毫秒存储,是一个死公式,把第二个改成你open
的地址或自定义名,这里使用了刚才的wone
:
char position[32];
mciSendString("status wone position", position, sizeof(position), NULL);
int pos_ms = atoi(position); // 获取毫秒数,此时的pos_ms就是当前播放时间。
那获取了播放位置又怎么用?使用from
。它可以从指定位置播放。\
格式,仍然使用前面alias
的wone
:
// 把定义名为wone的音乐,也就是Music/test_music.wav,从第30秒开始播放
mciSendString("play wone from 30000", NULL, 0, NULL);
这个时候就可以使用前面的position
了!
如何获取音乐总时间?status length
搞定!\
获取的例子,还是使用wone
:
//获取自定义名为wone的总时间。
char length[32];
mciSendString("status wone length", length, sizeof(length), NULL);
int total_ms = atoi(length); // 总毫秒数
接下来就是设置音量了。这个很有用的!可以直接设置某个open
了的音乐的音量。\
使用wone
举个例子:
// 设置音量(0-1000)
mciSendString("setaudio wone volume to 500", NULL, 0, NULL);
//解释:把自定义名为wone的音乐音量调整为500音量最高为1000,最低为0。
还有一个,就是倍速。可以使用set
来调整。
仍然有开头定义的wone
来举例子:
// 设置播放速度为正常速度的2倍
mciSendString("set wone speed 2000", NULL, 0, NULL);
//2000/1000=2,就是两倍速
//set name speed number,这是格式,name前面的定义,number是倍速,计算时需要*1000。
注意:正常速度是
还有几个常见错误处理,作者就不再过多讲述,大家感性理解一下。
错误处理
MCIERROR err = mciSendString("play unknown_alias", NULL, 0, NULL);
if (err != 0) {//出错了
char errorMsg[128];
mciGetErrorString(err, errorMsg, sizeof(errorMsg));
std::cerr << "MCI错误: " << errorMsg << std::endl;
}
路径问题
路径中包含空格或特殊字符时,必须使用引号:
// 正确
mciSendString("open \"C:\\My Music\\song.mp3\" alias music", NULL, 0, NULL);
// 错误(路径有空格时会失败)
mciSendString("open C:\\My Music\\song.mp3 alias music", NULL, 0, NULL);
来一个完整示例代码
#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#pragma comment(lib, "winmm.lib")
int main() {
// 打开文件
MCIERROR err = mciSendString("open \"music.mp3\" type mpegvideo alias mymusic", NULL, 0, NULL);
if (err != 0) {
char errorMsg[128];
mciGetErrorString(err, errorMsg, sizeof(errorMsg));
std::cerr << "打开文件失败: " << errorMsg << std::endl;
return 1;
}
// 获取媒体长度
char length[32];
mciSendString("status mymusic length", length, sizeof(length), NULL);
std::cout << "媒体长度: " << atoi(length)/1000 << "秒" << std::endl;
// 播放媒体
std::cout << "开始播放..." << std::endl;
mciSendString("play mymusic", NULL, 0, NULL);
// 等待5秒
Sleep(5000);
// 暂停播放
std::cout << "暂停播放" << std::endl;
mciSendString("pause mymusic", NULL, 0, NULL);
// 等待2秒
Sleep(2000);
// 继续播放
std::cout << "继续播放" << std::endl;
mciSendString("resume mymusic", NULL, 0, NULL);
// 等待播放结束
char status[32];
do {
Sleep(1000);
mciSendString("status mymusic mode", status, sizeof(status), NULL);
} while (strcmp(status, "stopped") != 0);
std::cout << "播放完成" << std::endl;
// 关闭设备
mciSendString("close mymusic", NULL, 0, NULL);
return 0;
}
小提示:如果想一边播放音乐,一边运行其他的,可以使用thread
,本文在windows10,Dev -C++ MinGW64运行通过,MinGW32还不知晓!
如果还有更多的mciSendString
的使用方法,请私信我rqliushuangyu,敬请添加!谢谢大家!