|
|
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。0 K3 e+ S- G) w1 L
8 }/ u& S; L: v; i! C& k1 GMCI的控制方式:' ^3 L0 E$ O5 j! x
5 H2 }$ O! H p0 I6 _
一般说来,程序员使用两个函数就可以与MCI打交道了:+ p) w$ S9 {. ]0 V
; E, ? D! {& S. JMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
- N' Q @$ p6 {7 p; s命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。5 B) m* x$ B7 C4 ~! u
& A6 w+ L, k* p. ?$ W8 UMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
3 N' I' Q- t6 S6 }" o4 |3 G6 @命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
4 t3 e9 d! R0 S% w. m* j
' X8 e P0 N/ g- j对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。1 v. c/ L4 l6 U1 X* Q1 L$ q
/ } @% m w% ?& A. K' R' f对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。' Y2 c; U/ G3 X1 \' j6 \% Y
* d. i4 i T( X( Q! m* L) Y举例:
c" C5 j' B: d8 t9 m, [6 fmciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备! r+ A9 _* t5 e. h- K2 a) L) F
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
]; `3 E3 D# p/ g& P$ n4 c S! D0 l3 T6 Z
MCI的设备类型:
- c; u1 d: c; k: P6 D! v
+ a0 T- i5 U1 w% b! `; D! t I设备描述 描述字符串 说明( ~3 ^- P: s4 [/ ]
MCI_ALL_DEVICE_ID 所有设备% N6 F( }0 L/ X' M# F3 o# o
MCI_DEVTYPE_ANIMATION Animation 动画设备( v: S. A2 ~0 G9 j0 J/ i$ R+ d+ m/ o6 r
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
3 P4 a* D" u n4 i- c3 r% kMCI_DEVTYPE_DAT Dat 数字音频9 Y$ B6 h Z0 q; v
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频) B/ I, r1 H: ^) e
MCI_DEVTYPE_OTHER Other 未定义设备9 ]1 S$ M. V/ z7 G& E% b0 P
MCI_DEVTYPE_OVERLAY Overlay 重叠视频
$ }- P5 p6 Y5 @! gMCI_DEVTYPE_SCANNER Scanner 扫描仪: r& w1 |% U9 |- E! E
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
' s! i3 \4 ^1 q6 Y# R; LMCI_DEVTYPE_VCR Vcr 合式录像机5 @3 C; U$ A- S, g* p
MCI_DEVTYPE_VIDEODISC Videodisc 激光视盘. n/ S" b2 {% G+ V4 B6 O" M
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频2 n9 _" H' a% s
% v3 \( {5 @' w* p) D- Q对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:/ s7 I7 t9 n# R3 S) r2 X5 H" G) Y
& Z/ m) [9 H) \2 s9 A6 ~7 h; j. f9 K
[mci]
3 p0 i8 r$ y. P1 }cdaudio=mcicda.drv
: i) A0 X& i2 \# U% e2 D3 K1 Tsequencer=mciseq.drv, h0 y3 m2 s, X6 D
waveaudio=mciwave.drv' U- L4 F% p# c7 s; l# v( k
avivideo=mciavi.drv9 a5 S( k0 L3 C
videodisc=mcipionr.drv
; q4 y; Z; m U- zvcr=mcivisca.drv% B" v( x3 f$ s. z
ActiveMovie=mciqtz.drv) G' K6 q! ?. L
QTWVideo=mciqtw.drv$ H4 [ a9 q, E
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
- d* C, Z( o7 E7 q( f; }4 {1 D2 I; f o# K1 y* n
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
% f1 j3 T: Y& @% W/ g, e" v//------------------------------
4 y: G" P$ X8 @+ f8 h H// 广告时间:
/ V6 k, F8 j4 I; |// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com) @7 A0 ~; z) J+ i5 k
//------------------------------& x" q4 w4 s3 q8 T3 s; Q
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。- ?- O& y: W& u, |/ h$ K
举个例子来说,打开一个多媒体文件有以下三种方式:$ R! U9 C5 C0 y$ h
$ \7 m- x5 e, O9 b[1]:自动识别:打开一个"WAV"文件
0 M/ \3 X* Y& T; mMCI_OPEN_PARMS mciOpen;
/ p8 E( i/ l; h. LmciOpen.lpstrDeviceType = 0;8 M( A0 o' j: r7 b' `! m
mciOpen.lpstrElementName = "aaa.wav";6 d7 r2 c9 k4 A
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
4 h# Q' E+ m! ]6 S; c3 e8 W4 r7 j& |0 u5 X6 S9 L
[2]:指定设备描述:打开CD播放器
! S( Z- R7 x. I; PMCI_OPEN_PARMS mciOpen;$ h. h9 V5 |* y; T& k% ?; o+ v
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
+ ?6 M' Y' a, \4 mmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
* U' d' g, U" J) ?/ K
' ~% D5 R% a0 Q6 t6 W[3]:指定描述字符串: 打开一个AVI文件9 D# r1 }: {1 H
MCI_OPEN_PARMS mciOpen;7 {2 [. s ~6 n' \& ^& A; A, t' g# c
mciOpen.lpstrDeviceType = "avivideo";2 @- g$ r, Z/ Q/ d$ ~$ {. J
mciOpen.lpstrElementName = "aaa.avi";
/ g k5 M. s( [) E! j% `1 ^' rmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);$ c: q& k+ B# p% F7 w
6 Z; v D7 k; _7 k3 d4 q- v注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
0 }9 q# i0 b) p/ m. W7 Z1 H) X" m& C
MCI指令 + T% O5 l* K) O1 A# |) M
* ?6 C' V% H- r4 B2 G* F
MCI_BREAK 设置中断键,缺省是”CTRL+BREAK"
# @1 B x/ s/ A: U0 s Z/ i8 jMCI_CAPTURE 抓取当前帧并存入指定文件,仅用于数字视频2 p' K8 \+ {' @; K
MCI_CLOSE 关闭设备$ m/ c L# z& c5 Q' U
MCI_CONFIGURE 弹出配置对话框,仅用于数字视频
" I4 f8 f8 D- j( h S( _MCI_COPY 拷贝数据至剪贴板
2 P& J; X/ f$ ]. X/ mMCI_CUE 延时播放或录音
7 v3 I! ^; S& f: m/ l- JMCI_CUT 删除数据
) v. O" D% ^' ?- A, x; h% z* CMCI_DELETE 删除数据2 H2 C/ P. _& S
MCI_ESCAPE 仅用于激光视频
' B( ]5 b: u" q0 WMCI_FREEZE 将显示定格
8 f0 b) V' b- a# \2 G3 v4 `$ rMCI_GETDEVCAPS 获取设备信息' i! H/ Y$ g- l0 F4 j' @
MCI_INDEX 当前屏幕显示与否,仅用于VCR设备
$ W' u) Z0 ?3 I- m% Y( xMCI_INFO 获取字符串信息2 \: U4 @0 Z+ S) Y7 d& `$ [
MCI_LIST 获取输入设备数量,支持数字视频和VCR设备9 g T* U9 U4 f) Z7 T6 }
MCI_LOAD 装入一个文件
9 l+ k ]" _$ H9 l# wMCI_MARK 取消或做一个记号,与MCI_SEEK配套
8 m! X5 _& h: x! |; h, V# s. y$ NMCI_MARK 取消或做一个记号,与MCI_SEEK配套, D$ C' \& O, O
MCI_MONITOR 为数字视频指定报告设备; e7 ~1 A( _3 m- L5 Y2 k
MCI_OPEN 打开设备
% P% k; f$ h4 [2 |; ]MCI_PASTE 粘帖数据
# o2 z/ h) F- U: {; LMCI_PAUSE 暂停当前动作8 D" a9 S9 }5 e* l
MCI_PLAY 播放
: u) F) r7 b5 hMCI_PUT 设置源、目的和边框矩形6 T5 W* P! {( b- U& O
MCI_QUALITY 定义设备缺省质量+ x" e# ^0 C- L+ |2 Y, Z+ [& G2 d% V
MCI_RECORD 开始录制4 H4 R9 R1 F& {: q& t. D" ]
MCI_RESERVE 分配硬盘空间& F* b: K0 [5 R* }4 J
MCI_RESTORE 拷贝一个bmp文件至帧缓冲0 Z! G, G3 m1 O3 m
MCI_RESUME 使一个暂停设备重新启动' ~! @& T% A. P/ j$ Z) f1 q
MCI_SAVE 保存数据
2 J, g) |. U5 \- P2 f) V4 u2 dMCI_SEEK 更改媒体位置
7 U) c8 j( u/ M) {: T- l, nMCI_SET 设置设备信息/ d* `! R/ U4 |/ ~8 J
MCI_SETAUDIO 设置音量
& F9 w' H; t$ Z4 a7 b# q2 X( iMCI_SETTIMECODE 启用或取消VCR设备的时间码( ^9 U9 C6 J, _& v
MCI_SETTUNER 设置VCR设备频道
9 S% K7 l& O. hMCI_SETVIDEO 设置video参数
* G* ^6 k' |* m! D0 n( a2 RMCI_SIGNAL 在工作区上设置指定空间; J& B) q- B" e1 I' B5 j: c7 y2 y
MCI_STATUS 获取设备信息9 u1 ?8 V# L& ~: u0 M; Q$ T
MCI_STEP 使播放设备跳帧
4 K/ G- K/ c% E' Q5 `, G* K& y% KMCI_STOP 停止播放
6 V& c9 l) k0 c1 Z, R" [* T4 B1 FMCI_SYSINFO 返回MCI设备信息
# ` y7 o# J1 ~9 I3 jMCI_UNDO 取消操作5 ~( y; Y) P0 z6 ^( K- c# e, @' ~
MCI_UNFREEZE 使使用MCI_UNFREEZE的视频缓冲区恢复运动
6 ]: q1 |5 \8 E; S$ h- V+ wMCI_UPDATE 更新显示区域( n2 l: Z% H+ P* B" Z
MCI_WHERE 获取设备裁减矩形
) j- f* z; v/ Y$ ~* ~! qMCI_WINDOW 指定图形设备窗口和窗口特性
# A3 @, Q2 m2 }" ]+ y
. M4 H7 K2 S2 U2 `; y其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。 |
|