C语言播放MP3音乐

最近和同学做了个项目,即实现控制台MP3播放。本人负责MP3的基本功能的实现,因此写一下与大家分享,当然理解有误的话请大家指正。

播放MP3使用了系统提供的库MCI,MCI中有两个主要的函数mciSendCommand与mciSendString.因为用的mciSendCommad,所以讲一下自己对mciSendCommand的使用。

看一下函数的声明:

MCIERROR mciSendCommand(

MCIDEVICEID wIDDevice,  //设备的ID,在打开设备时不用该参数

UINT uMsg,  //命令消息

DWORD  fdwCommand, //命令消息的标志

DWORD  dwParam  //指向包含命令消息参数的结构

);  //若成功则返回0,否则返回错误码

 

播放音乐首先由打开设备,并且要指明音乐的路径以及音乐的类型。

具体函数的使用:

MCIERROR mciError;

MCI_OPEN_PARMS  mciOpen;

MCI_OPEN_TYPE = “mpegvideo”

MCI_OPEN_ELEMENT =path; //path 为MP3文件的路径,注意歌曲名后要加上后缀MP3

Mci=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPENELEMENT,(DWORD)&mciOpen);

此时我们就可以播放音乐了。之前我们打开了一个设备,并且该设备的播放音乐的类型以及要播放的MP3文件已经固定,为保证我们在发送播放消息时仍然是对该MP3音乐操作,在打开设备时,函数为我们指定了一个设备的id;

typedef struct {
  DWORD_PTR   dwCallback;
  MCIDEVICEID wDeviceID;//设别ID
  LPCTSTR    lpstrDeviceType;//设备类型
           LPCTSTR    lpstrElementName;//文件名
   LPCTSTR    lpstrAlias;//别名
} MCI_OPEN_PARMS;

  根据MCI_OPEN_PARMS 的定义,我们可以得到id:

UINT  DeviceID = mciOpen.wDeviceID; //注意数据类型

现在开始调用函数:

MCI_PLAY_PARMS  mciPlay;//包含播放的一些基本信息。

typedef struct{ 
DWORD_PTR dwCallback;
DWORD dwFrom; //开始播放位置
DWORD dwTo; //终止播放位置
} MCI_PLAY_PARMS; 

mciError = mciSendCommand(DeviceID,MCI_PLAY, 0, (DWORD)&mciPlay);

当然有了播放就有暂停

接着调用函数:mciError = mciSendCommand(DeviceID, MCI_PAUSE, 0,(DWORD)&mciPlay);

然后调用函数mciError = mciSendCommand(DeviceID, MCI_RESUME, 0,(DWORD)&mciPlay);

就可以实现继续播放;

现在看一下音量如何调大:(音量调小原理相同)

看一下实现

MCI_DGV_SETAUDIO_PARMS  mciSetAudioPara;

mciSetAudioPara.dwItem =MCI_DGV_SETAUDIO_VOLUME;//指明要调节的项目是音量的调节

m_WaveVoice += VOLCHANGE;//m_WaveVoice可以声明为全局变量,每次调用函数音量自加

                          //VOLCHANGE 宏定义 指名词音量变化大小

mciError=mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mciSetAudioPara);//不理解其中的位运算,求大神的解释

现在来看一下快进与后退的实现:(快进,后退原理一致)

MCI_STATUS_PARMS  mciStatus;//状态记录,记录位置,用于快进,后退

mciStatus.dwItem = MCI_STATUS_POSITION; //参数为获取长度

mciError=mciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatus);//关键,取得位置

m_dPosition = mciStatus.dwReturn;//获取位置,从该位置前进

mciSeek.dwTo = m_dPosition + INTERVAL; //INTERVAL 宏定义,快进INTERVAL 秒

mciError = mciSendCommand(DeviceID, MCI_SEEK, MCI_TO,(DWORD)(LPVOID)&mciSeek);//将位置拨到指定位置。

mciError = mciSendCommand(DeviceID, MCI_PLAY, 0, (DWORD)&mciPlay)//开始播放;

 

 

最后我们讲一下MCIERROR  mciError;

简单讲,每次发送消息如果成功调用,mciSendCommand()就返回0,否则返回错误码

char buf[128];

mciGetErrorString(mciError, buf, 128);

printf(“%s”,buf);//可以打印错误消息

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言播放背景音乐MP3需要使用相应的库来实现。一个常用的库是libmad,它可以解码MP3文件。下面是一个简单的示例代码,演示如何使用libmad播放背景音乐MP3: ```c #include <stdio.h> #include <mad.h> #define BUFSIZE 4096 int main() { FILE *fp; struct mad_stream stream; struct mad_frame frame; struct mad_synth synth; mad_timer_t timer; unsigned char buf[BUFSIZE]; int read, ret; // 打开MP3文件 fp = fopen("background.mp3", "rb"); if (fp == NULL) { printf("无法打开MP3文件\n"); return -1; } // 初始化libmad结构体 mad_stream_init(&stream); mad_frame_init(&frame); mad_synth_init(&synth); // 读取和解码MP3数据 while (1) { // 从文件中读取数据 read = fread(buf, 1, BUFSIZE, fp); if (read == 0) { break; } // 将数据提供给libmad进行解码 mad_stream_buffer(&stream, buf, read); ret = mad_frame_decode(&frame, &stream); if (ret != 0) { printf("解码错误\n"); break; } // 合成音频 mad_synth_frame(&synth, &frame); // 播放音频(这里只是简单的输出PCM数据) for (int i = 0; i < synth.pcm.length; i++) { putchar(synth.pcm.samples[0][i]); } } // 清理libmad结构体 mad_synth_finish(&synth); mad_frame_finish(&frame); mad_stream_finish(&stream); // 关闭文件 fclose(fp); return 0; } ``` 这段代码使用libmad库读取并解码MP3文件,并将合成的PCM数据简单地输出到控制台。你可以将PCM数据通过合适的方式进行播放,比如使用音频库或API进行播放。 请注意,这只是一个简单的示例,对于更复杂的音频播放需求,可能需要使用更专业的音频处理库或API来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值