最近和同学做了个项目,即实现控制台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);//可以打印错误消息