|
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。& ]( p, Q! E1 G e. ]1 ~: N0 z4 a
, l7 s, s3 W- Q x5 U
MCI的控制方式:7 v' M0 p! k6 O3 N' ^ ~- [8 Z
3 c/ M( `0 Z; X$ Z I# ]* o" \8 m7 H, Z
一般说来,程序员使用两个函数就可以与MCI打交道了:- }& _+ b I: Y2 [( q! p F- j
" F( P9 [6 l1 O2 W$ j6 ^MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
4 y6 [4 k7 v1 Y5 n命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
7 P2 [% a; E3 @! J( U3 }+ c# b: y) Z' g8 k# c8 a
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
; k2 w* O6 {$ ?4 G$ f* a+ C命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
/ s& y" Z; \: h7 p" y3 D
- ?; d0 a' {: L对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。9 D0 c7 n% P) T: p% }
2 b" p8 I2 C) Z) s# ~对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。/ [# {& l6 I/ J4 M* q
1 N: U5 n6 @ b5 O$ k A9 R3 Z举例:, Y3 s# c: ~" D, \' ~- {9 o! t
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备" `6 p/ C j. Y9 |) H/ [
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi") D$ [) M, K8 o+ _9 m
. C8 M" ?. s/ p) H
MCI的设备类型:
- d% y3 _! i* R- V
: R' q( C+ u9 D3 X$ O& o设备描述 描述字符串 说明* V- V" J0 G0 {$ Y [
MCI_ALL_DEVICE_ID 所有设备+ r5 B9 a4 N6 l# A' R* }/ U
MCI_DEVTYPE_ANIMATION Animation 动画设备. g9 @* Q8 U5 q5 G/ j2 \$ K1 W: Q
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
8 Y6 \9 f2 B9 o! ^& J5 tMCI_DEVTYPE_DAT Dat 数字音频
' h5 @( i2 ?% _MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频
, i6 f J7 E4 U5 S5 L( Y% NMCI_DEVTYPE_OTHER Other 未定义设备& \+ g) v$ j! r1 N' e' z V( o
MCI_DEVTYPE_OVERLAY Overlay 重叠视频
5 M" Y7 B' v ]; k: p8 O( UMCI_DEVTYPE_SCANNER Scanner 扫描仪
' _2 B6 p1 B$ g8 LMCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器! Y% J/ v2 R3 @
MCI_DEVTYPE_VCR Vcr 合式录像机 v' M$ S6 X4 p$ Z k4 P- m: x
MCI_DEVTYPE_VIDEODISC Videodisc 激光视盘
, u9 c2 h! S& [8 T/ J' [( i. D! {MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频
8 @0 H* O* _8 U' j% `3 ?! k. y. P. d# a @- z) }% l* ~6 r
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:1 G+ g4 R4 n: q3 J( b
8 V( y: h0 I" R& y8 I( ?
[mci]
. v" Y2 b- e: x- L/ \6 k7 ocdaudio=mcicda.drv
2 R3 d, A! V* z4 xsequencer=mciseq.drv" n$ O$ y5 V/ l3 F' }4 ~
waveaudio=mciwave.drv
0 I$ I. r6 U2 R* oavivideo=mciavi.drv
% r( `9 {" _' F5 |4 j/ S) Kvideodisc=mcipionr.drv
$ [6 J* ^+ D ?" U' z- ^/ ivcr=mcivisca.drv
' r4 k& i$ Z- @. w3 }: }* jActiveMovie=mciqtz.drv1 U' [) P1 T9 p' _8 V& d8 O3 C
QTWVideo=mciqtw.drv/ ~4 w$ z% c+ I5 p# @3 P
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
7 @ q/ J W+ Z% M/ n& c2 s$ `; M- _0 F7 r
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
" b3 ?; p% o' S//------------------------------
+ `( O" g8 t4 y1 d( C( W// 广告时间:4 C1 J8 k+ X) q1 B
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com V7 K0 d5 E# K: I2 v8 }
//------------------------------
: ^" L$ J% u3 J在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。" t* n: u. w. y' X% z$ K. @: F, i+ [
举个例子来说,打开一个多媒体文件有以下三种方式:* t( z0 [) m" a
2 ^" P# I \$ e5 u[1]:自动识别:打开一个"WAV"文件2 B2 p8 u. E& `% S% F
MCI_OPEN_PARMS mciOpen;, L( @& Y3 l7 [
mciOpen.lpstrDeviceType = 0;
i9 U2 W8 _& l' {7 @+ H9 KmciOpen.lpstrElementName = "aaa.wav";5 q4 R+ F/ u' X X! s# P0 L6 \& T% E
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
# z* d8 ?* H9 U3 `
5 h, {- q- j+ g1 W+ ]5 L[2]:指定设备描述:打开CD播放器% j2 |) [; h* C7 O# Q) E5 q' r
MCI_OPEN_PARMS mciOpen;8 x! U0 l; \& Y5 a$ J4 ~ _! E" s" a
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
0 i D8 v' j# J5 G! JmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);) n$ N) V1 @4 K
0 [! k; X- q0 u8 e3 I( B& B9 K; U
[3]:指定描述字符串: 打开一个AVI文件
! |, ]$ b) u; B0 N) ?* H! {" tMCI_OPEN_PARMS mciOpen;# m4 v# M7 E3 m2 o! j. _% c9 o9 ^
mciOpen.lpstrDeviceType = "avivideo";
" i$ w V. P- r- ~mciOpen.lpstrElementName = "aaa.avi";
8 @ o* v: u- Y1 T8 w; A; bmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
% v1 h0 B% k$ T. ]% m, L( ]0 @* ]3 R
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。' |. I2 O9 i# v) t- _7 l
0 _. P; [: {2 R' ]% _/ EMCI指令
0 l$ M2 L2 t2 a" O L2 C6 D" k3 g5 S/ Y
MCI_BREAK 设置中断键,缺省是”CTRL+BREAK"
. n0 v% H5 A8 IMCI_CAPTURE 抓取当前帧并存入指定文件,仅用于数字视频
1 n0 s* L$ `9 }# c- K, r$ OMCI_CLOSE 关闭设备) d5 j3 h+ ]* B' Q' G
MCI_CONFIGURE 弹出配置对话框,仅用于数字视频
8 A4 ~5 C; ~. j Q( ^$ m4 R6 q: nMCI_COPY 拷贝数据至剪贴板& P/ c. h) r$ g! Q
MCI_CUE 延时播放或录音
8 N+ P3 [$ K+ A0 MMCI_CUT 删除数据
, y) t1 c. l' x* c% C; c* H/ ZMCI_DELETE 删除数据
3 R$ _3 F4 D8 [% F; X7 v" r5 Y# pMCI_ESCAPE 仅用于激光视频; _) o2 x; Z( L0 w4 C
MCI_FREEZE 将显示定格
7 g8 r; c5 L. ]7 FMCI_GETDEVCAPS 获取设备信息
+ I4 [# }6 G, V. y; eMCI_INDEX 当前屏幕显示与否,仅用于VCR设备
3 _% b- m# N2 X! z/ }# eMCI_INFO 获取字符串信息
7 O9 P- v! u- f! @MCI_LIST 获取输入设备数量,支持数字视频和VCR设备, h% L, y6 D& r* F; y) A( c
MCI_LOAD 装入一个文件6 O% ?( S: G# o0 _8 c& B
MCI_MARK 取消或做一个记号,与MCI_SEEK配套
' S1 n! Z1 C/ c# i5 WMCI_MARK 取消或做一个记号,与MCI_SEEK配套. b5 s8 f; z$ D: q9 W" M a% x
MCI_MONITOR 为数字视频指定报告设备
' j! Z- N: f. r5 e2 C& O1 r+ UMCI_OPEN 打开设备
; K0 {6 p/ A) N* n( h0 UMCI_PASTE 粘帖数据
- b: C4 Q, T! _) y _1 N/ kMCI_PAUSE 暂停当前动作& m+ U" z- {- O; `# `. X2 f
MCI_PLAY 播放
P+ k+ u8 V& L' t, g- k: M% ~MCI_PUT 设置源、目的和边框矩形3 k/ v8 c0 x& E2 N
MCI_QUALITY 定义设备缺省质量
* f0 j6 Y* O- d p" d* o/ ?MCI_RECORD 开始录制& N5 y: P& H3 W" g! j( |
MCI_RESERVE 分配硬盘空间) A' d- }* K% M9 F' g; D5 p" u
MCI_RESTORE 拷贝一个bmp文件至帧缓冲' g: ^! V2 } g* A5 Y6 ]% G- U1 _
MCI_RESUME 使一个暂停设备重新启动( |" Z9 U |+ V2 _: h
MCI_SAVE 保存数据
/ l2 U e# f8 A( i& wMCI_SEEK 更改媒体位置9 m4 l2 x% g6 y+ ?3 y7 g" N
MCI_SET 设置设备信息
! k! P, _8 g1 J0 u$ Z" _, x7 I5 Y1 gMCI_SETAUDIO 设置音量+ z1 U* t+ Z( _& R* K
MCI_SETTIMECODE 启用或取消VCR设备的时间码6 }+ {$ e7 ]* W9 C) q+ f2 Q
MCI_SETTUNER 设置VCR设备频道
# n' c* q0 N. y( A# o# gMCI_SETVIDEO 设置video参数4 N4 p- h i5 A8 m( d6 k
MCI_SIGNAL 在工作区上设置指定空间
) {9 W4 t% r0 _5 o& C% M; AMCI_STATUS 获取设备信息4 m4 |4 d2 j5 S- g
MCI_STEP 使播放设备跳帧8 t1 s n- r# `! h8 s
MCI_STOP 停止播放2 P Y' g. Z$ w
MCI_SYSINFO 返回MCI设备信息
! k P; C- \; |7 dMCI_UNDO 取消操作
. v3 [ B6 p5 Q+ IMCI_UNFREEZE 使使用MCI_UNFREEZE的视频缓冲区恢复运动# {+ @* @$ s# j, X+ ^( Z
MCI_UPDATE 更新显示区域3 a6 a2 P3 l& Q6 B: @
MCI_WHERE 获取设备裁减矩形
/ M+ c( ?! a3 u2 FMCI_WINDOW 指定图形设备窗口和窗口特性9 h- H& _1 }( i, S( W& `; y; P
6 s- ?9 r9 ?% m* I& }8 y7 p! ?其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。 |
|