|
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。9 Y; E; |- y8 S# v
$ {1 n! R3 X% N' l A; K
MCI的控制方式:* N, b% R2 e$ [5 y. b2 \# D4 q
! F4 a0 m ?7 J% e( {1 E3 x6 \
一般说来,程序员使用两个函数就可以与MCI打交道了:
. o; Y& ` `8 h7 R5 b( g- u1 p% P5 }# B9 K
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);; `# H, y+ G& ]
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
0 a9 O" s: l0 U/ ?0 ?# C5 ^* C; ]1 d. d8 V0 K0 v: H7 ^
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);& j+ K3 `1 l6 X4 W* g7 T1 p
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
: q% w% \6 [+ A* C3 y
0 u# {% y( M$ m! I$ G对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。1 {7 t( q( D# E& K
2 `; T. g9 y4 m* W$ K" r3 J对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
) N7 |4 J( M+ z, k' {5 W8 y7 c8 H, Y# E: o5 V
举例:
) t( T2 Y0 C, c$ g& i. L7 }mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
" J4 x* K9 t4 {* _0 \! xmciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
- g1 D4 S0 z) f e
! N$ |" P, n' k- sMCI的设备类型:+ \1 A2 \1 x1 c. }) R/ L8 B
0 K: U3 S; t1 c- Q) t* S% D* B设备描述 描述字符串 说明
) A/ g9 x: T- X& JMCI_ALL_DEVICE_ID 所有设备
* N, o d9 s* k. T+ {MCI_DEVTYPE_ANIMATION Animation 动画设备' {$ W# u8 W. i d& g0 d
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
+ m$ X* k. w/ l$ B/ J: b5 N9 TMCI_DEVTYPE_DAT Dat 数字音频. F8 h4 E; p0 M9 }4 f7 E! m
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频
q% E! b* w2 V1 D$ ~MCI_DEVTYPE_OTHER Other 未定义设备
0 T. l4 K7 C8 T1 d) gMCI_DEVTYPE_OVERLAY Overlay 重叠视频2 v1 Q7 f7 a; @1 E$ |
MCI_DEVTYPE_SCANNER Scanner 扫描仪
9 ~: H! y/ l( m4 s1 e& ~MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
/ ?& A( i z8 X+ b* ^MCI_DEVTYPE_VCR Vcr 合式录像机( M# Q: C5 o7 ~3 o
MCI_DEVTYPE_VIDEODISC Videodisc 激光视盘. J {7 I& j/ U7 e5 @$ e2 j/ g
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频# Y% N. F0 [' A& G9 q
3 D4 w, h/ Z: a' E对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
9 A+ }+ c/ ^( B( {* i! O: L7 ?: I: x! M6 Z9 r: ^% L
[mci]. G' A W! C" p9 w" D1 O
cdaudio=mcicda.drv9 I# t9 Q$ r- K$ _
sequencer=mciseq.drv' s: f& i5 w6 m. m
waveaudio=mciwave.drv- U' [! P) `/ D) X8 R) }" Y: Q
avivideo=mciavi.drv2 I* s. H7 p; \6 }# |: R6 }
videodisc=mcipionr.drv+ E5 B$ [1 d% y" }; R. z" |* j
vcr=mcivisca.drv0 a) | [ k- u: Q$ _# x1 v# _
ActiveMovie=mciqtz.drv5 O) g1 }, r6 A$ R/ p1 T
QTWVideo=mciqtw.drv
4 d# Q' _+ `( A: d5 NMPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll ?) N5 ?1 D% r: ~+ f3 E1 O" ]
$ x, H1 C3 k- a6 K, |- @- n其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。8 w0 p: w: r( \# U H' I( e/ A
//------------------------------6 h- t% o" N D9 m9 k9 c/ s6 F
// 广告时间:
) [" N7 c! f1 A# j, j9 [* J* a// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
- p% G6 V: F3 f. @8 u% T1 ~& r& {//------------------------------
* M' G! d4 }' ?' ~) q! m3 ~在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。3 m% v5 ^+ w/ Y, b& n p
举个例子来说,打开一个多媒体文件有以下三种方式:
# g' B6 P8 n. Z5 m1 l. t, Y& ?1 `: U P$ y3 A4 N. D; A
[1]:自动识别:打开一个"WAV"文件
$ w2 |7 W9 p# B/ E {' TMCI_OPEN_PARMS mciOpen;" F/ K( j8 t e2 S
mciOpen.lpstrDeviceType = 0;, H( d8 M. f, A+ F* j
mciOpen.lpstrElementName = "aaa.wav";( g1 a% C( Z) m) X5 [. M5 d
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);( K4 S$ [4 V4 A) h- n
6 O$ d2 E& S8 y$ `- i8 L* K* x[2]:指定设备描述:打开CD播放器
% L$ l$ O: I4 w# WMCI_OPEN_PARMS mciOpen;5 Y# h P" J* F, H, a7 T- I* H6 N8 p
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
3 {! n- N! k3 o) Z5 \( M+ e4 G1 WmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
4 T# L# T2 _( V& j0 X- g9 H' U3 h0 g& f, V
[3]:指定描述字符串: 打开一个AVI文件. [! \( C$ v4 p; @; B
MCI_OPEN_PARMS mciOpen;# Y0 B) U* f9 a( P P: S
mciOpen.lpstrDeviceType = "avivideo";& y* g! h9 @4 c% @) m; a
mciOpen.lpstrElementName = "aaa.avi";2 x* J, d8 N7 ^* Y: A: z3 A
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
5 g% W4 Y: i m9 V7 r6 L- P M# @& y# a! q8 S. u1 {
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
5 t# \2 O- [$ h/ ?& D; P( ]0 p0 w5 Y1 g9 r& \) E: w
MCI指令 " c) F) U( L- W) x h
, N6 v/ U! |+ V( s4 S
MCI_BREAK 设置中断键,缺省是”CTRL+BREAK"
$ h, ?/ w2 n1 W1 `" T# K: S' N" `MCI_CAPTURE 抓取当前帧并存入指定文件,仅用于数字视频
; Y. p5 Z9 G2 f; u) Q0 d8 KMCI_CLOSE 关闭设备 k$ D, p8 p4 w7 A- C1 ^* \/ k1 j0 ~
MCI_CONFIGURE 弹出配置对话框,仅用于数字视频
9 ^- w# D+ c$ G# Z$ `3 fMCI_COPY 拷贝数据至剪贴板9 {, X7 p. V' i, d& E) t; o
MCI_CUE 延时播放或录音( R5 |. i- s, a/ D
MCI_CUT 删除数据
4 q3 p* D" i* U8 n1 VMCI_DELETE 删除数据% @* x. {5 _ l. S" n4 ^' l7 ]
MCI_ESCAPE 仅用于激光视频: F5 f2 y+ |; g+ w) G6 |1 t# U
MCI_FREEZE 将显示定格
( C. y, v% M PMCI_GETDEVCAPS 获取设备信息6 P; U0 _) ~% X# [& {/ Q( j. V
MCI_INDEX 当前屏幕显示与否,仅用于VCR设备) _! @. O$ v7 p" F# `
MCI_INFO 获取字符串信息
7 x& I/ Y# b0 P3 x% L4 RMCI_LIST 获取输入设备数量,支持数字视频和VCR设备+ X d) S1 v0 D0 \4 R4 Q4 ^- E; x
MCI_LOAD 装入一个文件
/ @, J3 v6 H |9 Y! ^$ xMCI_MARK 取消或做一个记号,与MCI_SEEK配套
5 _1 }- \; o: H! sMCI_MARK 取消或做一个记号,与MCI_SEEK配套: V- ?5 @$ a( y6 A
MCI_MONITOR 为数字视频指定报告设备
8 L( z* B8 |3 E! Y+ CMCI_OPEN 打开设备
5 a) b3 ]- H4 ?; R& P4 UMCI_PASTE 粘帖数据
& @ |+ o( x( v3 T2 ?: aMCI_PAUSE 暂停当前动作. H$ Y1 K! t# D7 m' O8 ~4 k; ?- E3 T
MCI_PLAY 播放) w2 a& j% r( e4 w
MCI_PUT 设置源、目的和边框矩形
. S, [5 v8 \- @/ \' _6 LMCI_QUALITY 定义设备缺省质量( a: G3 l U- P
MCI_RECORD 开始录制
4 j B! @1 f1 ~. M' q& {1 w9 aMCI_RESERVE 分配硬盘空间
5 E9 N; v# X9 g. j) t$ q) s6 j6 WMCI_RESTORE 拷贝一个bmp文件至帧缓冲
. ~0 O5 H7 O! oMCI_RESUME 使一个暂停设备重新启动
0 d* l# l6 n( g: GMCI_SAVE 保存数据
4 H, ]8 k! Q8 H0 O0 X9 ZMCI_SEEK 更改媒体位置9 |+ U* f7 ?4 M8 t0 s
MCI_SET 设置设备信息' N6 q' d' W* a8 t/ m8 P5 Y
MCI_SETAUDIO 设置音量
$ Z# }, I( \6 I) t+ BMCI_SETTIMECODE 启用或取消VCR设备的时间码
7 v `, `7 _% _# }: zMCI_SETTUNER 设置VCR设备频道* `9 O1 v+ e1 O E1 X
MCI_SETVIDEO 设置video参数
1 P3 Y& ~- j8 q) W( L$ bMCI_SIGNAL 在工作区上设置指定空间
( F+ a, ~/ N9 n! n7 |6 kMCI_STATUS 获取设备信息+ o0 @) N& X8 G
MCI_STEP 使播放设备跳帧
! I& e! p0 ~) i2 n5 wMCI_STOP 停止播放, y, D* S7 r; C q4 C, x4 n
MCI_SYSINFO 返回MCI设备信息$ J/ M' g$ Y6 x5 n# _- k3 D: G
MCI_UNDO 取消操作
; x6 b9 `+ l. |* U: BMCI_UNFREEZE 使使用MCI_UNFREEZE的视频缓冲区恢复运动* E- X: W6 D% g2 Z+ D1 f
MCI_UPDATE 更新显示区域
6 d+ {: B) _; Y& k$ AMCI_WHERE 获取设备裁减矩形
7 {+ ?" |5 d+ I9 v9 [" S' b+ N1 aMCI_WINDOW 指定图形设备窗口和窗口特性
# V8 i* _: |0 g, t) f% E1 l/ \, I! U
3 Z' U2 e7 h# |- g2 A, N8 K8 x其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。 |
|