MCI Command String总览XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
(注:本文以2000年七月的MSDN解释为准)
MCI Command String是多媒体设备的程序接口。通过它,我们可以打开一个多媒体文件,例如mp3,VCD文件,Mpeg4格式的文件等等,并对它进行播放,暂停,关闭等操作。现在小弟有幸给大家介绍一下MCI Command String的使用方法。
MCI Command String是通过mciExecute或mciSendString两个函数执行的。这两个函数的声明如下:
Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
这两个函数都有一个叫lpstrCommand的参数, 这个参数就是我们今天要介绍的MCI Command String。其中函数mciSendString还有三个参数,lpstrReturnString是一个字符串,它用来接收mciSendString函数返回的信息(例如,我们在lpstrCommand中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在这个参数中。);uReturnLength参数用来指定参数lpstrReturnString的长度;hwndCallback是接收“wait”、“notify”消息的窗口句柄,在Visual Basic中调用时该参数设为0即可。
如果命令执行出错,函数mciExecute会直接弹出一个对话框,提示出错的原因。而mciSendString函数会返回一个ErrorCode (错误代码),该代码的具体含义您可以参考MSDN中的目录“PlatfoRM SDKGraphics and Multimedia Serviceswindows MultimediaMultimedia ReferenceMultimedia ConstantsMCIERR Return Values”。您可以根据具体情况选择到底使用哪一个函数来执行MCI命令。例如,在调试的时候使用mciExecute,以便快速地获得错误原因,而在将要发布的程序中使用mciSendString函数,让程序中已设置的错误陷阱去处理错误,以避免频繁的错误提示而使用户觉得厌烦。
在熟悉了这两个函数后,我们就可以进入正题――MCI Command String了。
MCI Command String的命令格式是这样的:lpszCommand lpszDevice lpszCommandFlag lpazFlag
lpszCommand是mci命令,例如open,play,stop,close等等。
lpszDevice是设备名(或文件名)。例如,我们用以下的程序打开了我的文档中的Music01.dat文件,并用“alias”参数将其别名设为OpenFile:
dim lReturn as long (1)
lReturn=mciExecute(“open C:Mydocu~1Music01.dat alias OpenFile type MPEGVideo”) (2)
那么,在以后的MCI Command String中lpszDevice参数必须指定为OpenFile。例如,关闭该文件的代码如下:
lReturn=mciExecute(“close OpenFile”) (3)
如果我们没有为打开的文件设定别名,则以后调用的MCI Command String中lpszDevice参数为DOS路径名加文件名。例子如下:
dim lReturn as long (4)
lReturn=mciExecute(“open C:Mydocu~1Music01.dat type MPEGVideo”) (5)
lReturn=mciExecute(“close C:Mydocu~1Music01.dat type MPEGVideo”) (6)
从这里可以看出,设定别名的好处是减少了代码的输入。
LpszCommandFlag是mci命令的参数。如上代码(2),“alias OpenFile”以及“type MPEGVideo”就是命令“open”的参数。通常一个mci命令的参数少则几个多则几十个。
LpazFlag可以为指定为“wait”或“notity”。如果为“wait”,那么mci命令执行完毕后会向父窗体发送MCI_WAIT消息,“notity”则发送MCI_NOTIFY消息。此参数在Visual Basic中无甚用处。
在此先声明一下,微软支持的多媒体设备的类型共有cdaudio,dat,digitalvideo,other,overlay,scanner,sequencer,vcr,videodisc,waveaudio十种(注意:微软不支持RealPlay格式的文件。您可以用以下代码获得已打开的文件的类型:lReturn=mciSendString(“capability lpszDevice device type”,sReturn,32,0) )。至于哪一类设备支持哪些参数,您可以在MSDN中查找关键字“MCI Command Strings”,选中所列出的命令,在其中的HTML帮助文档中通常会有一个表格告诉你哪些设备支持哪些参数或者在第一段中有信息告诉您哪些设备支持该命令。
好了,现在让我们对又繁索,又该死,又强大的mci命令参数作一个系统的介绍。(本文仅介绍open命令的常用参数,其它命令的参数有机会小弟再介绍给大家。)
open:
该命令用来打开一个多媒体文件。所有的设备都支持这个命令。在任何mci命令执行前,都必须先打开多媒体文件,以初始化设备。
该命令的几个参数意义如下:alias device_alias――指定欲打开文件的别名;shareable――是否以共享方式打开,如果不指定该参数,则以不共享的方式打开,也就是说,打开某一个多媒体文件后,其它程序不能再打开它,如果指定该参数,则以共享方式打开;type device_type――指定该文件在Windows中注册的多媒体文件名(注:Windows中注册的多媒体文件名与设备类型名并不相同,设备类型只有以上所说的十种类型,而Windows中注册的多媒体文件名请查看C:Windowswin.ini文件的[mci extensions]小节。),如MPEGVideo,AVIVideo,waveaudio等,MPEGVideo、AVIVideo类型的文件其实都属于设备digitalvideo。
对于open命令,有几个须注意的方面。首先,用open命令打开一个文件时,文件的路径必须是DOS格式的短路径。您可以用api函数GetShortPathName返回某路径的该格式。对于参数type device_type,复合型设备的文件(如:MPEGVideo)mci设备会自动根据其在Windows中注册的扩展名 (要想获得某扩展名的文件在Windows中注册的类型名,请查看C:Windowswin.ini文件的[mci extensions]小节。)设置该参数(所以对于C:Windowswin.ini文件的[mci extensions]小节中已列的扩展名,不必指定该参数),但如果设备无法根据其扩展名获得文件的类型的话,就必须指定该参数,如果不指定则会提示:“这不是已注册的mci设备“,而简单型设备(如CD音轨设备,可编程控制的录放像机,可编程控制的镭射影碟机)则不必指定该参数。
如果该命令被成功执行,那么返回值为0。至此,您就可以用alias指定的别名执行各种各样的mci命令了。
(注意:以下命令所能实现的功能虽然很令人激动,但是通常您打开的文件支持的命令没有几个。)
Break:指定一个键来退出使用wait参数的当前mci命令。
Capability:获得已打开的设备的功能,比如能否播放,能否退出,能否记录等等。
Capture:将帧缓冲的数据拷贝到指定的文件中。
Close:关闭设备,释放内存。
Configure:显示一对话框,以设置设备的某些属性。
Copy:将数据拷贝至剪切板。
Cue:在播放或记录之前执行该命令可以加快播放或记录速度。
Cut:将工作区的数据剪切到剪切板。
Delete:从已打开的多媒体文件中删除数据段。
Freeze:终止视频输入或输出,禁止视频流从帧缓冲中获得数据。
Info:获得设备信息,例如算法,版权,所打开的文件,UPC等等。
List:返回视频和音频的数量和类型。
Load:用设备指定的格式打开一个文件。类似于open的功能。
Monitor:指定当前源,默认的当前源是当前工作区。
Paste:将剪切板的内容拷贝至工作区。
Pause:暂停播放或记录。
Play:呵呵,这个命令无须多说。
Put:决定显示源和显示目的窗口的区域。
Quality:自定义音频或视频的quality level和静态图像的压缩方式(例如BMP、JPG)。
Realize:自定义图像显示窗口的调色板。
Record:无须多说。
Reserve:为设备的工作区分配连续的磁盘空间。
Restore:将一静态图像从文件拷贝到帧缓冲中。
Resume:继续播放或记录。
Save:保存一个mci文件。
Seek:定位到指定的帧位置并等待。
Set:设置某些参数。(例如左声道,光驱开关,Time Format等等。)
Setaudio:设置音频参数。(例如低音,高音,左右声道)
Setvideo:设置视频回放或捕捉的参数。(例如亮度、对比度、伽马值等。)
Status:返回已打开的设备的状态信息。
Step:设置慢放时步进的帧数,负数即倒放,单位为帧/秒。
Stop:无须多说。
Undo:撤消最近一次copy、cut、delete和paste命令。
Unfreeze:Freeze的反操作。
Update:读取当前帧的数据,并显示在目标窗口或目标DC(设备场景)。
Where:获得Put命令指定的源或目标显示区域。
Window:设置播放的窗口。可以用它把播放窗口设置为其它窗口,取消默认的窗口。