书城计算机网络多媒体技术
13955600000029

第29章 多媒体程序设计(2)

在这里,可以看到AutoActivate属性默认为DoubleClick,在应用程序执行时,只要用鼠标双击OLE对象,即可启动对应的动作。

【例7.5】

设计两个OLE控件,一个用于播放MIDI序列,一个用于播放AVI视频。

在窗体上绘制两个OLE控件,在插入对象窗口选择“由文件创建”,从浏览器中选择相应的MIDI文件和AVI文件。

由于AutoActivate属性都为DoubleClick,在应用程序执行时,只要用鼠标双击OLE对象,即可播放MIDI序列和AVI视频。

如要控制播放,比如单击“播放”按钮后播放,可针对Command1_CLICK事件编程。在本例中再增加三个按钮数组,即在窗体上绘制三个按钮,分别为“播放”、“编辑”、“结束”,然后进行复制,建立按钮数组。源程序如下:

7.4使用MCI控件开发多媒体程序

下面介绍用VB开发多媒体系统的另一种方法,这也是使用VB开发多媒体系统最主要的方法之一,即运用VB内附的MCI32.OCX,它是通过多媒体控制接口MCI(MicrosoftMultimediaControl6.0)对多媒体设备进行控制的。

7.4.1MCI简介

MCI(MediaControlInterface)是媒体控制接口的意思,它包含在MMSYSTEM。DLL库模块中,用来协调事件与MCI设备驱动程序之间的通信,为控制音频、视频等外围设备,提供了与设备无关的应用程序,并具有可扩充性。由于这些特性,用户的应用程序可以方便使用遵循MCI控制标准的多媒体设备,而且系统升级十分方便,使得开发应用系统无需了解多媒体产品的细节,大大提高了应用系统的开发效率。

1.MCI的接口分类

MCI接口可分成两类:一类是使用命令消息接口函数,另一类是使用命令字符串接口函数。这两种函数中的任何一种都可访问所有的MCI设备。命令消息接口使用消息控制MCI设备,命令字符串接口使用文本命令控制MCI设备。

Windows本身的通信方式是使用消息(Message)来实现的,所以若使用命令消息接口函数来执行Windows的多媒体功能,则速度较快;若用命令字符串接口命令控制MCI设备,文本串中必须包含执行一个命令所需的所有信息,MCI分析文本串,并把它翻译成能送到命令消息接口中的消息才能执行,所以命令字符串接口的执行速度一定慢于命令消息接口。

Windows多媒体模块提供的与MCI有关的命令字符串接口函数有三个:

MCISENDSTRING向一个MCI设备驱动程序发送一个命令字符串

MCIEXECUTE为MCISENDSTRING的简化函数

MCIGETERRORSTRING返回一个同错误代码相对应的错误字符串

2.MCI设备类型

MCI可控制简单设备和复合设备,相应的设备驱动程序也分为简单和复合两类。简单设备是不需要指定数据文件的设备,如CD播放器。复合设备是需要指定相应的数据文件的设备,如MIDI数字音频设备。

应用程序通过MCI控制设备,必须有相应的MCI设备驱动,VB编程中常用到的部分MCI设备驱动如表72所示。

表7.2部分MCI设备驱动

设备类型

设备驱动程序名

描述Cdaudio

Mcida.drv

McidriverforadaudiodevicesSequencer

Mciseq.drv

MicrosoftmcimidisequencerVideodisc

Mcipronr.drv

McidriverforpioneervideodiscplayerMovice

Mcimmp.drv

McidriverformoviceWaveaudio

Mciwave.drv

Mcidriverforwaveformaudio

其他

Mciaap.drv

Mcidriverforfloorflc

Mciavk.drv

Mcidriverforavk

Mciavi.drv

Mcidriverforavi

Mcisca.drv

Mcidriverforvisca

归纳起来,MCI所能控制的多媒体设备如下:

①简单设备:可编程控制的录放像机,可编程控制的激光影碟机,CD音频设备,视频卡(如播放电视/录像机),MPEG解压卡(如播放CDIMovie光盘)。

②复合设备:数字视频播放设备(如*.avi文件),动画播放设备(如*.fli文件),语音录放设备(如*.wav文件),MIDI音序器(如*.mid文件),MPEG解压卡(如*.mpg或*.dat文件)。

7.4.2MCI32.OCX的属性

媒体控制对象涉及的属性和事件很多,表73列出了MCI的部分属性,下面介绍媒体控制对象的一些重要属性。

表7.3MCI的部分属性

属性

描述

属性

描述AutoEnable

自动启用

NotifyMessage

确认信息ButtonVisible

显示按钮

NotifyValue

确认设定值CanEject

能否退出媒体

Orientation

定位CanRecord

能否记录

Position

位置CanStep

能否前进一格画面

RecordMode

记录格式Command

MCI命令

Shareable

能否共享DeviceID

多媒体设备代码

Silent

静音DeviceType

多媒体设备类型

Start

开始位置Error

错误

TimeFormat

时间格式ErrorMessage

错误信息

To

结束位置FileName

文件名

Track

磁道Frames

画面

TrackLength

磁道长度Length

媒体长度

Tracks

磁道总数Mode

目前所处状态

Visible

能否显示MousePoint

鼠标指针形状

Wait

等待Notify

确认hWndDisplay设定窗口

From起始位置TrackPosition轨道起始位置UpdateInterval更新间隔。

1.有关外观的属性

1)AutoEnable属性

AutoEnable属性设置为True时,媒体对象自动监测所指定的多媒体设备状态,并自动决定按钮的状态。AutoEnable属性设置为False时,可通过ButtonEnabled属性设置,决定媒体控件中按钮的有效性。

2)ButtonVisible属性

ButtonVisible属性设置为False时,按钮在媒体控件上消失。

3)Visible属性

设定媒体控制对象在程序执行阶段是否显示出来。

4)CanEject,CanRecord,CanStep属性

这些属性在设计阶段不可见,即在属性窗口中不出现,运行时只读。主要用来监测打开的设备是否具有弹出媒体、播放、录制、步进等功能。

5)Orientation属性

该属性设定媒体控制对象按钮的排列方向。

2.对媒体的一般控制功能

一般控制功能是指对媒体的通用控制功能,它几乎适用于所有的媒体设备。

1)DeviceType属性

指定要打开的媒体设备类型,MCI控件可根据文件扩展名自动设置设备类型。

2)FileName属性

以【打开】命令指定要打开的文件,或以【保存】命令指定要保存的文件。针对复合设备,必须指定文件名才可以打开和保存。

3)Command属性

执行一个MCI控制命令,属性窗口不显示该属性。可以使用14个基本命令来完成一些功能,如表74所示。具体格式是:

媒体控制对象.Command=MCI控制命令

表7.4MCI常用控制命令列表

MCI控制命令说明MCI控制命令说明

Open打开媒体设备Record录制Close关闭媒体设备Prev回到目前磁道的起始点Play播放Next到下一个磁道的起始点Pause暂停Seek搜索指定的位置Stop停止Eject退出媒体Back后退一格画面Sound播放声音Step前进一格画面Save存储。

4)hWndDisplay属性

通过设置该属性,给需要窗口的多媒体设备设定一个窗口,这类多媒体设备通常指Avivideo和Overlay设备。对Avivideo设备而言,如果不提供窗口设置,系统主动提供一个缺省窗口显示视频。

5)From,To属性

用在Play或Record前,表示播放或录制的起始、结束位置。

6)TimeFormat,Position,Start属性

TimeFormat用来设定时间格式,如果未设定TimeFormat或所用的设备不支持设定值,则系统会使用缺省值。Timeformat的属性说明如表75所示。

表7.5TimeFormat的属性说明

属性值

说明0Milliseconds以ms为单位1

HMS以时分秒为单位,用4个字节存储,前3个字节对应于时分秒,最后字节未用2

MSF以分秒帧为单位,用4个字节存储,前3个字节对应于分秒帧,最后字节未用3

以帧为单位8

以字节为单位9

以取样为单位

根据设定的TimeFormat属性值,Position属性返回已打开的媒体设备的位置,一般用4个字节表示。Position属性在程序执行时只读,在属性窗口不可见,即用户不能通过改变该属性值来改变媒体设备的位置。Start属性根据目前的时间格式,返回媒体设备的起始位置。同样,该属性在程序执行时只读,在属性窗口不可见。

7)Mode属性

Mode的属性说明如表76所示。

为顺利运行下一个MCI命令,常可通过对Mode属性的读取,获得设备的当前状况。例如,在播放声音文件前,通过检测设备状态,确保设备关闭后再打开。其程序段如下:

IfNotMMControl1.Mode=524Then

MMControl1.Command=“close”

EndIf

MMControl1.FileName=“指定要打开的文件名”

MMControl1.Command=“open”…

8)Silent属性

决定声音是否可以播放。

9)Shareable属性

决定多个程序是否能共享一个MCI设备。一般而言,此属性针对的是简单设备,而复杂设备不能共享。

10)Track,TrackLength,TrackPosition,Tracks属性

目前,Track只用在cdaudio,videodisk中,该属性指定特定的轨道(Track)供TrackLength及TrackPosition属性传回相关信息。就cdaudio而言,每个TrackLength代表一首歌中Track属性指定的轨道的时间长度。TrackPosition指定轨道的起始位置,Tracks传回轨道数。

11)UpdateInterval属性

该属性的值决定两次StatusUpdate事件之间的us数。如果其值为0,将不会有任何的StatusUpdate事件发生。

7.4.3MCI32.OCX的事件

媒体控制对象的事件有Done、ButtonClick、ButtonCompleted、ButtonGotFocus、ButtonLostFocus和StatusUpdate,事件描述如表77所示。Button可以是【Prev】、【Next】、【Play】、【Pause】、【Back】、【Step】、【Stop】、【Record】或【Eject】九个按钮之中的一个,如PlayClick事件。下面对这些事件进行简单的说明。

表7.7媒体控制对象的所有事件及描述

描述事件

描述Done

完成MCI命令动作ButtonGotFocus

按钮取得焦点BottonClick

单击按钮ButtonLostFocus

按钮失去焦点BottonCompleted

按钮动作完成StatusUpdate

更新媒体控制对象的状态报告

1)ButtonClick事件

语法格式:SubMMControln_ButtonClick(CancelAsInteger)。

其中n为媒体控制对象的序号,以后不再说明。

当MCI控件在运行阶段时,单击控件上的按钮激发相应的事件。在默认状态下,每个按钮的Click事件都是执行一个该按钮对应的MCI指令,例如,PlayClick事件执行一条MCI的play指令。即若在ButtonClick事件中,未将Cancel参数设为True,或未传True给ButtonClick事件,则系统先执行按钮代表的MCI指令,再执行事件过程中的语句。反之,若将Cancel参数设为True,则系统不执行按钮代表的MCI指令,而是直接执行事件过程中的语句。

2)ButtonCompleted事件

语法格式:SubMMControln_ButtonCompleted(ErrorcodeAsLong)。

媒体控制对象上按钮对应的MCI控制命令执行时,激发该事件。在事件中返回参数Errorcode,错误代码Errorcode的值所代表的意义如下:

·0MCI控制命令执行成功

·其他MCI控制命令执行不成功

3)ButtonGotFocus,ButtonLostFocus事件

当媒体控制对象的按钮取得焦点或失去焦点时分别激发ButtonGotFocus或ButtonLostFocus事件。

4)Done事件

语法格式:SubMMControln_Done(NotifyCodeAsInteger)。

在Notify属性设置为True时,MCI控制命令执行完毕时激发该事件。NotifyCode的值表示MCI控制命令是否完成,其设定值说明如表78所示:

7.4.4MCI编程举例

当进入VB6.0时,工具箱(ToolBox)中不包含MCI32.OCX,若要使用必须首先将其加入到工具箱中。办法如下: