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);//可以打印错误消息

你可能感兴趣的:(c语言,音乐,mp3,函数,c语言学习,有趣的C)