|
发表于 2019-1-30 22:53:00
|
显示全部楼层
本帖最后由 行客 于 2019-1-30 23:00 编辑
如果你看完了上面的mciSendString的介绍,这里应该也比较好理解。如果有疑问可继续跟帖。
mciSendCommand播放mp3文件
该函数与mciSendString函数不同,该函数是基于命令消息(定义的常量)的,而mciSendString函数的命令是基于字符串的
函数原型如下:
MCIERROR mciSendCommand(
MCIDEVICEID IDDevice, //设备的ID,打开是不用此参数,一般设置为NULL。强调一下,打开命令不需要此参数。
UINT uMsg, //命令消息,如:MIC_OPEN(与上述open字符串是等价的)
DWORD fdwCommand, //额外的命令标记,如:指定 MCI_OPEN_ALIAS 则表明dwParam参数所指结构体中的lpOpen参数指向的为别名;若为MCI_OPEN_ELEMENT则表明lpOpen参数指向的为文件名
DWORD_PTR dwParam //为一结构指针,如:MCI_OPEN_PARMS(打开是所需的结构体)、MCI_PLAY_PARMS(播放是所需的结构体)、MCI_GENERIC_PARMS(结束时所需的结构体)
);
MCI_OPEN_PARMS open;//定义打开结构体变量
open.lpstrElementName = _T("res\\和兰花在一起.mp3");//填充参数
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,DWORD_PTR(&open));//打开
MCI_PLAY_PARMS play;//定义播放结构题变量
mciSendCommand(open.wDeviceID,MCI_PLAY,MCI_WAIT,DWORD_PTR(&play));//播放,此处是阻塞模式,播放完后才返回。也可以指定为0
//////////////////////////////////////////////当不需要播放时,关闭
MCI_GENERIC_PARMS close;
mciSendCommand(DeviceID,MCI_CLOSE,0,DWORD_PTR(&close));
DeviceID与打开时的ID一致
这种方式和上面的播放是一样的作用,但效率要高些。
我修改了以下代码,请你参考:// mciSendString.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int main(int argc, char* argv[])
{
// mciSendString(TEXT("open C:/a.mp3 alias shanv"),NULL,0,NULL);
// //mciSendString((LPCWSTR)("seek yeah to start"),0,0,0);
// mciSendString(TEXT("play shanv"),NULL,0,NULL);
// //mciSendString((LPCWSTR)"close yeah",NULL,0,NULL);
//
// Sleep(100000000);
MCI_OPEN_PARMS op;
op.dwCallback=NULL;
op.lpstrAlias=NULL;
op.lpstrDeviceType=TEXT("MPEGAudio"); //设备类型,大多数文件可以这样设置
op.lpstrElementName=TEXT("C:\\a.mp3") ;//文件路径
op.wDeviceID=NULL; //打开设备成功以后保存这个设备号备用
UINT rs; //接受函数返回结果
rs=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT ,(DWORD)&op);//发送命令打开设备,成功返回0,否则返回错误号,第三个参数这里必须MCI_OPEN_ELEMENT
if(rs==0) //设备打开成功就播放文件
{
MCI_PLAY_PARMS pp;
pp.dwCallback=NULL;
pp.dwFrom=0; //开始播放的位置
mciSendCommand(op.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)&pp);//播放文件,如果第三个参数设为MCI_WAIT则程序窗口会被阻塞,为了避免这种情况可以设为MCI_NOTIFY ,这两个标志的详细区别请见MSDN,区别不小哦。
}
MCI_GENERIC_PARMS gp;
gp.dwCallback=NULL;
mciSendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&gp);
return 0;
}
|
|