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

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

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);//alias是别名的意思,下面就可以去直接用music来代替kk.mp3
	mciSendString("play music",0);//播放音乐

 在打开文件时我以及给这个mp3文件取了别名,下面我是直接用music来表示这个文件的名字.

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

mciSendString("open kk.mp3 alias music",0);
mciSendString("play music repeat",0);

如果我们想等播放完了音乐在接着执行下面的语句,那就在play music后面加上wait

mciSendString("open kk.mp3 alias music",0);
mciSendString("play music wait",0);

如果想播放视频,全屏播放加上fullscreen就OK

mciSendString("play music fullscreen",0);

 2.关闭结束播放

当播放完毕后要关闭音乐。

mciSendString("close music",0);

 3.暂停与继续

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

//暂停
mciSendString("pause music",0);
//或者  
mciSendString("stop music",0);

//继续播放
mciSendString("resume music",0);

 所以我们可以通过键盘指令来控制音乐的播放与暂停,代码如下:

void stopresume()
{
	char ch;
	int i = 1;
	//这个表示在键盘获取一个字符,但是不打印出来,接着继续往下执行,getch函数的头文件是#include<conio.h>
	mciSendString("play music",0);//开始,先播放音乐
again:
	ch = getch();
	if (ch == ' '&& i % 2!= 0)//如果获取的字符为空格,同时i为奇数的话,那么就暂停
	{
		mciSendString("pause music",0);
		++i;
	}
	else if (ch ==' ' && i % 2 == 0)//如果获取的字符为空格,同时i为偶数的话,那么就继续
	{
		mciSendString("resume music",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);

 我们可以在这个基础上进行音量的加减,例如:

当前媒体音量

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

mciSendString("setaudio music volume to 800",0);
//意思是把音量调节到当前媒体音量的80%,换算过来就是此时的音量为32

既然知道了这些,那我们怎么去通过键盘或者鼠标的外部操作来改变播放音量呢?其实非常简单,利用循环就可以搞定了,代码如下:

void volume()
{
int i=0;
char a[100];
	mciSendString("open kk.mp3 alias music",0);
while (true) {
	mciSendString("play music",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,i);//把此时的音量以及操作字符串赋给a
	mciSendString(a,0);//音量的设置
	
}
}

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

 5.快进,快退

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

//mci 中的seek指令可以实现把播放进度从某一个位置开始,从而实现快进与快退
mciSendString("seek music to 7*1000",0);//这里表示把music从7秒处开始播放
//这个时间的单位是毫秒,所以我写成7*1000 比较直观表示的7秒

 我们也可以用start与end来表示从头开始(当然,音乐一般自然而然是从头开始的),或者直接把播放进度拉倒尾部。如下所示:

	mciSendString("seek music to start",0);//从开头开始播放

	mciSendString("seek music to end",0);//从最后位置开始播放

既然如此,我们可以通过键盘来实现快进快退,代码如下:

void forwardbackdard()
{
	char arr;
	int i = 0;
	char ss[100];
	mciSendString("open kk.mp3 alias music",0);
	while (true)
	{
		mciSendString("play music",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);
		printf("%d",i/1000);//打印出此时快进或者快退了多少秒
	}
}

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

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

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

char length[100];
mciSendString("status music length",length,0);//获取音乐长度,返回到字符串length
//同上我们可以把字符串转换为int类型
int num;
num=atoi(length);

        其次还有获取此时音乐播放了多少的长度,mci指令中的position来获取此时此刻已播放时间的长度。

char now[100];
mciSendString("status music position",now,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",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",0);
		 t = atoi(now);	
	}
}
void alllong()//画出进度总长度,初始化
{
	setfillcolor(RGB(100,100));//颜色为灰色
	fillrectangle(0,1000,320);
}
int main()
{
	                                      
	initgraph(1000,400);
	alllong();
	mciSendString("open 2.mp3 alias music",0);
	mciSendString("play music",0);
	progress();
    system("pause");
}

下面是运行结果:

7.录音功能

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

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

mciSendString("open new type waveaudio alias moo",0);//打开建立一个声音类型的文件项目,别名为moo
mciSendString("record moo",0);//开始记录声音

//中间这里可以通过延迟函数Sleep去控制录音时间,或者自行设立一个结束录音按键

mciSendString("save moo e:\\jojo\\123.mp3",0);//设为mp3格式(还可以设置为其他格式例如wav),保存到 ……
mciSendString("close moo",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);//设置音频的位度 8位,(还有16,24位,位度越高,声音越清晰)
	mciSendString("set wave samplespersec 1",0);//设置录音赫兹,11025是人类可
	mciSendString("set wave channels 2",0);//设置声道,2是表示立体声(双声道),1是表示单声道
	mciSendString("set wave format tag pcm",0);//设置pcm格式,是数字信号比模拟信号质量要好
	mciSendString("open new type waveaudio alias moo",0);//打开建立一个声音类型的文件项目
	mciSendString("record moo",0);//开始记录声音
	char d;
	d = getch();
	if (d == ' '); //按下空格表示录音结束
	{
        printf("录音结束\n");
		mciSendString("save moo e:\\jojo\\123.wav",0);//保存
		mciSendString("close moo",0);//关闭
	}
}
int main()
{
	                                      
	prinft("开始录音\n");
	recordvoice();
    system("pause");
}

就介绍到这里吧,欢迎各位阅读,如果学会了mciSendString函数的小伙伴们,记得关注关注随便点个赞呗,下一期讲讲怎么利用mciSendString函数,做一个音乐播放器

原文地址:https://blog.csdn.net/m0_73633088/article/details/128371136

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作中,很多时候我们经常会使用到虚拟机来进行环境的测试,我们平时在虚拟机上接触的最多的莫过于Linux和Winwdos。不过虚拟机环境和物理机环境是无法直接传输的,那么有的时候呢,同学们又想要在两者之间相互传输文件,可能就会使用QQ邮箱等形式来传输,这样的效率又慢而且繁琐,今天我就为大家带来一种非常便捷的传输方式。通过XFTP工具来进行文件传输。_xftp连接windows
文章浏览阅读1k次。解决 Windows make command not found 和 安装 GCC 环境_windows下载gcc
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计算机配置“ - ”管理模板“ - ”网络“ - ”Lanman工作站”,点击右侧的“启用不安全的来宾登录”策略。Windows访问samba共享时,提示“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问”1、键盘按下window+R键,输入gpedit.msc,启动本地组策略编辑器。首先在终端中输入sudo ufw status查看当前防火墙状态。默认状态是“未配置”,修改为“已启用”。示例:创建一个narada的目录在/home下。1.更新apt储存库列表。_ubuntu samba 目标文件夹访问被拒绝
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是Blu-ray Disc,一种高清的电影版本,这种电影十分清晰但是数据量巨大,占数十G甚至上百G的容量,只有蓝光光碟才能装得下,所以这种高清电影被称为BD版。一般的高清电影多半是从蓝光电影、国外的高清电视频道上压制而来的,可以通过网络下载,多数都经过二次压缩,画质要逊于原视频,不过压缩后的容量从蓝光的25G-50G会减少成4G-8G等(15G-20G不等)。众所周知,视频有两种常见的清晰度,BD和HD,在看电影的时候最常出现这两个标志,那么BD和HD具体指的是什么呢?_bd hd
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。接口是只读的,它只能支持前向迭代,不能修改集合中的元素。类型的集合实例,并向其中添加了几个元素。接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。接口,我们可以在 C# 中实现可迭代的集合,并使用。循环和迭代器手动遍历集合,并输出每个元素的值。接口表示一个可枚举的集合,它定义了一个方法。属性,用于获取集合中当前位置的元素。存储集合中的元素,并实现了。的泛型集合类,它实现了。
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。因为遍历过程中进行remove 操作时,该位置后面的元素会挤到前面来,这时候会发生一种情况就是原来元素的位置会被他后面的元素取代,而该位置已经遍历过了,所以该元素不会背遍历。当我们倒序遍历元素的时候,无论删除元素之后的元素怎么移动,之前的元素对应的索引(index)是不会发生变化的,所以在删除元素的时候不会发生问题。_list删除某个元素
文章浏览阅读2.9w次,点赞45次,收藏192次。Windows下配置Visual Studio _vs2022环境变量配置
文章浏览阅读7w次,点赞162次,收藏778次。pip 是Python包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能,目前Python 3.4 和 2.7 及以上版本都有配套安装,一般pip的位置在...pythonScripts文件夹里面,而在其他版本需要自行下载。_python pip install安装
文章浏览阅读5.8k次,点赞2次,收藏12次。①此电脑右击----->选择属性----->高级系统设置----->环境变量----->path----->编辑----->新建。第一个选项意思就是将安装路径填入到系统环境变量中,这里勾选,后面使用可能会出现问题,建议不要勾选,安装好之后手动添加环境变量。注意:如果提示conda不是内部或外部命令,原因是Anaconda的环境变量没配置好。如果不想立即打开anaconda,不勾选直接finish就好。②输入 conda --version ,查看conda环境。②直接按win键,搜索“环境变量”_windows安装anaconda
文章浏览阅读5.1k次,点赞8次,收藏55次。Windows 系统从零配置 Python 环境,安装CUDA、CUDNN、PyTorch 详细教程_windows cuda cudnn配置
文章浏览阅读1.5w次,点赞54次,收藏68次。macOS系统自带有VNC远程桌面,我们可以在控制端上安装配置VNC客户端,以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制,为此,我们可以在macOS被控端上使用cpolar做内网穿透,映射VNC默认端口5900,通过所生成的公网地址,来实现在公网环境下远程控制VNC。_vnc mac
文章浏览阅读2.4k次,点赞5次,收藏11次。进入后根据自己的电脑系统下载,这是python 3.10版本下载地址,如果想要下载其它版本可进入此链接(下载完成后点击进行安装点击下一步,到这一步时,可以选择将Anaconda添加我的PATH环境变量中,这样就不用自己手动配置和环境变量。安装完成后,打开终端,输出 python 命令可查看是否安装成功。如果显示自己刚才安装的版本号说明安装成功。查看conda版本命令:conda info。_paddlespeech下载
文章浏览阅读3.3k次。所以如果要删除之前新增的课程编译原理,只需输入命令del Course:8:Cname,同时还应该把本课程的学分删除del Course:8:Ccredit,如下图所示;Redis并没有修改数据的命令,所以如果在Redis中要修改一条数据,只能在使用set命令时,使用同样的键值,然后用新的value值来覆盖旧的数据。先调用get命令,输出原先的值,然后set新的值,最后再get得到新值,所以修改成功。输入命令后没有报错,表示成功了,刷新windows的服务,多了一个redis服务。_redis windows服务
文章浏览阅读2.1w次,点赞9次,收藏56次。​​接着在【工作负荷】中,选择【使用C++桌面开发】 ,右边【安装详细信息】去除其它可选项,只勾选【MSVCv142 】和 【Windows 10 SDK】,按图示修改,然后右下角点击安装,之后会有提示让你重启电脑。重启电脑之后,再进行pip安装。报错原因是pip所安装的包需要使用C++编译后才能够正常安装,但是当前安装环境中缺少完整的C++编译环境,因此安装失败。3.安装Microsoft Visual C++ Build Tool离线安装包(1个多G),CSDN资源很多,需要积分下载,_error: microsoft visual c++ 14.0 or greater is required. get it with "micros
文章浏览阅读1.1w次,点赞3次,收藏7次。Step 3: 在右侧窗口中找到名称为“LongPathsEnabled”的“DWORD (32 位) 值”条目,并双击它。通过注册表方法或组策略方法启用长路径支持后,您将能够在 Windows 中使用长路径,并能够访问和处理长路径下的文件和文件夹。Step 2: 依次选择“计算机配置” > “管理模板” > “系统” > “文件资源管理器”。Step 3: 找到“启用 Win32 长路径”设置,双击它。Step 4: 选择“已启用”选项按钮,然后选择“应用”按钮。_windows长路径支持
文章浏览阅读2.5k次,点赞81次,收藏86次。
文章浏览阅读1.3k次,点赞65次,收藏50次。顺序表,链表,栈,队列,ArrayList,LinkedList,Stack,Queue
文章浏览阅读2.3k次,点赞2次,收藏2次。AnyTXTSearcher是一款能够帮助我们对文档以及文本内容进行快速搜索和管理的工具,通过该软件能够搜索各种Office文档,文本文件,代码,PDF文档等,顶级的全文搜索引擎1秒钟之内即可完成搜索。_anytxt searcher
文章浏览阅读8.8k次,点赞73次,收藏70次。有时,在删除/移动/重命名文件夹/文件时,会遇到如下警告,即使将打开的程序关闭了,后台也可能会有没关干净的相关进程。_解除占用
文章浏览阅读4.3w次,点赞91次,收藏102次。JDK(Java Development Kit)是Java开发工具包的缩写,包含了Java编译器、Java虚拟机、Java类库等众多组件,是Java开发的基石,提供了编写、编译和运行Java程序所必需的工具。同时,为了让系统能够正确识别Java环境,在开始使用JDK进行Java开发之前,需要先把JDK安装到本地计算机,并配置好相应的环境变量。本文将介绍JDK安装与环境变量配置的方法。_windows安装jdk并配置环境变量