MCI Command String 总览
(注:本文以 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 中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在 lpstrReturnString 参数中。); uReturnLength 参数用来指定参数 lpstrReturnString 的长度; hwndCallback 是接收“ wait ”、“ notify ”消息的窗口句柄,在 Visual Basic 中调用时该参数设为 0 即可。
如果命令执行出错,函数 mciExecute 会直接弹出一个对话框,提示出错的原因。而 mciSendString 函数会返回一个 ErrorCode (错误代码),该代码的具体含义您可以参考 MSDN 中的目录“ Platform SDK\Graphics and Multimedia Services\Windows Multimedia\Multimedia Reference\Multimedia Constants\MCIERR Return Values ”。您可以根据具体情况选择到底使用哪一个函数来执行 MCI 命令。例如,在调试的时候使用 mciExecute ,以便快速地获得错误原因,而在将要发布的程序中使用 mciSendString 函数,让程序中已设置的错误陷阱去处理错误,以避免频繁的错误提示而使用户觉得厌烦。(对于有返回值的 MCI 命令,必须使用 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~1\Music01.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~1\Music01.dat type MPEGVideo”) ( 5 )
lReturn=mciExecute(“close C:\Mydocu~1\Music01.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 中无甚用处。
在此先声明一下,微软提供的 winmm.dll 函数库支持的多媒体设备的类型共有 cdaudio , dat , digitalvideo , other , overlay , scanner , sequencer , vcr , videodisc , waveaudio 十种(注意: winmm.dll 函数库不支持 RealPlay 格式的文件。您可以用以下代码获得已打开的文件的类型: lReturn=mciSendString(“capability lpszDevice device type”,sReturn,32,0) )。至于哪一类设备支持哪些参数,您可以在 MSDN 中查找关键字“ MCI Command Strings ”,选中所列出的命令,在其中的 HTML 帮助文档中通常会有一个表格告诉你哪些设备支持哪些参数或者在第一段中有信息告诉您哪些设备支持该命令。
好了,现在让我们对又繁索,又该死,又强大的 mci 命令参数作一个系统的介绍。(限于篇幅,本文仅介绍大部份主要命令的参数。)
** open ** :
该命令用来打开一个多媒体文件。所有的设备都支持这个命令。在任何 mci 命令执行前,都必须先使用该命令打开多媒体文件,以初始化设备。
该命令的几个参数意义如下: alias device_alias ――指定欲打开文件的别名; shareable ――是否以共享方式打开,如果不指定该参数,则以不共享的方式打开,也就是说,打开某一个多媒体文件后,其它程序不能再打开它,如果指定该参数,则以共享方式打开; type device_type ――指定该文件在 Windows 中注册的多媒体文件名(注: Windows 中注册的多媒体文件名与设备类型名并不相同,设备类型只有以上所说的十种类型。 RealPlay 格式的音视频流是第三方公司开发的媒体类型,不属于 Microsoft Windows 支持的设备。而 Windows 中注册的多媒体文件名请查看 C:\Windows\win.ini 文件的 [mci extensions] 小节。),如 MPEGVideo , AVIVideo , waveaudio 等, MPEGVideo 、 AVIVideo 类型的文件其实都属于设备 digitalvideo 。
对于 open 命令,有几个须注意的方面。首先,用 open 命令打开一个文件时,文件的路径必须是 DOS 格式的短路径。您可以用 API 函数 GetShortPathName 返回某路径的该格式。对于参数 type device_type ,复合型设备的文件(如: MPEGVideo ) mci 设备会自动根据其在 Windows 中注册的扩展名 (要想获得某扩展名的文件在 Windows 中注册的类型名,请查看 C:\Windows\win.ini 文件的 [mci extensions] 小节。)设置该参数(所以对于 C:\Windows\win.ini 文件的 [mci extensions] 小节中已列的扩展名,不必指定该参数),但如果设备无法根据其扩展名获得文件的类型的话,就必须指定该参数,如果不指定则会提示:“这不是已注册的 mci 设备“,而简单型设备(如 CD 音轨设备,可编程控制的录放像机,可编程控制的镭射影碟机)则不必指定该参数。
如果该命令被成功执行,那么返回值为 0 。至此,您就可以用 alias 指定的别名执行各种各样的 mci 命令了。
(注意:以下命令所能实现的功能虽然很令人激动,但是通常您打开的文件支持的命令没有几个。)
(限于篇幅,每个命令具体的参数与 MCI 设备的支持情况请参照 MSDN 。在此恕不列出。)
(参数中的黑体字表示这是一个 MCI 命令,斜体字表示该单词所表示的是 MCI 参数的变量,必须由开发者指定。)
** Break ** :指定一个键来退出使用 wait 参数的当前 mci 命令。这是一个 MCI 系统命令,所有 MCI 设备都支持这个命令。
on virtual key_ code:_ 指定一个键用来退出含有 wait 参数的命令
off: 使当前 break 键无效
** Capability ** :获得已打开的设备的功能,比如能否播放,能否退出,能否记录等等。所有 MCI 设备都支持这个命令。
can detect length :如果设备能侦测长度则返回 TRUE
can eject :如果设备能弹出则返回 TRUE
can freeze :如果设备支持冻结数据则返回 TRUE
can lock :如果设备支持锁定数据则返回 TRUE
can monitor sources :如果设备能将一个输入源输出到指定的输出源则返回 TRUE ,与当前的输入源无关
can play :如果设备能播放则返回 TRUE
can preroll :如果设备在 cue 命令中支持 preroll 参数则返回 TRUE
can preview :如果设备能向前快放则返回 TRUE
can record :如果设备支持记录则返回 TRUE
can reverse :如果设备能后退则返回 TRUE
can save :如果设备能保存数据则返回 TRUE
can stretch :如果设备能缩放输出的图像则返回 TRUE
can stretch input :如果设备能在数据流解压到帧缓冲的同时能缩放输出的图像则返回 TRUE
can test :如果设备能识别“ test “关键字则返回 TRUE
cav :当与其它项组合使用时,该参数返回申请 CAV 格式时, videodiscs 设备的返回信息,如果没有插入任何 videodiscs 该参数为默认值
clock increment rate :返回外部时钟将每秒钟分为几个单位,如 millisecond 返回 1000 , 0 表示没有支持的外部时钟
clv :当与其它项组合使用时,该参数返回申请 CLV 格式时, videodiscs 设备的返回信息
compound device :设备支持文件名时返回 TRUE
device type :返回设备类型名,其值可以如下:
** cdaudio **
** dat **
** digitalvideo **
** other **
** overlay **
** scanner **
** sequencer **
** vcr **
** videodisc **
** waveaudio **
fast play rate :返回每秒快放的帧数,如果为 0 则不支持快放
has audio :如果设备支持音频则返回 TRUE
has clock :如果设备支持时钟则返回 TRUE
has still :如果设备将文件视为一静态图像比动态视频文件更快则返回 TRUE
has timecode :如果设备支持 timecode 则返回 TRUE
has video :如果设备支持视频则返回 TRUE
inputs :返回输入设备的总数
maximum play rate :返回最快的播放速度,单位为帧每秒
minimum play rate :返回最慢的播放速度,单位为帧每秒
normal play rate :返回正常的播放速度,单位为帧每秒
number of marks :返回最大的遮罩数量, 0 表示不支持遮罩
ouputs :返回输出设备的总数
seek accuracy :返回定位某帧的精确度, 0 表示精确定位, 1 表示与所要定位的帧的误差不大于 1 帧
slow play rate :返回慢放的播放速度,单位为帧每秒
uses files :如果复合设备使用的数据保存在文件中则返回真
uses palettes :如果设备使用调色板则返回真
windows :返回设备支持的可以同时显示的窗口数量
** Capture ** :将帧缓冲的数据拷贝到指定的文件中。 digital-video 支持该命令。
at pathname :指定所捕捉的帧缓冲中的图像所要保存的路径和文件名
at rectangle :指定所捕捉的帧缓冲中的图像区域,默认为 put 命令的 source 参数指定的区域
注意:该命令可能会在播放的时候或者在需要资源的操作中失效。如果帧缓冲在实时地更新,则会暂停。
** Close ** :关闭设备,释放内存。当一个 MCI 设备的所有实例或文件都关闭的时候,该 MCI 设备被卸载。所有设备支持该命令。
注意:如果要关闭所有的设备需如此: close all
** Configure ** :显示一对话框,以设置设备的某些属性。 digital-video 支持该命令。
** Copy ** :将数据拷贝至剪切板。 digital-video 支持该命令。
at rectangle :指定要拷贝的帧缓冲的区域,默认为整个帧缓冲
audio stream stream :指定该命令影响的当前工作组的音频流,如果使用了该参数,又想拷贝视频流,则必须指定“ video stream “参数,默认为 audio stream + video stream
from position :指定开始记录点,默认为当前位置
to position :指定终点,该位置的视音频流不被记录,默认为当前工作组的终点
video stream stream :指定该命令影响的工作组中的视频流,如果使用了该参数,又想拷贝音频流,则必须指定“ audio stream “参数
** Cue ** :在播放或记录之前执行该命令可以加快播放或记录速度。 digital-video , VCR 和 waveform-audio 支持该命令。
from position :指定起始点
input :准备记录。 digital-video 可以省略
noshow :准备播放,但不先显示。
output :准备播放,如果 input 和 output 都没指定,默认为 output
preroll :预滚动到下一位置
reverse :指定为倒放
to position :指定终点
注意:如果设备正在播放、记录或暂停则该命令会失败。使用了“ output ”参数时,再使用“ play ”命令的“ from ”、“ to ”或“ reverse ”参数则会退出该命令,使用了“ input ”参数时,再使用“ record ”命令的“ from ”、“ to ”或“ initialize ”参数会退出该命令。
** Cut ** :将工作区的数据剪切到剪切板。 digital-video 支持该命令。
at rectangle :指定每一帧的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块
audio stream stream :指定该命令影响的当前工作组的指定音频流,如果使用了该参数,又想剪切视频流,则必须指定“ video stream “参数,默认为 audio stream + video stream
from position :指定开始剪切点,默认为当前位置
to position :指定终点,终点并不被剪切,默认为工作组终点
video stream stream :指定该命令影响的当前工作组的指定视频流,如果使用了该参数,又想剪切音频流,则必须指定“ video stream “参数,默认为 audio stream + video stream
注意:在没有调用“ save ”命令前 , 虽然播放的时候好像“ cut ”命令已经成功了 , 但只有当“ save ”命令被调用后该命令所作的删除才会被写入文件
** Delete ** :从已打开的多媒体文件中删除数据段。 digital-video 和 waveform-audio 支持该命令。
at rectangle :指定每帧删除的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块
audio stream stream :指定该命令影响的当前工作组的音频流。如果使用了该参数,又想删除视频流,则必须指定“ video stream “参数,默认为 audio stream + video stream
from position :指定开始位置,默认为当前位置
to position :指定终点,默认为工作组终点
video stream stream :指定该命令影响的当前工作组的视频流,如果使用了该参数,又想删除音频流,则必须指定“ video stream “参数,默认为 audio stream + video stream
注意:在执行任何使用 position 参数的命令前,你可以使用“ set ”命令的“ time format ”参数来设定媒体的时间格式,如毫秒,帧等
** Escape ** :将设备指定的信息传送到某设备。 videodisc 设备支持该命令。
** Freeze ** :终止视频输入或输出,禁止视频流从帧缓冲中获得数据。 dgital-video 、 video-overlay 和 V