播放Wav文件
虽然可以使用PlaySound函数可以播放wav文件,但是该函数有一个缺点,就是音频文件必须完全载入物理内存,如果音频文件较大,则不适合使用PlaySound函数。此时,可以使用mciSendCommand函数来取代PlaySound函数实现wav文件的播放。
mciSendCommand函数语法如下:
MCIERROR mciSendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD_PTR dwParam);
参数说明:
IDDevice:表示接收命令消息的MCI设备标识符。
uMsg:表示命令消息,其可选值如表1所示。
表1媒体命令消息
|
值
|
描述
|
|
MCI_BREAK
|
表示设置中断键,默认为“CTRL+BREAK”
|
|
MCI_CAPTURE
|
捕捉帧缓冲区中的内容到指定的文件,仅用于数字视频
|
|
MCI_CLOSE
|
释放对设备或文件的访问
|
|
MCI_CONFIGURE
|
弹出一个配置对话框,仅用于数字视频
|
|
MCI_COPY
|
复制数据到剪贴板,仅用于数字视频
|
|
MCI_CUE
|
延时播放或录音
|
|
MCI_CUT
|
从文件中移除数据到剪贴板中,仅用于数字视频
|
|
MCI_DELETE
|
从文件中移除数据
|
|
MCI_ESCAPE
|
直接发送字符串到设备
|
|
MCI_FREEZE
|
将显示定格
|
|
MCI_GETDEVCAPS
|
返回设备的静态信息
|
|
MCI_INDEX
|
当前屏幕是否显示
|
|
MCI_INFO
|
获取设备字符串信息
|
|
MCI_LIST
|
获取输入设备的数量
|
|
MCI_LOAD
|
加载一个文件
|
|
MCI_MARK
|
取消或做一个记号,供MCI_SEEK快速定位
|
|
MCI_MONITOR
|
为数字视频指定报告设备
|
|
MCI_OPEN
|
初始化一个设备或文件
|
|
MCI_PASTE
|
从剪贴板中传递数据到文件中
|
|
MCI_PAUSE
|
暂停当前的动作
|
|
MCI_PLAY
|
开始播放
|
|
MCI_PUT
|
设置源、目标和帧区域
|
|
MCI_QUALITY
|
定义设备默认质量
|
|
MCI_REALIZE
|
将设备调色板传递到设备上下文中
|
|
MCI_RECORD
|
从指定的位置开始录制
|
|
MCI_RESERVE
|
为后面的记录分配相对连续的硬盘空间
|
|
MCI_RESTORE
|
从文件中复制位图到帧缓冲区中
|
|
MCI_RESUME
|
重新启动之前暂停的设备
|
|
MCI_SAVE
|
保存当前的文件
|
|
MCI_SEEK
|
尽可能改变媒体位置
|
|
MCI_SET
|
设置设备信息
|
|
MCI_SETAUDIO
|
设置视频设备中音频播放和捕捉的相关参数
|
|
MCI_SETTIMECODE
|
启动或取消VCR设备的时间码
|
|
MCI_SETTUNER
|
设置VCR设备通道
|
|
MCI_SETVIDEO
|
设置视频参数
|
|
MCI_SIGNAL
|
在工作区中设置指定的位置
|
|
MCI_SPIN
|
开启设备微调
|
|
MCI_STATUS
|
返回设备的状态信息
|
|
MCI_STEP
|
使播放设备跳帧
|
|
MCI_STOP
|
停止播放或录音
|
|
MCI_SYSINFO
|
返回MCI设备信息
|
|
MCI_UNDO
|
撤销之前的操作
|
|
MCI_UNFREEZE
|
让使用MCI_FREEZE的视频缓冲区恢复运动
|
|
MCI_UPDATE
|
更新显示区域
|
|
MCI_WHERE
|
获取设备裁减矩形
|
|
MCI_WINDOW
|
为图像设备标识窗口和窗口属性
|
fdwCommand:表示命令消息标识。
dwParam:表示一个结构指针,用于设置或获取命令消息的相关参数信息。
在介绍完mciSendCommand函数后,下面分析一下wav文件的播放顺序。首先使用MCI_OPEN命令打开一个波形设备,返回波形设备的标识符,然后使用MCI_PLAY命令播放wav文件,最后使用MCI_CLOSE命令关闭波形设备。下面通过一个示例介绍如何播放Wav文件。
例如,播放Wav文件
(1)创建一个单文档/视图结构的应用程序,视图基类为CFormView,工程名称为“PlayWave”。
(2)引用Mmsystem.h头文件和Winmm.lib库文件。
#include "Mmsystem.h" //应用头文件
#pragma comment (lib,"Winmm.lib") //引用库文件
提示:为了在程序中使用mciSendCommand函数,需要进行步骤(2)操作,即引用Mmsystem.h头文件,链接Winmm.lib库文件。
(3)定义一个CPlayWave类,用于打开波形设备、播放wav文件、关闭波形设备。
class CPlayWave //定义CPlayWave类
{
protected: //定义保护保护成员
MCIDEVICEID m_DeviceID; //记录波形设备ID
MCIDEVICEID m_ElementID; //记录波形元素ID
public:
CPlayWave() //定义构造函数
{
m_DeviceID = 0; //初始化设备ID
m_ElementID = 0; //初始化元素ID
InitDevice(); //调用InitDevice方法初始化设备
}
~CPlayWave() //定义析构函数
{
if(m_ElementID) //判断波形元素是否为0
Stop(); //停止波形元素
if(m_DeviceID) //判断波形设备是否为0
TerminalDevice(); //停止波形设备
}
DWORD InitDevice() //初始化设备
{
DWORD dwResult = 0; //定义一个整型变量
if (m_DeviceID == 0) //如果设备ID为0
{
MCI_OPEN_PARMS mciInitParms; //定义打开参数
mciInitParms.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
dwResult = mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID
|MCI_WAIT, (DWORD)(LPVOID)&mciInitParms); //打开波形设备
m_DeviceID = mciInitParms.wDeviceID; //获取波形设备ID
}
return dwResult; //返回结果
}
DWORD TerminalDevice() //终止波形设备
{
DWORD dwResult = 0; //定义一个整型变量
if (m_DeviceID) //判断设备ID是否为0
{
//关闭波形设备
dwResult = mciSendCommand(m_DeviceID,MCI_CLOSE,NULL,NULL);
}
m_DeviceID = 0; //将波形设备ID设置为0
return dwResult; //返回结果
}
DWORD Play(HWND hWnd,LPCSTR pFileName) //播放wav文件
{
MCI_OPEN_PARMS mciOpenParms; //定义打开参数
memset(&mciOpenParms,0,sizeof(MCI_OPEN_PARMS)); //初始化参数
mciOpenParms.lpstrElementName=pFileName; //设置文件名
DWORD dwResult = 0; //定义整型变量
dwResult = mciSendCommand(m_DeviceID,MCI_OPEN,MCI_OPEN_ELEMENT,
(DWORD)(LPVOID)&mciOpenParms); //打开波形元素
if(!dwResult)
{
m_ElementID=mciOpenParms.wDeviceID; //获取波形元素ID
MCI_PLAY_PARMS mciPlayParms; //定义播放参数
mciPlayParms.dwCallback=(DWORD)hWnd; //设置播放参数
dwResult=mciSendCommand(m_ElementID,MCI_PLAY,
MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms); //播放wav文件爱你
}
return dwResult; //返回结果
}
DWORD Stop() //停止播放
{
DWORD dwResult=0; //定义一个整型变量
if(m_ElementID) //判断波形元素ID是否为0
{
//关闭波形元素
dwResult=mciSendCommand(m_ElementID,MCI_CLOSE,NULL,NULL);
m_ElementID=0; //设置波形元素ID为0
}
return dwResult; //返回结果
}
};
(4)向视图类中添加一个CPlayWave成员。
CPlayWave wave; //定义一个CPlayWave成员
(5)向视图类中添加一个按钮,处理按钮的单击事件。
void CPlayWaveView::OnBtPlay()
{
wave.Stop(); //停止播放
wave.Play(m_hWnd,"Windows XP 登录音.wav"); //开始播放wav文件
}
(6)运行程序,效果如图1所示。
.jpg)
图1 播放wav文件