mciSendString函数简介(播放音乐以及录音相关操作)

https://blog.csdn.net/m0_73633088/article/details/128371136

函数功能:播放多媒体音乐,视频等

mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等。这个函数有自己的mci指令,可以通过不同的指令实现不同的功能。这里我会详细讲解mciSendString这个函数的常见用法,以及怎么去对音乐播放,快进、快退、录音等功能。

目录

设置环境

 mciSendString函数相关介绍

        mciSendString函数的参数(一共有4个参数):

 1.播放功能

 2.关闭结束播放

 3.暂停与继续

4.音量的调节

 5.快进,快退

6.进度条显示以及打印进度条

7.录音功能

设置环境
 首先要建立一个vs文件

 建立好了之后,要调整项目的属性

 改用为多字节字符集,否则会报错。

 然后点去链接器中的输入,找到附加依赖项,点进去编译,导入静态库,winmm.lib

 最后去关闭 SDL安全检查,改成否就行了

 mciSendString函数相关介绍
头文件:#include<Windows.h>
               #include<mmsystem.h>

静态库:#pragma comment(lib,"winmm.lib")

 在文件项目已经导入静态库的情况下,可加可不加;如果没有导入静态库,就必须在头文件下面加上静态库

        mciSendString函数的参数(一共有4个参数):
#include<Windows>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")//已导入静态库,可写可不写
 
MCIERROR mciSendString(
LPCTSTR lpszCommand, //命令字符串:如 open、play 、close等
LPTSTR lpszReturnString, //接受返回信息的字符串 ,即字符串
UINT cchReturn,   //返回字符串的大小,sizeof
HANDLE hwndCallback //回调窗口句柄,一般设置为NULL
);
//模板
    mciSendString(操作指令 , 获取返回的信息(字符串) , 返回信息的长度 , 窗口句柄(一般为NULL));
相关指令:

 1.播放功能
这里我的当前音乐文件相对路径 kk.mp3 , 如果想要播放这个音乐,我们可以通过open与play这两个指令进行播放。

    mciSendString("open kk.mp3 alias music", 0, 0, 0);//alias是别名的意思,下面就可以去直接用music来代替kk.mp3
    mciSendString("play music", 0, 0, 0);//播放音乐
 在打开文件时我以及给这个mp3文件取了别名,下面我是直接用music来表示这个文件的名字.

如果我们想重复播放音乐,那么就直接在play music后面加上repeat 就行了

mciSendString("open kk.mp3 alias music", 0, 0, 0);
mciSendString("play music repeat", 0, 0, 0);
如果我们想等播放完了音乐在接着执行下面的语句,那就在play music后面加上wait

mciSendString("open kk.mp3 alias music", 0, 0, 0);
mciSendString("play music wait", 0, 0, 0);
如果想播放视频,全屏播放加上fullscreen就OK

mciSendString("play music fullscreen", 0, 0, 0);
 2.关闭结束播放
当播放完毕后要关闭音乐。

mciSendString("close music", 0, 0, 0);
 3.暂停与继续
当然了,播放音乐嘛,暂停与继续是少不了的,对此我们也可以通过mciSendString来实现这个功能的。

//暂停
mciSendString("pause music",0,0,0);
//或者  
mciSendString("stop music",0,0,0);
 
//继续播放
mciSendString("resume music",0,0,0);
 所以我们可以通过键盘指令来控制音乐的播放与暂停,代码如下:

void stopresume()
{
    char ch;
    int i = 1;
    //这个表示在键盘获取一个字符,但是不打印出来,接着继续往下执行,getch函数的头文件是#include<conio.h>
    mciSendString("play music", 0, 0, 0);//开始,先播放音乐
again:
    ch = getch();
    if (ch == ' '&& i % 2!= 0)//如果获取的字符为空格,同时i为奇数的话,那么就暂停
    {
        mciSendString("pause music", 0, 0, 0);
        ++i;
    }
    else if (ch ==' ' && i % 2 == 0)//如果获取的字符为空格,同时i为偶数的话,那么就继续
    {
        mciSendString("resume music", 0, 0, 0);
        ++i;
    }
    goto again;//回到上面,继续以下的操作
}
看吧,这个函数的功能跟我们平时用的软件暂停继续播放功能一模一样,按空格就暂停,再按一次就继续播放。 

4.音量的调节
(1)获取当前的音量

    char a[100];
    mciSendString("status music volume", a, 100, 0);//获取此时的音量数据返回到a,这里的100是表示a的长度,sizeof(a)
//其中a是字符串,如果想把a转换为数字,可以调用atoi函数
int b=atoi(a);//通过atoi函数进行字符数字串转换到int类型
char s[100];
sprintf(s, "setaudio music volume to %d", b%1000+200);//这里建议去取模,此时获得的音量加上200,再除以1000乘上此时媒体音量就是将要播放出来的音量
mciSendString(s,0,0,0);
 我们可以在这个基础上进行音量的加减,例如:

当前媒体音量

我们可以直接通过mciSendString("setaudio music volume to a",0,0,0),其中a是一个数字,来实现播放音量的改变,这个音量的换算是此时多媒体的音量乘上a/1000,所以这个a的范围是0~1000;如果a超过了1000,那么实际上a还是以1000来算。

mciSendString("setaudio music volume to 800",0,0,0);
//意思是把音量调节到当前媒体音量的80%,换算过来就是此时的音量为32
既然知道了这些,那我们怎么去通过键盘或者鼠标的外部操作来改变播放音量呢?其实非常简单,利用循环就可以搞定了,代码如下:

void volume()
{
int i=0;
char a[100];
    mciSendString("open kk.mp3 alias music", 0, 0, 0);
while (true) {
    mciSendString("play music", 0, 0, 0);
    char s = getch();//在键盘上获取一个字符,但是不打印出来,接着往下执行
    system("cls");//清屏
    if (s == 'w')//如果获取的字符为w,那么音量加100
        i += 100;
    else if(s=='s')//如果为s,音量减少100
        i -=100 ;
printf("%d",i);//打印此时的音量
    sprintf(a, "setaudio music volume to %d", i);//把此时的音量以及操作字符串赋给a
    mciSendString(a, 0, 0, 0);//音量的设置
    
}
}

这个函数的功能其实就是我们用的音乐软件里面的音量调节功能一样的,如下所示:

 5.快进,快退
播放多媒体音乐或者视频的时候,我们可以通过mciSendString函数的指令来实现快进,快退的。

//mci 中的seek指令可以实现把播放进度从某一个位置开始,从而实现快进与快退
mciSendString("seek music to 7*1000", 0, 0, 0);//这里表示把music从7秒处开始播放
//这个时间的单位是毫秒,所以我写成7*1000 比较直观表示的7秒
 我们也可以用start与end来表示从头开始(当然,音乐一般自然而然是从头开始的),或者直接把播放进度拉倒尾部。如下所示:

    mciSendString("seek music to start", 0, 0, 0);//从开头开始播放
 
    mciSendString("seek music to end", 0, 0, 0);//从最后位置开始播放
既然如此,我们可以通过键盘来实现快进快退,代码如下:

void forwardbackdard()
{
    char arr;
    int i = 0;
    char ss[100];
    mciSendString("open kk.mp3 alias music", 0, 0, 0);
    while (true)
    {
        mciSendString("play music", 0, 0, 0);
        arr = getch();
        system("cls");
        if (arr == 'd')
            i += 2 * 1000;//每次快进2秒
        else if (arr == 'a')
            i -= 2 * 1000;//每次快退了2秒
        sprintf(ss,"seek music to %d", i);//懂的都懂
        mciSendString(ss, 0, 0, 0);
        printf("%d", i/1000);//打印出此时快进或者快退了多少秒
    }
}

6.进度条显示以及打印进度条
 进度条,顾名思义就是在一段有限的线长度来表示音乐的时间长度,这里我们可以通过图形库去打印出进度条,或者在控制面板上用符号去打印进度条。

        要想打印出进度条,首先就要获取到歌曲的时间长度,可以用mci指令中的length来获取时间长度(其中的时间长度单位是毫秒来计算的,跟音量一样)。

char length[100];
mciSendString("status music length", length, 100, 0);//获取音乐长度,返回到字符串length
//同上我们可以把字符串转换为int类型
int num;
num=atoi(length);
        其次还有获取此时音乐播放了多少的长度,mci指令中的position来获取此时此刻已播放时间的长度。

char now[100];
mciSendString("status music position", now, 100, 0);//把此时此刻已播放的时间以字符串形式返回到字符串now中
int t;
t=atoi(now);//转化到int类型
下面我通过图形库来打印出进度条,完整代码奉上:

#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
#include<mmsystem.h>
void progress()
{
    char length[100];
    char now[100];
    int x;
    int t = 0;
    int time;
    mciSendString("status music length", length, 100, 0);
    time = atoi(length);
    while (true) {
        
        x = getwidth() * t / time;    //获取窗口的宽度乘上此时的进度/总进度
        setfillcolor(BLUE);//设置填充颜色为蓝色
        fillrectangle(0, 300, x, 320);//画一个长方形,这个长方形会随着x的值变化
            fillcircle(x, 310, 10);//画一个填充圆
        mciSendString("status music position", now, 100, 0);
         t = atoi(now);    
    }
}
void alllong()//画出进度总长度,初始化
{
    setfillcolor(RGB(100, 100, 100));//颜色为灰色
    fillrectangle(0, 300, 1000, 320);
}
int main()
{
                                          
    initgraph(1000, 400);
    alllong();
    mciSendString("open 2.mp3 alias music", 0, 0, 0);
    mciSendString("play music", 0, 0, 0);
    progress();
    system("pause");
}

下面是运行结果:


7.录音功能
千万别以为mciSendString函数只有播放功能,其实这个函数还有录音功能,通过相关指令,从而实现录音并且生成音频文件保存到电脑中。

        实现录音可以分4步走:首先打开一个录音文件,然后记录录下的声音,再保存到计算机里面去,最后关闭文件,(其实会发现这个过程跟文本文件的写入几乎一样)。

mciSendString("open new type waveaudio alias moo", 0, 0, 0);//打开建立一个声音类型的文件项目,别名为moo
mciSendString("record moo", 0, 0, 0);//开始记录声音
 
//中间这里可以通过延迟函数Sleep去控制录音时间,或者自行设立一个结束录音按键
 
mciSendString("save moo e:\\jojo\\123.mp3", 0, 0, 0);//设为mp3格式(还可以设置为其他格式例如wav),保存到 ……
mciSendString("close moo", 0, 0, 0);//关闭这个项目
        上面4步可以虽然可以录音,但是效果并不是非常专业化。如果想要提高专业性,mci指令是相对比较多的,首先要设置好声音的清晰度(位度),可接收的声音频率(赫兹),还有播放的声道(单声道或者双声道),另外还有声音的编码格式(如不同类型声音的数字信号与模拟信号的编码格式),等等……这里我就不过多讲,如果想了解更多http://t.csdn.cn/NclCi

         那,这里我就写一个完整的代码奉上:

#include<stdio.h>
#include<Windows.h>
#include<mmsystem.h>
void recordvoice()
{
//初始化声音规格
    mciSendString("set wave bitpersample 8", 0, 0, 0);//设置音频的位度 8位,(还有16,24位,位度越高,声音越清晰)
    mciSendString("set wave samplespersec 1",0,0, 0);//设置录音赫兹,11025是人类可
    mciSendString("set wave channels 2", 0, 0, 0);//设置声道,2是表示立体声(双声道),1是表示单声道
    mciSendString("set wave format tag pcm", 0, 0, 0);//设置pcm格式,是数字信号比模拟信号质量要好
    mciSendString("open new type waveaudio alias moo", 0, 0, 0);//打开建立一个声音类型的文件项目
    mciSendString("record moo", 0, 0, 0);//开始记录声音
    char d;
    d = getch();
    if (d == ' '); //按下空格表示录音结束
    {
        printf("录音结束\n");
        mciSendString("save moo e:\\jojo\\123.wav", 0, 0, 0);//保存
        mciSendString("close moo", 0, 0, 0);//关闭
    }
}
int main()
{
                                          
    prinft("开始录音\n");
    recordvoice();
    system("pause");
}
就介绍到这里吧,欢迎各位阅读,如果学会了mciSendString函数的小伙伴们,记得关注关注随便点个赞呗,下一期讲讲怎么利用mciSendString函数,做一个音乐播放器
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_73633088/article/details/128371136

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值