VC++多媒体技术MCI使用.docx

上传人:b****0 文档编号:8933229 上传时间:2023-05-16 格式:DOCX 页数:61 大小:452.86KB
下载 相关 举报
VC++多媒体技术MCI使用.docx_第1页
第1页 / 共61页
VC++多媒体技术MCI使用.docx_第2页
第2页 / 共61页
VC++多媒体技术MCI使用.docx_第3页
第3页 / 共61页
VC++多媒体技术MCI使用.docx_第4页
第4页 / 共61页
VC++多媒体技术MCI使用.docx_第5页
第5页 / 共61页
VC++多媒体技术MCI使用.docx_第6页
第6页 / 共61页
VC++多媒体技术MCI使用.docx_第7页
第7页 / 共61页
VC++多媒体技术MCI使用.docx_第8页
第8页 / 共61页
VC++多媒体技术MCI使用.docx_第9页
第9页 / 共61页
VC++多媒体技术MCI使用.docx_第10页
第10页 / 共61页
VC++多媒体技术MCI使用.docx_第11页
第11页 / 共61页
VC++多媒体技术MCI使用.docx_第12页
第12页 / 共61页
VC++多媒体技术MCI使用.docx_第13页
第13页 / 共61页
VC++多媒体技术MCI使用.docx_第14页
第14页 / 共61页
VC++多媒体技术MCI使用.docx_第15页
第15页 / 共61页
VC++多媒体技术MCI使用.docx_第16页
第16页 / 共61页
VC++多媒体技术MCI使用.docx_第17页
第17页 / 共61页
VC++多媒体技术MCI使用.docx_第18页
第18页 / 共61页
VC++多媒体技术MCI使用.docx_第19页
第19页 / 共61页
VC++多媒体技术MCI使用.docx_第20页
第20页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VC++多媒体技术MCI使用.docx

《VC++多媒体技术MCI使用.docx》由会员分享,可在线阅读,更多相关《VC++多媒体技术MCI使用.docx(61页珍藏版)》请在冰点文库上搜索。

VC++多媒体技术MCI使用.docx

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窗口

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2