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

2023-11-14

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

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函数,做一个音乐播放器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • web安全--文件包含实例操作

    文件包含分为LFI 本地文件包含 和RFL 远程文件包含 两种 文件包含的前提是服务器allow url openllow url include LFI 或者allow url open RFI 在owasp环境中可以在 etc php5
  • 软件测试——自动化测试框架有哪些?

    目录 前言 一 Robot Framework 二 Pytest 三 UnitTest PyUnit 四 Behave 五 Lettuce 结语 前言 自动化测试常用的Python框架有哪些 常用的框架有Robot Framework Py
  • 命令行进入指定目录_命令行的简单介绍

    作为一名程序员 命令行是最基础的东西 不要以为作为前端就可以不用学习命令行了 前端首先是程序员然后再是前端 所以命令行是必须要懂的 接下来我们简单的来介绍几个最常用的命令吧 在介绍命令前 请先安装好Git bash等命令行工具 1 基础单词
  • QT5.15以及QT VS TOOL安装教程(精简版)

    前言 大作业需要做一个图形化的计算器 不给用Java 又只学过C 所以投奔QT的怀抱 网上有些教程已经没法用了 还不更新 这是我刚摸出来的方法 2023 Apr 实测可用捏 欢迎补充指正 QT5 15下载安装教程 点击这个链接 Index
  • IOC/DI/AOP回顾

    IOC BeanFactory ClassPathXmlApplicationContext AbstractApplicationContext 通过调 refrech 方法 去实现ioc容器的初始化 然后执行三个步骤 1 定位 主要执行
  • shell 脚本中总是会忘记的一些语法总结!!!!

    一 cmd gt file 2 gt 1 与 cmd 2 gt 1 gt file 区别 1 cmd gt file 2 gt 1 的意思是标准输出和标准错误输出都定向到 file 等价于 cmd gt file 或 cmd gt file
  • 【ML特征工程】第 6 章 :降维:用 PCA 压缩数据薄饼

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 请确保您已登录客户机操作系统。在客户机中装载虚拟CD驱动器,启动终端,使用tar解压...

    参考文档 官网指导文档 linux公社参考文档 转载于 https www cnblogs com bigorang p 10839217 html
  • QT创建计算器 [数据库实验课]

    QT创建计算器 数据库实验课 前言 qt我没有系统的学习过 所以对很多细节都很不清楚 今天写这个计算器 遇到了好多问题 问题 上课的时候老师做c 示例的时候 老师是在每一个0 9的按钮里 都双击添加函数的 然后我就想到当时写Java计算器的
  • 第二章:预备知识整理 ——2.1数据操作

    数据操作的课后练习题 2 1 8 练习 运行本节中的代码 将本节中的条件语句 X Y 更改为 X lt Y 或 X gt Y 然后看看你可以得到什么样的张量 用其他形状 例如三维张量 替换广播机制中按元素操作的两个张量 结果是否与预期相同
  • 解决eclipse maven 项目重新下载包这个问题

    本文转载至 http www cnblogs com huzi007 p 5602063 html 问题 eclipse项目使用maven下载依赖包 但是有时候断网什么来着就不会自动下载了 挺蛋疼了 所以 需要我们重新更新项目下载呢 首先是
  • Android PowerSupply (四)ChargeIC SGM41511 IC driver调试

    目录 Android PowerSupply 一 总概 Android PowerSupply 二 power supply core Android PowerSupply 三 power supply sys Android Power
  • IDEA 自动生成 serialVersionUID 的设置

    1 没有设置之前 选中对应的类名 然后按 alt enter 快捷键 的情况如下所示 2 设置自动生成 serialVersionUID 的方式如下图所示 关键点已逐个标识 3 设置之后 选中对应的类名 然后按 alt enter 快捷键
  • 分布式版本控制工具--Git

    分布式版本控制 Git的灵魂使用 版本控制简介 集中式版本控制 分布式版本控制 Git安装 Git的常用命令 Git配置项 新建仓库 增加 删除文件 提交文件 Git分支 Git的标签 查看信息 远程同步 撤销 版本控制简介 集中式版本控制
  • Vector容器的底层实现

    Vector容器的底层实现 Vector 类成员 构造函数 拷贝构造函数和析构函数 迭代器 函数功能 完整代码 总结 Vector Vector同样是STL六大组件之一 简单来讲他就是一个封装了动态大小数组的顺序容器 同时他可以存入各种各样
  • vue elementUI实现双(多)列表格,内容均自定义

    需求类似这样的 使用普通table实现 样式需要自己设置 table class person info border 1 cellspacing 0 tbody tr th 档案编号 th td personInfo name td th
  • 巴比特

    摘要 之前 由于没法开放注册 中国大模型厂商其实一直束手束脚 而8月31日 北京 上海率先通过了大模型备案 这意味着 跑得快 的企业可以大胆向市场推出产品了 从靠PPT来嘴花花 到放开手脚大干一场 大模型厂商们走向了真正的战场 争用户 抢市
  • LeetCode (二)找出数组中多于半数的数字

    题目 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数 大于 n 2 的元素 解法 自己的解法 思路 for循环遍历存Map 记录key对应的Count 如果大于半数 返回 package com jzj stu
  • React v16.3新生命周期、性能优化及注意事项

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 React Version 16 3版本对组件的生命周期函数进行了一些修改 在每个react组件中都有以下几个生命周期方法 我们应该掌握最新生命周期 学以致用 以达
  • mciSendString函数简介(播放音乐以及录音相关操作)

    函数功能 播放多媒体音乐 视频等 mciSendString是用来播放多媒体文件的API指令 可以播放MPEG AVI WAV MP3 等等 这个函数有自己的mci指令 可以通过不同的指令实现不同的功能 这里我会详细讲解mciSendStr