找回密码
 注册
搜索
查看: 4635|回复: 0

MCI(媒体控制接口)相关知识

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。- `' j) J" e& K9 y+ W
9 t, c& L! O9 h  a( W
MCI的控制方式:9 Z- X! c" S; j/ H& a1 a% w
2 t7 g4 [$ o2 ]& d' |
一般说来,程序员使用两个函数就可以与MCI打交道了:. k4 i* b% |, x% g
) q6 B. v" m! H. L
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);+ j7 r6 W( z( f
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。; \6 u+ t( s9 n% g. a" I

7 Z' |5 U: u" E, K1 ZMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);' ?& y# o/ m+ h) T- z$ W& H
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
  ?) f7 X! p1 e  d& G; w  M4 u% j8 r# T* k
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。) @) ^* L* ~6 T$ c6 z; i* W

8 i  h5 B+ m- y  O8 b* _7 q对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
4 c! J6 P5 ]8 a! }, k
* M- K  E& G; R9 F4 v+ i& p举例:" U0 v9 d3 h, E' `0 t1 N
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备1 m7 `9 w4 R$ h  v& j) F
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"% w( q6 x/ @1 o# F0 g' ^% F

8 \# G: p( [  L1 OMCI的设备类型:
9 y* [% |( p& b# u" r9 D; G$ m- A$ ^4 @5 e( c
设备描述                    描述字符串      说明
  ]* i: W1 r. X, j4 i# _* SMCI_ALL_DEVICE_ID                           所有设备/ z* Q! c8 _: M1 _
MCI_DEVTYPE_ANIMATION       Animation       动画设备
+ G( b8 {0 g( `5 TMCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频! ?3 V. @6 j$ J$ l4 x! I+ q" a
MCI_DEVTYPE_DAT             Dat             数字音频
* G2 z  W8 P5 k. HMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频
1 w, t( {, j7 H% Z3 J# {MCI_DEVTYPE_OTHER           Other           未定义设备
" ~( G2 r4 t* r: @1 I, m, j3 uMCI_DEVTYPE_OVERLAY         Overlay         重叠视频: ~6 ]" a* T; `1 d% N7 a
MCI_DEVTYPE_SCANNER         Scanner         扫描仪
! [3 P" U- R1 N# N. ~6 Y. o' I5 dMCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
5 P- |/ Q: o& ~1 t7 A. S7 FMCI_DEVTYPE_VCR             Vcr             合式录像机8 c' ?+ ~$ c4 E+ \
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
; m/ Z0 C2 X  O( i" O8 DMCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
& e. B. i- }1 [% J& \9 k. U1 h1 s% S! c: `8 i5 h* h, E5 P* C
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:+ v; L, R8 U* e) F

* h: o; e5 f& ?, B2 ?" ~  l/ g5 {[mci]5 p2 S# w% k5 M! H* q* F+ [( N7 I
cdaudio=mcicda.drv, |& ]/ x% x/ m# j" i2 z
sequencer=mciseq.drv
3 p. E9 m3 c$ M# x2 U; e& Ewaveaudio=mciwave.drv" c, r2 e1 Z3 g8 `" A* k. W" E
avivideo=mciavi.drv
# v$ `( m/ i$ j) W2 [% {videodisc=mcipionr.drv
% F/ \6 U& w4 h; W3 J5 n" G7 G$ ovcr=mcivisca.drv
% |, {3 t& d( \( a9 N" `ActiveMovie=mciqtz.drv$ @4 {  u, V5 e8 B% B
QTWVideo=mciqtw.drv; v6 ^7 p% D. _1 H3 Y( p4 [! ], U) h
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
* o; ^1 \+ q) Q( G( `" {) ?) a  R8 d6 c# G  l" K* Y
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
6 G  m; F+ G6 }6 x- L9 T' u/ b5 _//------------------------------
7 G) m4 M/ P; H0 u4 [; i3 {6 E! N// 广告时间:
4 E; q! v& W9 D. J8 f3 H// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com% y, ]: P- z# ^3 N# B( F3 e
//------------------------------
8 u! E4 c# ~* @" f在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。) l' b2 E2 [7 B! w; Y7 Q
举个例子来说,打开一个多媒体文件有以下三种方式:
4 G  U- V* I1 r! {, d9 x
3 ^( l* C/ J2 ], Q. i[1]:自动识别:打开一个"WAV"文件: g9 z3 s( n0 d" }
MCI_OPEN_PARMS mciOpen;
) y! R8 U7 r. c7 u5 WmciOpen.lpstrDeviceType = 0;8 h" q% M3 I) V( L
mciOpen.lpstrElementName = "aaa.wav";. E' F. g; B& a% P$ U! ]
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);8 S! y5 Z4 l3 n
- Q6 I$ v& N- O) [9 L
[2]:指定设备描述:打开CD播放器% D* H! c+ R9 ]2 I- T/ h
MCI_OPEN_PARMS mciOpen;
- ]& i8 W3 r" |) O, HmciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;2 w2 ~1 C+ m$ a2 P; e: c4 X
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);4 V1 r- o1 s) R6 k1 s. Q- G  u& \
8 Z' u+ m" x+ _6 F6 g& d7 a
[3]:指定描述字符串: 打开一个AVI文件
7 |5 B3 Z/ J7 ]% y  CMCI_OPEN_PARMS mciOpen;9 Q0 |# K" L, R  K+ H/ M6 z
mciOpen.lpstrDeviceType = "avivideo";& }3 n6 i$ C1 q
mciOpen.lpstrElementName = "aaa.avi";" `5 {2 G9 W( n/ J! _9 C
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
* Z# A) [1 y7 A0 U* z' r. Z( }, b. [. d) N! s& h2 A! S( g
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
2 T, D4 T' A' j  |) ]# h- r0 N- j% v7 x2 S. J4 T, G
MCI指令
! ]3 d" m6 L2 c0 P) ~& K1 `' D% T4 f& Y  H1 t+ Y
MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
$ m/ X& s4 l: L% ?3 Q+ zMCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
/ }. O- ~. @8 _* l4 @7 X9 \+ I7 }MCI_CLOSE        关闭设备4 ]( F7 v8 `9 ]1 {* }/ F( ?4 b" M" e
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频/ |3 C5 p7 V2 C. n
MCI_COPY         拷贝数据至剪贴板
0 y/ K4 l) g9 a* pMCI_CUE          延时播放或录音( r8 e9 H9 s+ b, \; t8 J; ^
MCI_CUT          删除数据- O4 Q- g" L, f: f, f7 N$ }* {. J
MCI_DELETE       删除数据
6 A$ s' N; h" u7 Y+ C* NMCI_ESCAPE       仅用于激光视频+ R9 L9 o8 s5 S, N1 U; {) r% ~
MCI_FREEZE       将显示定格
% z. @& e' @5 n3 wMCI_GETDEVCAPS   获取设备信息, y2 _2 `/ l4 T' z, V7 w( o, @
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备
1 s1 D- J- d% `8 zMCI_INFO         获取字符串信息
3 R$ ~6 F9 T/ D& K; M0 {& KMCI_LIST         获取输入设备数量,支持数字视频和VCR设备2 |9 W: ~! E; Y
MCI_LOAD         装入一个文件0 }$ O1 a3 _4 Z0 S8 d$ s: W  r
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
  G0 z) `: v6 \/ F" p, yMCI_MARK         取消或做一个记号,与MCI_SEEK配套$ o" p+ N* e7 E, E
MCI_MONITOR      为数字视频指定报告设备
4 a0 X" T8 W* ?$ h3 |, H- ^MCI_OPEN         打开设备# E8 `/ x' H" t' W# ?. h
MCI_PASTE        粘帖数据" s0 s; |$ y& Y1 O7 H
MCI_PAUSE        暂停当前动作6 g& W: z" e: G0 A. D2 ]" b
MCI_PLAY         播放
+ ?1 u* {+ \  o4 l8 b6 W; pMCI_PUT          设置源、目的和边框矩形
1 C* c0 c3 o( X, s/ N9 s* w4 {3 [MCI_QUALITY      定义设备缺省质量
9 B! N9 B/ L/ ~; {( n$ zMCI_RECORD       开始录制
" S( D3 C3 C5 {1 T" uMCI_RESERVE      分配硬盘空间! W' N* ^8 I. p" |
MCI_RESTORE      拷贝一个bmp文件至帧缓冲
# u" _- S) ?. E6 J8 I  tMCI_RESUME       使一个暂停设备重新启动; r( _# D# F/ `6 |
MCI_SAVE         保存数据$ f) M. v3 n/ g* L! f6 C  i4 ?
MCI_SEEK         更改媒体位置
8 Y! b+ m3 C- p% N5 UMCI_SET          设置设备信息  Z" t* L  Y5 [4 s# k3 |' g
MCI_SETAUDIO     设置音量. \' C0 f; _- Y' Y' t8 T
MCI_SETTIMECODE  启用或取消VCR设备的时间码$ m" \# t5 M0 ~1 k1 O
MCI_SETTUNER     设置VCR设备频道8 r) \7 h7 R, C: a2 Z9 w
MCI_SETVIDEO     设置video参数  O7 ?; \4 R/ l& {; w& v7 ]
MCI_SIGNAL       在工作区上设置指定空间
* H0 l! v) j5 w; c5 P- [% z& V4 _MCI_STATUS       获取设备信息
3 h0 ?+ k9 h$ SMCI_STEP         使播放设备跳帧
: y7 y  j2 }  @  y+ t* x( WMCI_STOP         停止播放
7 r3 ~& r. D8 T1 o* X; E/ qMCI_SYSINFO      返回MCI设备信息3 i0 N/ c' N+ N8 g
MCI_UNDO         取消操作+ J4 ], @8 q! V
MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
+ p2 r) Y4 M' y- ZMCI_UPDATE       更新显示区域0 I3 p$ ^* c& c, h& P
MCI_WHERE        获取设备裁减矩形# w3 F9 w0 v0 D4 i  b4 e9 I) d
MCI_WINDOW       指定图形设备窗口和窗口特性
3 ?. a! _+ a5 ]0 w8 M3 r* H) m8 o) e5 U) x* R
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-5-2 08:58 , Processed in 0.021696 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表