媒体函数 mciSendString 基本使用方法详解

· · 科技·工程

mciSendString 是 Windows 多媒体 API 中的一个函数,用于向媒体控制接口 (MCI) 发送命令字符串。它是控制多媒体设备(如音频、视频播放器等)的高级接口。一般又来发出声音,控制方法简单易懂。

函数原型

MCIERROR mciSendString(
    LPCTSTR lpszCommand,
    LPTSTR  lpszReturnString,
    UINT    cchReturn,
    HANDLE  hwndCallback
);

一般后三个不会使用。第一个是控制命令,使用char

接下来说明如何使用

  1. 准备\ 想要使用mciSendString,须在“编译选项”的“在链接时将加入以下参数”加入一句-lwinmm。\ 头文件:

    #include <windows.h>
    #include <mmsystem.h>  // 包含mciSendString声明
    #pragma comment(lib, "winmm.lib")  // 链接必要的库

    有时运行会有警告,可以忽略。

  2. 打开媒体文件\ 可以使用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函数时间变短)。

  3. 播放音乐\ 接上文,播放就是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了音乐!

  4. 暂停播放\ 就是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的音乐
  5. 继续播放\ 就是resume。~作者很懒,~ 直接把前面的pause部分改成resume就可以了。直接从上次暂停处继续播放!

  6. 停止播放\ 看起来很像“暂停播放”,但这个不是的,使用的是stop,相当于暂停并回到开头。跟resume一样,更改就行。想要重新播放,要使用play哦!并且是从头开始。

  7. 关闭媒体设备 使用close,把这段播放“缓存”删除,在使用open重新打开这首音乐之前,不能再次播放此音乐。和resumestoppause一样的使用方法。

还有一个重点,播放音乐(playresume)后,播放时长要自己设定,使用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。它可以从指定位置播放。\ 格式,仍然使用前面aliaswone

// 把定义名为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。

注意:正常速度是1000,最高速度是1000010倍速)。

还有几个常见错误处理,作者就不再过多讲述,大家感性理解一下。

错误处理

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,敬请添加!谢谢大家!