首页 > 其他分享 >怎样在C语言软件开发代码中加入音乐?

怎样在C语言软件开发代码中加入音乐?

时间:2023-07-03 20:11:28浏览次数:61  
标签:NULL mymusic 软件开发 代码 音乐 C语言 mciSendString mp3 播放

在使用C语言编写游戏时,许多朋友遇到了添加音乐的问题,不知道该如何处理。今天我将一次性向大家分享解决方法!

使用mciSendString函数播放音乐

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

#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);//学习交流群:558970390
 
	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命令关闭。

一些有用的多媒体命令:

从头播放 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"

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

mciSendString("open \"D:\\My Music\\好朋友.mp3\" alias mymusic", NULL, 0, NULL);

操作中可能会遇到很多的的问题,可以到访我的主页群交流解决

 

使用 mciSendCommand 命令进行音乐播放的方式如下:

mciSendCommand 与 mciSendString 的功能相似,只是控制方式稍有差异。因此,不需要过多介绍 mciSendCommand,我们只看一个使用示例吧。以下范例实现了 mp3 音乐的循环播放:

#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);	// 关闭音乐 //学习交流群:558970390
 
	outtextxy(0, 0, L"按任意键退出程序");
	_getch();
	closegraph();
	return 0;

解决一些无法播放的MP3文件的问题

部分MP3文件在使用mciSendString函数播放时出现问题,这是因为它们包含了较大的封面图像。我测试了一个封面尺寸为1824x1824的MP3文件,结果无法播放。但是,当我将封面尺寸修改为500x500时,成功地进行了播放。当然,更简单的解决方法是直接移除封面图像。

 

使用PlaySound函数播放音乐

PlaySound函数可以用来播放WAV文件和系统声音,使用起来非常简单。以下是一些常用的用法示例:

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);						        // 停止后台播放

不管你是转行也好,初学也罢,进阶也可,如果你想学编程~

【值得关注】我的 编程学习交流俱乐部【点击进入】

标签:NULL,mymusic,软件开发,代码,音乐,C语言,mciSendString,mp3,播放
From: https://www.cnblogs.com/2467118965z/p/17523882.html

相关文章

  • yaml创建模型结构,代码阅读
    *前言.最近读到类似Detectron2结构的训练代码,实在是太痛苦了。因此,做笔记记录一下。1.整体结构:Trainingkit;      |----configs:存储各种网络的yaml配置文件;      |----docs        |----imxcv:运行代码的核心组件;......
  • C语言编译之分部编译
    一、概述在C语言中,将源代码转换为可执行文件的过程通常涉及以下几个步骤:编写源代码:使用文本编辑器创建C语言源代码文件,通常以.c为扩展名。预处理:使用预处理器对源代码进行处理。预处理器指令以#开头,用于包含头文件、宏定义等。预处理器会根据指令进行文本替换和宏展开等操......
  • DeepFashion2 的多进程处理代码(带进度条)
    importjsonfromPILimportImage,ImageDrawimportosfromtqdmimporttqdmimportmultiprocessingfromfunctoolsimportpartialdefconvert_rgba_to_rgb(image,output_path): #转换为RGB模式 rgb_image=image.convert('RGB') #保存为JPEG格式 rgb_......
  • C语言运算符优先级
    在C语言中,运算符优先级是一个比较麻烦的概念,如果搞不清楚优先级可能会产生一些难以察觉的错误第一优先级:[]().->第一优先级包括方括号,圆括号,对象,对象指针第二优先级:-~++–*&!(类型)sizeof第二优先级包括取负,按位取反,自增,自减,取值运算符,取地址符,逻辑非运算符,强制......
  • python基础35 网络编程 软件开发架构和七层协议
    软件开发架构网络编程我们要基于网络来编写一款B/S或者C/S架构的软件,比如:ATM,我们写的只是ATM的单机版本,没有接入网络系统,别人无法访问到的目的以ATM为例,现在我们想把之前写的ATM系统编程基于网络传输的,别人如果想用,就必须把客户端下载到本地电脑上,已登录为例,用户把用......
  • notepad++如何快速格式化代码
     2023-03-25 4505 广东举报简介: notepad++如何快速格式化代码Notepad++可以使用插件来快速格式化代码,以下是一种使用插件进行代码格式化的方法:打开Notepad++编辑器,并打开需要格式化的代码文件。在菜单栏中选择“插件”->“PluginManager”->“ShowPluginManag......
  • 低代码应用开发平台 高效构建业务系统
    低代码是传统软件开发逐步优化和演变的产物,并非全新革命。传统的开发方法过于昂贵和僵化,无法为企业提供所需的高效和敏捷的开发流程,且交付周期长定制能力弱,难以应对不断变化的市场和客户期望,为提高软件开发效率,对代码进行模块化组装的低代码产品进入开发者视野。低代码是基于可视......
  • C语言(2)
    目录6.数组6.1数组的概念6.2一维数组6.3排序问题6.3.1插入排序6.3.2冒泡排序6.3.3选择排序6.4二分查找6.5字符数组6.6二维数组6.数组6.1数组的概念一组具有相同类型,相同含义的数据类型的有序集合。数组不是基本类型,是构造类型。数组的本质/数组的存储方式:一片地址连续的空间......
  • 代码规范
    概述撰写编码规范可以清晰定义如下条款有规可循才是真正的规范原则:编程时必须坚持的指导思想规则:编程时强制必须遵守的约定建议:编程时必须加以考虑的约定说明:对原则规则建议进行必要的解释示例:对原则规则建议从正/反两个方面给出例子命名规范禁止一......
  • 41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring多数Boot中使用多数据源做准备。从Spring3.0开始,增加了一种新的途径来配置BeanDefinition,这就是通过JavaCode配置BeanDefinition。      与XML和Annotation两种配置方式不同点在于:      ......