|
|
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
6 D5 f, e7 T T. u; q3 W% c9 A$ _( p3 {7 p
MCI的控制方式:$ t! V; I, F+ x6 g" Z' r% I
6 b! Y% t% z; F5 R: u4 F0 I
一般说来,程序员使用两个函数就可以与MCI打交道了:9 r% b( G% p6 U* R% W0 ]. o
/ H+ t9 d, a( f) `MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);! a" ?1 U6 N; Y& {2 m
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
8 x/ w3 v2 _- D, J) f: v0 l8 q* ?; w& e U ] z
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
/ O+ i9 P( O. T0 }! J2 ?0 h命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。, f: m9 f, m' B Y9 {, g4 X% {0 { t' T. x
! h0 d6 }# }: E; L6 r对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
# P I7 S8 [# b* T% W1 j
0 m2 n L$ C6 k; F: c2 d( b4 @. l对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
0 s6 p( f. ~$ V7 d9 V1 n+ b' S9 f# A- E& T* @+ u# F
举例:
3 Z) @) t* s2 ~mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
0 X! u1 I( m( H: J$ amciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
2 I$ k5 [$ A/ P9 U' m; J) }8 O: j% X( F& `
MCI的设备类型:
6 }) ?: {! S% F* M2 _' ]$ n3 Q% j, r! i D: _# A' W- i
设备描述 描述字符串 说明: \( U. U W' F, w- e$ z: M
MCI_ALL_DEVICE_ID 所有设备
) i9 g2 ]( M4 O7 F2 p1 i6 WMCI_DEVTYPE_ANIMATION Animation 动画设备8 d2 n/ v& N' F+ f
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
. r/ ?8 m' Q5 EMCI_DEVTYPE_DAT Dat 数字音频
5 Q; E- `3 o8 oMCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频' _/ l! O2 v. T3 N; v8 H
MCI_DEVTYPE_OTHER Other 未定义设备
4 v8 w2 r+ j0 T* U( fMCI_DEVTYPE_OVERLAY Overlay 重叠视频, [- k6 u$ {$ ~( p3 m3 v- j( ^
MCI_DEVTYPE_SCANNER Scanner 扫描仪
0 E3 t$ u8 k [MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器7 C( e J" O1 @9 N0 H
MCI_DEVTYPE_VCR Vcr 合式录像机2 N) T" e2 R* y" K S& z
MCI_DEVTYPE_VIDEODISC Videodisc 激光视盘. Q% ^+ |. M0 V
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频
# P" Z, l q" l6 A5 T: D2 r3 M% R2 e/ i; g3 y
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:, Z5 F* E g4 ?9 Q, s# w
9 N9 w( L0 Y5 U! A( ]- C" p[mci]
/ Y6 M" J# g# U8 u- acdaudio=mcicda.drv1 |9 I/ }) p; L# a0 ~ R
sequencer=mciseq.drv4 ?+ g5 m7 p+ F1 H: w9 e
waveaudio=mciwave.drv
9 D$ T) K( l% l- P5 ^" b# Savivideo=mciavi.drv& [' I3 I) ?7 ]* O5 G
videodisc=mcipionr.drv
+ Z# @# M0 `+ T0 G/ zvcr=mcivisca.drv2 `9 ]3 L2 P3 t( E% n7 X
ActiveMovie=mciqtz.drv
2 Y* ]6 W: d1 ] u, }QTWVideo=mciqtw.drv' E! f$ c% }1 Q7 k }+ H' A0 E' o, o
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll+ z* K% q; T5 k* _+ t! ~1 x# _
) ~9 r- G8 z; ^* ?# ?其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
5 V: _0 l. T! f' y f3 n//------------------------------" M2 z$ r. \5 S, ] y- u" G H- n
// 广告时间:2 y' s ~, C' E- h- i7 |( S- k# p
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
) }( k4 \( i6 ]//------------------------------/ n C9 ?, I T3 J3 x
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。( M4 x4 I3 s8 P' n) e7 Q( [- D
举个例子来说,打开一个多媒体文件有以下三种方式:
7 S9 p4 f; k2 T" ?
: F# L5 |: t+ Z! r* \% l[1]:自动识别:打开一个"WAV"文件4 }0 i! i8 s! T- q' x' s1 j: Y; o
MCI_OPEN_PARMS mciOpen;
+ T& q K- n5 n! PmciOpen.lpstrDeviceType = 0; k2 Q* v, B8 ]( H9 b
mciOpen.lpstrElementName = "aaa.wav";( t$ X3 h/ s; W$ l6 z9 W; A
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
! y. R3 }. H6 E7 |4 M* Q! J( U/ J5 s
[2]:指定设备描述:打开CD播放器
, h8 O. r4 e7 X* s/ d6 H" r/ i& V5 xMCI_OPEN_PARMS mciOpen;' Y5 E6 x8 _6 p/ _1 L+ h" e# i
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
) R: r4 }& ? ?) j% N8 s0 SmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);$ x. y% l5 a3 S
1 e2 u4 r; [6 ]% l: u1 {7 D
[3]:指定描述字符串: 打开一个AVI文件
% t' P1 c2 e3 q+ D/ bMCI_OPEN_PARMS mciOpen;' k' Q0 T3 a8 L. \, W0 w1 f# w
mciOpen.lpstrDeviceType = "avivideo";1 t! S- I ^5 n
mciOpen.lpstrElementName = "aaa.avi";; Y7 Q: @, @2 V& J. C6 p
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);2 s; n G( N1 w+ E# U$ _+ p$ U. B
, {. \1 Z3 h% T7 m) M( D
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
8 y' z0 }. |4 J; _5 X5 B, G- L/ G% }! E/ P( M! k; A; H
MCI指令 4 T0 ^" y' m9 A# x" H
: ^# z1 O8 S9 B% WMCI_BREAK 设置中断键,缺省是”CTRL+BREAK"
8 ~- b2 e. E: Z$ @6 x! ^& ^MCI_CAPTURE 抓取当前帧并存入指定文件,仅用于数字视频# r2 j$ S. [' v( Z/ C, G6 @
MCI_CLOSE 关闭设备
, q* h0 w+ |7 EMCI_CONFIGURE 弹出配置对话框,仅用于数字视频
b: K+ L) U7 L* ^4 n% N) G2 ~MCI_COPY 拷贝数据至剪贴板
; E0 Y$ o9 G6 }7 i& {- h2 c5 S( oMCI_CUE 延时播放或录音" N) H3 D; k$ B0 x" v; k5 R$ Y
MCI_CUT 删除数据3 M. T! F% U) f$ o. T' Q) X, W1 Y
MCI_DELETE 删除数据
) s- Z# x; \( ?" a; z/ {$ ^0 E5 IMCI_ESCAPE 仅用于激光视频
9 [1 Z' K0 d. ]# cMCI_FREEZE 将显示定格! J. q* [4 C i" O5 `* V
MCI_GETDEVCAPS 获取设备信息2 _9 K+ Z& W: U: u$ \$ i0 N$ l
MCI_INDEX 当前屏幕显示与否,仅用于VCR设备" b* x% r. H' q% g: F* x
MCI_INFO 获取字符串信息- @8 D S4 K3 }8 T3 K3 l
MCI_LIST 获取输入设备数量,支持数字视频和VCR设备
1 R& Y) F+ T4 F- @+ XMCI_LOAD 装入一个文件
5 j% R, j, f% mMCI_MARK 取消或做一个记号,与MCI_SEEK配套
9 S% F7 h1 c. M( l2 m( E% o& LMCI_MARK 取消或做一个记号,与MCI_SEEK配套
* v; r; h5 v# kMCI_MONITOR 为数字视频指定报告设备
( V& i! a( J/ e. V/ zMCI_OPEN 打开设备
" \/ l# V+ R/ @) SMCI_PASTE 粘帖数据, G+ C1 k. l& I; d5 ]
MCI_PAUSE 暂停当前动作0 r1 w" b# R6 S: B. m& ^
MCI_PLAY 播放/ P; k! U3 A# }* R
MCI_PUT 设置源、目的和边框矩形; s6 w/ ?* ~/ r! ]& p I" H
MCI_QUALITY 定义设备缺省质量( K6 d% P% t! l
MCI_RECORD 开始录制+ V# V- h" w2 A) I3 s0 Z1 [6 w
MCI_RESERVE 分配硬盘空间
( b+ J' n# H. _! SMCI_RESTORE 拷贝一个bmp文件至帧缓冲1 l8 w. c4 y4 l- N8 b8 m
MCI_RESUME 使一个暂停设备重新启动& y- ~5 @7 a+ s5 K
MCI_SAVE 保存数据3 ?) S+ w; o+ N# X- f% h
MCI_SEEK 更改媒体位置. R! {1 r) k# X7 `2 r0 R1 V ^7 y9 v
MCI_SET 设置设备信息2 |: n* c% ~# b$ [: K& A* g j
MCI_SETAUDIO 设置音量
' ?/ p, r9 K1 cMCI_SETTIMECODE 启用或取消VCR设备的时间码2 H, @# _' w& p) O& k; B
MCI_SETTUNER 设置VCR设备频道
9 N$ l: E, \# C( p8 i! Q: l& z! jMCI_SETVIDEO 设置video参数& O$ d* E: u1 `
MCI_SIGNAL 在工作区上设置指定空间
# B: i9 t. _( `9 R: v; g5 }0 X4 xMCI_STATUS 获取设备信息1 }! g: n' W' v6 ~# O/ I$ r
MCI_STEP 使播放设备跳帧. H/ V5 ^0 r9 w4 u# p
MCI_STOP 停止播放
0 Z. O' W9 }$ N6 r. y& `* eMCI_SYSINFO 返回MCI设备信息2 p# b- ~3 S& {/ \0 O" r/ N
MCI_UNDO 取消操作
* C0 N! I6 ?4 H& k+ L1 v5 \. U/ {MCI_UNFREEZE 使使用MCI_UNFREEZE的视频缓冲区恢复运动
r* e! L- @7 _1 x& w6 ~$ SMCI_UPDATE 更新显示区域- Z4 [5 f& j' G4 t5 i
MCI_WHERE 获取设备裁减矩形; J' }) r' g$ A9 r5 O! @% U2 A" N
MCI_WINDOW 指定图形设备窗口和窗口特性; o- y9 A, j0 P- C, s d
% m( `' z2 h/ v' |; V其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。 |
|