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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
3 O2 u4 d6 \, x; K) z% A
7 `, N% ?) b: K& h9 m- EMCI的控制方式:
# Y9 _' P# a- g( }
" I- w7 I& c& N  ?# \# m一般说来,程序员使用两个函数就可以与MCI打交道了:
+ I$ Z/ c1 f: l9 ^: v) Y* `
! N( _2 W! e' N) ]6 RMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
, Y: W2 }: p! g命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
9 Y2 n0 T' i. H+ ]( k1 I  r' K+ v. }4 x+ q4 k9 S0 t
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
3 ~% ^8 ~' R4 Q1 V% q. Y命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
9 i) ^. T" C/ j$ n* ^5 `& Q# W+ ^/ L6 K
; ^+ {/ V; k- P" T; r对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
5 m0 d' Z9 Y) m
- N) L7 j* ^8 }0 N对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。7 y- k8 L6 X7 \4 E
- M  p6 b- u  c9 j* e1 f/ W
举例:
" F* `! {2 o9 _mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
6 U0 S( q% N, x; e/ B0 f& a" {8 z8 `mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
) B+ }/ L: {! C9 Y2 U; ]4 K- k8 z
MCI的设备类型:/ n( b: C. m6 D! [# y- e' p

4 W. o7 O. U# v# T3 W设备描述                    描述字符串      说明
8 W8 K/ v- B+ h' {MCI_ALL_DEVICE_ID                           所有设备
0 L. O6 Q6 ~$ n4 z' }3 B" `MCI_DEVTYPE_ANIMATION       Animation       动画设备# x/ {* p/ |7 ?1 l( K8 x& h5 @0 D, l7 S
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频9 _6 J1 `0 g# v6 b% e  T9 c  _) P
MCI_DEVTYPE_DAT             Dat             数字音频
; d9 |9 P  M: b" K- W. UMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频7 `) V/ z. E2 n7 W5 h
MCI_DEVTYPE_OTHER           Other           未定义设备- l1 C0 t0 ]1 O6 W
MCI_DEVTYPE_OVERLAY         Overlay         重叠视频
, v6 O, a; [" e. DMCI_DEVTYPE_SCANNER         Scanner         扫描仪
6 ?, X, z8 j  [MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
- f; z7 Q0 p# V( c% B& w* SMCI_DEVTYPE_VCR             Vcr             合式录像机' S' E- Y5 J! ^  p; ?5 V3 P1 r  \
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
( B: {' A# g1 ]1 vMCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频" p  E( u# u# `, d

" S; g3 ^1 E) W# J' r! V对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:3 ^! T7 K/ \4 C

( s- J! L/ d1 Q5 Y[mci]3 Q' c; ^& K, m* l- d5 u% \
cdaudio=mcicda.drv
: H. v8 y' ?! M. a# M/ Psequencer=mciseq.drv
3 d9 c6 `; D: F6 T, t$ f8 v2 Gwaveaudio=mciwave.drv
1 ^, ~: ]& N9 q0 w2 Yavivideo=mciavi.drv
; f0 ^9 H4 ?7 Fvideodisc=mcipionr.drv& i& x: k+ `! L2 r5 ~
vcr=mcivisca.drv
" e; M1 q  Z) V+ _1 z& ~5 G$ S7 XActiveMovie=mciqtz.drv
. K" y6 T) P- YQTWVideo=mciqtw.drv8 q9 ~: w$ X6 f6 I' @
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
, ?/ V3 F5 F2 }0 i' g# m3 E# z7 @, o: Y! V4 B
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。+ S) x9 \! |6 u8 a6 P- K3 N
//------------------------------) y/ K1 L& d3 R+ N; |0 h
// 广告时间:
1 _+ @- O& s4 q& W3 t0 d// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com: P4 Q( Q6 _; p6 e- P
//------------------------------
% ]. N: u, }9 i) O" G3 S- P- O: }( Q在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。* P  U; k5 [5 }! q% r3 Q  y9 i5 X8 u
举个例子来说,打开一个多媒体文件有以下三种方式:; d, E, {5 v) N2 V; D2 Z! I
7 J/ ^3 D& ]( e9 y# i" k
[1]:自动识别:打开一个"WAV"文件
, _( ]7 q0 y. F. J# W; G6 y- lMCI_OPEN_PARMS mciOpen;
- z+ D$ k" s+ @mciOpen.lpstrDeviceType = 0;% F/ V4 u( }* U& k
mciOpen.lpstrElementName = "aaa.wav";
( E. [% n9 a. c9 J4 RmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
4 `% A/ @2 s( m4 S" S" I8 d" y5 O  N% ?
[2]:指定设备描述:打开CD播放器/ x3 G" X5 j- m7 N
MCI_OPEN_PARMS mciOpen;
3 ?/ X0 q6 L1 D2 c3 k, @mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;2 d$ ]# g3 _( i# S; H/ ]
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
$ c6 c( K6 v% k& T8 I) f0 s- y& e" [3 D/ c  |& W+ q1 t
[3]:指定描述字符串: 打开一个AVI文件* f  l. T9 M- s. j1 b
MCI_OPEN_PARMS mciOpen;
0 x3 k' Q4 o+ N( D, r; T- fmciOpen.lpstrDeviceType = "avivideo";9 F  s$ U. _( W* I! N; q
mciOpen.lpstrElementName = "aaa.avi";+ l$ `, h  K! N+ y2 q
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
9 }0 m7 P* v( K3 e" K& E& w6 I" W2 ~
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。" ?" c' h  \' _7 y& H

, ~" \0 y2 n! G0 dMCI指令
6 `0 T2 Y( L8 F7 x+ L( f5 Z; w7 c) {, t2 ~$ G6 ?2 c5 K- F5 W$ F/ |
MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"; K* d% H  Y! n5 V) I; S0 V
MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
6 u% U/ G! P3 HMCI_CLOSE        关闭设备9 P/ U/ E% P& w: \5 X
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频
) b6 q! B1 Z7 e8 O% f- }MCI_COPY         拷贝数据至剪贴板4 T8 ~- ?8 m( R: R" `: E; w
MCI_CUE          延时播放或录音# V7 Z. n) \, I
MCI_CUT          删除数据
& G" O7 E  G4 _( l. X2 s7 _( QMCI_DELETE       删除数据% t$ V, T* }$ ^" g9 b8 K$ j
MCI_ESCAPE       仅用于激光视频
. W: Q4 M' U, X. I2 Q5 lMCI_FREEZE       将显示定格, {7 Y8 m* B; r) J6 q
MCI_GETDEVCAPS   获取设备信息
4 ~" N" M+ z* }0 w" ?  B* c1 zMCI_INDEX        当前屏幕显示与否,仅用于VCR设备& a5 n2 d; B! U5 v. Q2 H- h
MCI_INFO         获取字符串信息2 ^- _+ m5 a! F
MCI_LIST         获取输入设备数量,支持数字视频和VCR设备% p' u+ u: P5 l
MCI_LOAD         装入一个文件/ N7 w  E9 k/ _) z! G  j
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
5 U( k- b. e0 }7 D5 J! _4 MMCI_MARK         取消或做一个记号,与MCI_SEEK配套, e6 n/ ~+ \+ J* @; b0 L& b: [
MCI_MONITOR      为数字视频指定报告设备6 e2 {1 Z' z# C8 V. m# W# r
MCI_OPEN         打开设备
3 U  s4 h3 D* N0 U$ uMCI_PASTE        粘帖数据) F( n: b$ W( p, P( o
MCI_PAUSE        暂停当前动作
, X( E9 x. R* ?3 F0 A4 Z2 ~MCI_PLAY         播放
' c7 f# W$ A6 T% R5 }8 B/ LMCI_PUT          设置源、目的和边框矩形: k8 H3 F4 ?/ |3 e" f6 k; W8 c; q! O
MCI_QUALITY      定义设备缺省质量# T; [7 O! [0 a6 T" ^( K( F2 M
MCI_RECORD       开始录制: G9 l- _4 ]/ v7 H& u1 R$ H) |/ w
MCI_RESERVE      分配硬盘空间+ ?2 q* g; h+ z: z
MCI_RESTORE      拷贝一个bmp文件至帧缓冲2 b% p1 S# p$ S4 _
MCI_RESUME       使一个暂停设备重新启动; F6 W' S/ ?1 p6 w! Q
MCI_SAVE         保存数据2 g/ v: Q! ~' F1 O
MCI_SEEK         更改媒体位置. a, ~8 Z. N; R
MCI_SET          设置设备信息
6 ^/ f7 [+ U: E; ]MCI_SETAUDIO     设置音量
0 c* t' Z5 t; }  r3 Z( F% rMCI_SETTIMECODE  启用或取消VCR设备的时间码: {/ S. ?$ _6 v4 H
MCI_SETTUNER     设置VCR设备频道& m/ P8 j) _: \+ O
MCI_SETVIDEO     设置video参数, M9 K6 L: @9 [- z' t! m. z& ]9 _
MCI_SIGNAL       在工作区上设置指定空间  X1 i$ A. {( H0 x* O
MCI_STATUS       获取设备信息2 S- g7 `4 q; E0 R) w4 K3 ]
MCI_STEP         使播放设备跳帧
6 y& N$ v1 G$ ^# q3 j  {MCI_STOP         停止播放
* ]5 N  M  h5 j7 d, @6 A$ x& g* tMCI_SYSINFO      返回MCI设备信息4 U1 u0 i0 z1 m: y, i
MCI_UNDO         取消操作1 F9 l8 G+ O5 B" g
MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
0 e- Y) U; O; S: SMCI_UPDATE       更新显示区域! M2 M7 z; M: B5 S* n) Z/ y
MCI_WHERE        获取设备裁减矩形
* u0 R* s; ~+ C' b7 LMCI_WINDOW       指定图形设备窗口和窗口特性" W9 Z7 c9 r. b9 J4 w
& t; ?8 v5 p) s# T  v- W
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 21:29 , Processed in 0.016240 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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