服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言使用mciSendString实现播放音乐功能

C语言使用mciSendString实现播放音乐功能

2023-03-02 15:48编程小鱼六六六 C/C++

mciSendString 支持 mp3、wma、wav、mid 等多种媒体格式,使用非常简单。这篇文章就来为大家介绍一下C语言如何使用mciSendString实现播放音乐功能,需要的可以参考一下

使用 mciSendString 播放音乐

mciSendString 支持 mp3、wma、wav、mid 等多种媒体格式,使用非常简单。这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 编译该范例前,请把 music.mp3 放在项目文件夹中
// 发布时,请把 music.mp3 和编译的 exe 放在一起
// 编译环境:VC6~VC2019 + EasyX_20210115
//
#include <graphics.h>
#include <conio.h>
// 引用 Windows Multimedia API
#pragma comment(lib, "Winmm.lib")
 
int main()
{
    initgraph(640, 480);
 
    // 打开音乐
    mciSendString(_T("open music.mp3 alias mymusic"), NULL, 0, NULL);
 
    outtextxy(0, 0, _T("按任意键开始播放"));
    _getch();
 
    // 播放音乐
    mciSendString(_T("play mymusic"), NULL, 0, NULL);
 
    outtextxy(0, 0, _T("按任意键停止播放"));
    _getch();
 
    // 停止播放并关闭音乐
    mciSendString(_T("stop mymusic"), NULL, 0, NULL);
    mciSendString(_T("close mymusic"), NULL, 0, NULL);
 
    outtextxy(0, 0, _T("按任意键退出程序"));
    _getch();
    closegraph();
    return 0;
}

简单讲解一下:

一定要引用 Winmm.lib 库文件。这个范例中是通过 #pragma comment 命令引用的,也可以在项目属性中设置,这里不作介绍。

mciSendString 函数的功能很强大,甚至可以播放视频,不过这里就不多作介绍了,详细请参见 MSDN。多数情况只需要用到第一个参数,将另外三个参数置为 NULL, 0, NULL 即可。

第一个参数是多媒体命令字符串,不区分大小写。程序中,先要通过 open 命令打开 background.mp3,并用 alias 指定了别名为“mymusic”,这样在之后的代码中就可以方便的通过“mymusic”这个别名访问该音乐了。当然,并不是必须要指定别名,每次通过文件名访问也是可以的。

open 后面的 mp3 用绝对路径或相对路径都可以。

然后就是:play mymusic 开始播放,stop mymusic 停止播放,close mymusic 关闭文件。

如果需要同时播放多个音乐,请为不同的音乐指定不同的别名,然后分别操作即可。

不再需要播放的音乐,请记得用 close 命令关闭。

另外还有一个 PlaySound 函数也可以用来播放声音,不过可惜不支持 mp3 / wma,这里就不多做介绍了。

一些有用的多媒体命令:

从头播放 xxx:

"play xxx from 0"

循环播放 .mp3 文件(.wma 文件同样可以):

"open xxx.mp3"
"play xxx.mp3 repeat"

循环播放 .wav 文件(.mid 文件同样可以):

"open xxx.wav type MPEGVideo"
"play xxx.wav repeat"

关闭当前程序打开的所有多媒体文件:

"close all"

如果文件名中有空格,需要用双引号引起来文件名(注意转义):

?
1
mciSendString("open \"D:\\My Music\\俞丽拿 梁祝 化蝶.mp3\" alias mymusic", NULL, 0, NULL);

使用 mciSendCommand 播放音乐

mciSendCommand 与 mciSendString 的功能类似,只是控制方式略有区别。因此,对 mciSendCommand 不做过多介绍,只看一个使用例子吧。以下范例实现 mp3 的循环播放:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 该范例演示使用 mciSendCommand 函数循环播放 mp3
// 编译环境:VC2008~VC2019 + EasyX_20210115
//
#include <graphics.h>
#include <Digitalv.h>
#include <conio.h>
#pragma comment(lib, "winmm.lib")
 
int main()
{
    initgraph(640, 480);
 
    // 打开音乐文件
    MCI_OPEN_PARMS mciOpenParms;
    mciOpenParms.lpstrDeviceType = L"sequencer";
    mciOpenParms.lpstrElementName = L"R:\\Downloads\\test.mp3";
    mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, DWORD_PTR(&mciOpenParms));    // 打开指定媒体文件
    UINT wDeviceID = mciOpenParms.wDeviceID;    // 返回的 Device ID 需要保存下来,以便实现后续控制
 
    outtextxy(0, 0, L"按任意键开始播放");
    _getch();
 
    // 播放音乐
    MCI_PLAY_PARMS mciPlayParms;
    mciSendCommand(wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, DWORD_PTR(&mciPlayParms));
 
    outtextxy(0, 0, L"按任意键停止播放");
    _getch();
 
    // 停止播放并关闭音乐
    mciSendCommand(wDeviceID, MCI_STOP, 0, NULL);    // 停止播放
    mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);    // 关闭音乐
 
    outtextxy(0, 0, L"按任意键退出程序");
    _getch();
    closegraph();
    return 0;
}

解决某些 MP3 无法播放的问题

有些 mp3 无法用 mciSendString 播放,是因为用了比较大的封面,我测试过一个 mp3 的封面尺寸是 1824x1824,直接无法播放。将封面尺寸修改为 500x500,顺利播放。当然,更简单的办法是直接移除封面。这里给大家推荐个工具:Mp3tag,官网:https://www.mp3tag.de,Mp3tag 的操作方法非常简单,点点鼠标就能搞定,这里不再详述。

使用 PlaySound 函数播放音乐

PlaySound 可以用来播放 wav 和系统声音,使用很简单,一些常用的用法如下:

?
1
2
3
4
5
6
7
8
9
// 注意:
// 1. 需要使用预编译指令 #pragma comment(lib, "winmm.lib") 链入库文件
// 2. 第一个参数是字符串,注意使用程序中约定的字符集,例如 Unicode 字符集需要在字符串前面加 L
//
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_SYNC);                // 播放 Bells.wav,并等待直到播放结束
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_ASYNC);            // 后台播放 Bells.wav,函数立即返回
PlaySound("SystemExclamation", NULL, SND_ASYNC);                // 后台播放系统定义的 SystemExclamation 声音
PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_LOOP | SND_ASYNC);    // 后台循环播放 Bells.wav
PlaySound(NULL, NULL, 0);                                        // 停止后台播放

到此这篇关于C语言使用mciSendString实现播放音乐功能的文章就介绍到这了,更多相关C语言mciSendString播放音乐内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/yx5666/article/details/129016532

延伸 · 阅读

精彩推荐
  • C/C++浅析C++编程当中的线程

    浅析C++编程当中的线程

    这篇文章主要介绍了浅析C++编程当中的线程,线程在每一种编程语言中都是重中之重,需要的朋友可以参考下...

    低调小一9132021-03-04
  • C/C++浅谈返回函数内部new分配的内存的引用

    浅谈返回函数内部new分配的内存的引用

    下面小编就为大家带来一篇浅谈返回函数内部new分配的内存的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C语言教程网4402021-04-23
  • C/C++C语言学习笔记之VS2022安装使用教程

    C语言学习笔记之VS2022安装使用教程

    这篇文章主要介绍了C语言学习笔记之VS2022安装使用教程,在VS2022中,在使用scanf函数编译出错,本文给大家提到了解决方法,需要的朋友可以参考下...

    一个努力成为大白的小白6622022-11-21
  • C/C++C++标准之(ravalue reference) 右值引用介绍

    C++标准之(ravalue reference) 右值引用介绍

    临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题,下面简单地介绍一下Copy Elision、RVO,对此不感兴趣的可以直接跳过...

    C++教程网5082020-11-11
  • C/C++C语言函数栈帧详解

    C语言函数栈帧详解

    下面小编就为大家带来一篇浅谈C语言函数调用参数压栈的相关问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Zero0Tw05102022-01-24
  • C/C++C++实现四则混合运算计算器

    C++实现四则混合运算计算器

    这篇文章主要为大家详细介绍了C++实现四则混合运算计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    persistence_s7582021-10-07
  • C/C++VS2019中在源文件中如何使用自己写的头文件

    VS2019中在源文件中如何使用自己写的头文件

    通过头文件的形式直接调用自定义的函数,从而免去对函数的原型进行声明,本文就详细的介绍一下VS2019中在源文件中如何使用自己写的头文件,感兴趣的...

    落春只在无意间9242022-01-04
  • C/C++VC++实现文件与应用程序关联的方法(注册表修改)

    VC++实现文件与应用程序关联的方法(注册表修改)

    这篇文章主要介绍了VC++实现文件与应用程序关联的方法,涉及VC++针对注册表的相关操作技巧,需要的朋友可以参考下...

    C++教程网6872021-04-12