VC++多媒体技术MCI使用.docx
- 文档编号:23340899
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:61
- 大小:452.86KB
VC++多媒体技术MCI使用.docx
《VC++多媒体技术MCI使用.docx》由会员分享,可在线阅读,更多相关《VC++多媒体技术MCI使用.docx(61页珍藏版)》请在冰豆网上搜索。
VC++多媒体技术MCI使用
第7章多媒体技术
多媒体技术是综合图形、文字、声音和视频图象等多种媒体手段,用于传递和表达计算机信息的技术。
Windows提供了丰富的多媒体服务功能,用户可以根据自己的需求,编写层次不同的多媒体应用程序。
7.1使用MCI播放WAVE文件的程序实例
我们先举一个简单的例子,了解一下多媒体应用程序的编制过程和实现效果。
例7.1声音播放
1、新建项目
(1)创建一个基于对话框的应用程序,名为:
播放声音
(2)删除原有的“取消”按钮,把“确定”按钮的标题改为“退出”。
(3)添加一个按钮,其ID标识符为:
IDC_PLAY,标题为:
播放。
调整对话框大小和布局,如图7.1所示。
2、为程序添加多媒体支持
使用VisualC++编写多媒体程序时必须
向项目中添加多媒体支持。
步骤如下:
(1)Project->Setting->打开ProjectSetting
对话框->切换到Link选项卡,在
Object/Librarymodules文本框中输入
winmm.lib,如图7.2所示,OK退出。
图7.1播放声音程序的对话框布局
图7.2为程序添加多媒体支持
(2)在“播放声音Dlg.h”文件的前面写:
#include“MMSystem.h”
3、添加成员变量
在CMyDlg类(播放声音Dlg.h)中添加成员变量:
MCIDEVICEIDm_MCIDeviceID;
4、将一个声音文件如:
mail.wav拷贝到此项目文件夹中。
5、在CMyDlg类的OnInitDialog()成员函数中添加以下代码(可以把其它语句全部注释掉):
BOOLCMyDlg:
:
OnInitDialog()
{CDialog:
:
OnInitDialog();
MCI_OPEN_PARMSmciOpenParms;//打开MCI设备
mciOpenParms.lpstrDeviceType="waveaudio";//MCI设备名
mciOpenParms.lpstrElementName="mail.wav";//声音文件,此处写你考到文件夹下的声音文件名
mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,
(DWORD)(LPVOID)&mciOpenParms);
m_MCIDeviceID=mciOpenParms.wDeviceID;
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
说明:
(1)mail.wav是一个WAV声音文件,第4步时已经复制到此项目文件中。
程序首先打开了MCI设备,并把设备标识赋给了类的成员变量m_MCIDeviceID。
注意声音文件名不要带扩展名.wav。
6、播放声音文件
用ClassWizard为播放按钮(IDC_PLAY),在CMyDlg类添加鼠标单击的消息映射函数,并加如下代码:
voidCMyDlg:
:
OnPlay()
{//添加控件通知消息处理代码
MCI_PLAY_PARMSmciPlayParms;
mciPlayParms.dwFrom=0;//从文件开始处开始播放
mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM,
(DWORD)(LPVOID)&mciPlayParms);
}
7、在程序退出时停止播放并关闭MCI设备
用ClassWizard为CMyDlg类添加WM_DESTROY消息,该消息映射函数能使程序退出时停止声音文件的播放并关闭MCI设备。
voidCMyDlg:
:
OnDestroy()
{CDialog:
:
OnDestroy();
mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//停止播放
mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL);//关闭MCI设备
}
(8)编译并运行程序,在单击“播放”按钮时,程序将播放声音;当单击“退出”按钮或单击窗口的关闭按钮时,声音播放会立即停止。
7.2MCI(媒体控制接口)
媒体控制接口(MediaControlInterface)为Windows程序提供了在高层次上控制媒体设备接口的能力。
程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。
对于程序员来说,可以把MCI理解为设备面板上的一排按钮,通过选择不同的按键(发送不同的MCI命令)就可以让设备完成各种功能,而不必关心设备内部实现。
例如,对于play按键,视盘机和CD机有不同的反应(一个是播放视频,一个是播放音频),而对用户来说只需要按同一按钮。
利用MCI控制多媒体设备分为打开、使用和关闭设备三个过程。
7.2.1MFC设备类型
设备类型是指响应一组共用命令的一类MCI设备。
表7.1列出了MFC设备类型。
表7.1MCI设备类型
设备类型说明设备描述设备驱动程序
animation动画播放设备MCI_DEVICE_ANIMATION
cdaudioCD音频设备,如激光唱机MCI_DEVICE_CD_AUDIOMCICDA.DRV
dat数字音频磁带机MCI_DEVICE_DAT
digitalvideo数字视频设备MCI_DEVICE_DIGITAL_VIDEO
other未定义的MCI设备MCI_DEVICE_OTHER
overlay窗口中的模拟设备MCI_DEVICE_OVERLAY
scanner图形扫描设备MCI_DEVICE_SCANNER
sequencerMIDI设备MCI_DEVICE_SEQUENCERMCISEQ.DRV
vcr录象机设备MCI_DEVICE_VCR
videodisc影碟播放设备MCI_DEVICE_VIDEODISKMCIPIONR.DRV
waveaudio波形音频设备MCI_DEVICE_WAVEAUDIOMCIWAVE.DRV
mmmovie多媒体影片播放机MCIMMP.DRV
所有设备MCI_ALL_DEVICE_ID
avivideo视频音频交叉设备
7.2.2MCI命令与函数
应用程序通过MCI设备发送命令来控制MCI设备。
1、MCI命令
MCI发送命令有2种方法,一是调用MCI函数mciSendString(),向MCI发送命令字符串,二是调用MCI函数mciSendCommand()函数,向MCI发送命令消息,如表7.2所示。
2、MCI函数
所有的MCI函数名都是以mci为前缀,函数原型在MMSYSTEM.H中声明。
主要的MCI函数如表7.3所示。
3、高级音频函数
Windows提供了3个播放声音的高级音频函数,它们是:
MessageBeep()、PlaySound()
和sndPlaySound()。
这3个函数可以满足播放波形声音的一般需要,但他们播放的WAVE文件(波形声音文件)的大小不能超过100KB,如果要播放较大的WAVE文件,则应该使用MCI(媒体控制接口)。
表7.2MCI命令列表
命令消息命令字符串命令说明命令类型
MCI_SYSINFOSYSINFO返回有关MCI设备的信息
MCI_BREAKBREAK为一个指定的MCI设备设置一个终止键系统命令
MCI_SOUNDSOUND播放Windows指定的系统声音
MCI_CLOSECLOSE关闭一个MCI设备
MCI_GETDEVCAPSGETDEVCAPS获得一个MCI设备的性能参数
MCI_INFOINFO从一个MCI设备得到有关的信息通用命令
MCI_OPENOPEN初始化一个MCI设备
MCI_STATUSSTATUS从MCI设备返回有关的状态
MCI_LOADLOAD从一个磁盘文件中加载数据
MCI_PAUSEPAUSE暂停播放
MCI_PLAYPLAY开始播放
MCI_RECORDRECORD开始记录数据
MCI_RESUMERESUME重新开始播放或录音可选命令
MCI_SAVESAVE将数据存储到磁盘文件中
MCI_SEEKSEEK向前或向后检索
MCI_SETSET设置设备信息
MCI_SYOPSTOP停止播放或记录
表7.3常用的MCI函数
函数名功能类型
mciSendCommand发送命令消息
mciGetDeviceID获得MCI设备的ID向MCI发送命令消息函数
mciSetYieldProc设定回调函数
mciGetYieldProc获得回调函数
mciSendString发送命令字符串向MCI发送命令字串函数
mciGetErrorString获得当前MCI错误的字符串描述公用函数
(1)MessageBeep()函数
该函数主要用来播放系统报警声音。
系统报警声音是由用户在控制面板中的声音(Sounds)程序中定义的,或者在WIN.INI的[sounds]段中指定。
该函数的原型为:
BOOLMessageBeep(UINTuType);
参数:
uType说明了声音的类型,如表7.4所示。
若函数调用成功则返回TRUE。
MessageBeep()只能用来播放少数定义的声音,如果程序需要播放波形音频文件(*.WAV文件)或音频资源,就需要使用PlaySound()或sndPlaySound()函数。
表7.4MessageBeep()函数的参数取值
UType描述
-1从机器的扬声器中发出蜂鸣声
MB_ICONASTERISK播放由SystemAsterisk定义的声音
MB_ICONEXCLAMATION播放由SystemExclamation定义的声音
MB_ICONHAND播放由SystemHand定义的声音
MB_ICONQUESTION播放由SystemQuestion定义的声音
MB_OK播放由SystemDefauIt定义的声音
(2)PlaySound()函数
PlaySound()函数的函数原型为:
BOOLPlaySound(LPCSTRlpszSound,HMODULEhMod,DWORDfdwSound);
参数:
lpszSound指定了要播放声音的字符串,该参数可以是WAVE文件的名字、WAVE资源
名、内存中声音数据的指针或在系统注册表WIN.INI中定义的系统事件声音。
如果该参数为NULL则停止正在播放的声音。
hMod是应用程序的实例句柄,当播放WAVE资源时使用该参数,否则它必须为NULL。
fdwSound是标志的组合,如表7.5所示。
若函数调用成功则返回TRUE,否则返回FALSE。
表7.5播放标志
标志含义
SND_APPLICATION用应用程序指定的关联来播放声音
SND_ALLASlpszSound参数指定了注册表或WIN.INI中的系统事件的别名
SND_ALLAS_IDlpszSound参数指定了预定义的声音标识符
SND_ASYNC用异步方式播放声音,PlaySound函数在开始播放后立即返回
SND_FILENAMElpszSound参数指定了WAVE文件
SND_LOOP重复播放声音,必须与SND_ASYNC标志一块使用
SND_MEMORY播放载入到内存中的声音,此时lpszSound是指向声音数据的指针
SND_NODEFAULT不播放默认声音,若无此标志,则PlaySound在没有找到声音时会
播放默认声音
SND_NOSTOPPlaySound不打断原来的声音播出并立即返回FALSE
SND_NOWAIT如果驱动程序正忙,则函数就不播放声音并立即返回
SND_PURGE停止所有与调用任务有关的声音。
若参数lpszSound为NULL,
就停止所有的声音,否则,停止lpszSound指定的声音。
SND_RESOURCElpszSound参数是WAVE资源的标识符,这时要用到hMod参数
SND_SYNC同步播放声音,在播放完后PlaySound函数才返回
7.3MCI编程步骤
MCI为用户提供了控制不同多媒体设备的函数库,这些函数库允许用户以不同的方式访问设备。
在MFC中使用MCI函数进行多媒体设备控制的一般步骤为:
打开设备设置或获取设备相关信息播放设备关闭设备等几个过程。
实际上,上述过程的操作都要向多媒体设备发送MCI指令。
指令发送一般是通过调用表7.3中的mciSendCommand(用于发送命令消息)或mciSendString(用于发送字符串命令)函数进行的。
其中的mciSendCommand函数原型如下:
MCIERRORmciSendCommand(MCIDEVICEIDIDDevice,UINTuMsg,DWORD
fdwCommand,DWORDdwParam);
参数:
IDDevice:
表示接受MCI命令的设备标识符,但当MCI命令为MCI_OPEN时,此参数应为0;
uMsg:
表示要发送的命令消息;
fdwCommand:
表示MCI命令消息的标志位;
dwParam:
表示指向MCI命令消息数据结构的指针。
该函数成功调用时返回0,否则返回非0值。
另外,在调用MCI函数所在的源文件开头处(最好是stdafx.h(建立预编译头文件))还要包含文件mmsystem.h以及编译时加入winmm.lib库或在程序中加入下列语句:
#pragmacomment(lib,”winmm32.lib”)
下面是MCI编程过程中,不可缺少的4个步骤,其列出的代码,我们在例7.1中都有过使用。
1、打开设备
为了简化代码,MCI为不同的多媒体设备打开提供相应的数据结构类型。
例如,对于waveaudio设备提供了MCI_WAVE_OPEN_PARMS结构,对于overlay提供了MCI_OVLY_OPEN_PARMS结构等。
若用户不想使用设备中特定的参数数据,则可使用统一的MCI_OPEN_PARMS结构,其原型如下:
typedefstruct
{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄
MCIDEVICEIDwDeviceID//返回的设备表示符
LPCSTRlpstrDeviceType;//MCI设备的类型
LPCSTRlpstrElementName;//设备元素
LPCSTRlpstrAlias;//可选的设备别名
}MCI_OPEN_PARMS;
显然,打开一个多媒体设备的代码过程是:
首先定义一个MCI_OPEN_PARMS(或其他)结构类型变量,然后给结构变量中的相应参数赋值,最后调用mciSendCommand向设备发送MCI_OPEN命令消息,当调用成功时,即可获得相应的设备标识符。
2、设置或获取设备信息
使用MCI_SET和MCI_STATUS命令可以分别用于设置和获取设备信息,并在用函数mciSendCommand发送命令时使用相应的MCI_SET_PARMS和MCI_STATUS_PARMS结构,它们的原型如下:
typedefstruct
{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄
DWORDdwTimeFormat;//时间格式
DWORDdwAudio;//输出声道
}MCI_SET_PARMS;
typedefstruct
{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄
DWORDdwReturn;//要获取的设备信息
DWORDdwItem;//需要获取的信息项
DWORDdwTrack;//取目的长度或取目号
}MCI_STATUS_PARMS;
3、播放设备
使用MCI_PLAY命令可以使设备播放多媒体文件,并在用函数mciSendCommand发送命令时,使用相应的MCI_PLAY_PARMS结构,其原型如下:
Typedefstruct
{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄
DWORDdwFrom;//播放的起点位置
DWORDdwTo;//播放的终点位置
}MCI_PLAY_PARMS;
但需要注意的是:
为了便于程序判断媒体是否播放结束,还应该让MCI向窗口发
送MCI_NOTIFY消息。
而且,在调用的窗口中应加入MM_MCINOTIFY的消息处理。
但由于ClassWizard不支持该消息,因而需要手动进行。
例如,若接收MM_MCINOTIFY消息的窗口是一个对话框CMyDlg,则添加消息处理的过程如下:
(1)切换到项目工作区窗口的ClassView页面,右击CMyDlg类,选择快捷选单中的”AddMemberFunction…”命令。
在弹出的”AddMemberFunction”对话框中为CMyDlg类添加保护型的成员函数,其原型如下:
LRESSULTOnMCINotify(WPARAMwParam,LPARAMlParam);
(2)在类CMyDlg的消息入口处,添加下列消息宏指令:
ON_MESSAGE(MM_MCINOTIFY,OnMCINotify)
(3)编写CMyDlg:
:
OnMCINotify函数代码:
LRESULTCMyDlg:
:
OnMCINotify(WPARAMwParam,LPARAMiParam)
{……..
returnFALSE;
}
4、关闭设备
使用MCI_STOP和MCI_CLOSE命令可以分别用于停止播放和关闭设备,由于它们不需要设置或返回附加的信息因此用户不必考虑相应的MCI_GENERIC_PARMS结构。
7.4使用MCIWnd窗口类
上述直接使用MCI(媒体控制接口)的底层函数进行多媒体设备控制的方法需要用户编写大量的代码,而另一种更为简单的方法是使用MCIWnd(MediaControlInterfaceWindow)窗口类,它仅需要少量的程序就可以在应用程序中添加多媒体的控制功能。
MCIWnd是一个控制多媒体设备的窗口类,它提供的函数、消息以及宏与上述的MCI的底层功能相似。
若在应用程序中使用MCIWnd窗口类,还必须在调用MCIWnd函数所在的源文件的前面(最好是stdafx.h)添加vfw.h的头文件,以及编译时加入vfw32.lib库或在程序中加入语句:
#pragmacomment(lib,”vfw32.lib”)
在MCIWnd窗口类中,虽然它所提供的函数并不多,但是它所提供的宏却非常多,并且基本上与MCI的底层功能相对应。
在应用程序中使用MCIWnd窗口类的一般步骤是:
(1)在程序中调用MCIWndRrgisterClass函数注册MCI窗口类,以便以后用CreateWindow或CreateWindowEx函数创建窗口,或者直接调用函数:
MCIWndCreate创建窗口。
(2)获得相应的窗口句柄后,就可调用MCIWndOpen宏来打开设备。
(3)由于MCIWnd窗口提供了相应的媒体控制按钮,因而不需要用户编写额外的代码。
(4)作为技巧,用户还应该跟踪MCIWnd窗口的一些消息如:
MCIWNDMNOTIFYSIZE来调整MCIWnd窗口。
例7.2利用MCIWnd窗口类在多文档应用程序中添加一个多媒体播放器。
(1)用MFCAppWizard(exe)创建一个多文档应用程序名为:
多媒体播放
(2)在预编译头文件StdAfx.h中放入包含文件,以使应用程序能使用所有的多媒体代
码。
由于项目中的每一个文件已经包含StdAfx.h,所以在其他地方就不必再包含这些多媒体文件。
在工作区FileView页面,打开头文件(.h)夹,找到StdAfx.h按如下加代码:
………………..
#endif//_AFX_NO_AFXCMN_SUPPORT
#include
#pragmacomment(lib,”vfw32.lib”)
………
(3)在应用程序类的CMyApp:
:
InitInstance函数的最前面,使用MCIWndRegisterClass函数注册MCI窗口类。
虽然,后面的创建窗口是直接调用函数MCIWndCreate来进行的,但还应该保证应用程序的运行系统拥有并支持MCIWnd(是一个控制多媒体设备的窗口类)窗口类。
BOOLCMyApp:
:
InitInstance()
{if(!
MCIWndRegisterClass())//注册MCIWnd窗口类
returnFALSE;
AfxEnableControlContainer();
………….
}
(4)在CMyView.h的public中添加一个成员变量用于标识嵌入的MCIWnd窗口句柄:
HWNDm_hMyMCIWnd;//HWND窗口句柄,定义窗口句柄对象
(5)在CMyView类中添加OnInitialUpdate消息处理函数,并增加下列代码:
voidCMyView:
:
OnInitialUpdate()
{CView:
:
OnInitialUpdate();
m_hMyMCIWnd=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),
MCIWNDF_NOTIFYSIZE|MCIWNDF_NOERRORDLG|
WS_CHILD|WS_VISIBLE,NULL);//见下面说明1
if(m_hMyMCIWnd==NULL)return;//没创建子窗口,返回
constCString&filename=GetDocument()->GetPathName();//获得路径名
if(filename.GetLength()>0)//路径名字符串长度要大于0
MCIWndOpen(m_hMyMCIWnd,(LPCSTR)filename,0);//见下面说明2
}
说明:
函数:
MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),
MCIWNDF_NOTIFYSIZE|MCIWNDF_NOERRORDLG|
WS_CHILD|WS_VISIBLE,NULL);
其功能:
创建一个使用MCI设备的窗口,返回MCI设备窗口的句柄。
参数:
m_hWnd:
父窗口句柄
AfxGetInstanceHandle():
当前实例句柄,AfxGetInstanceHandle()函数就是获得实例句柄函数
NULL:
打开的MCI设备的名称或多媒体文件名
MCIWnd:
窗口的风格:
MCIWNDF_NOTIFYSIZE:
MCIWnd窗口
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 多媒体技术 MCI 使用