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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。; h& W0 P( d5 G  c( s9 m% J
2 m3 W" G; \* ?, p3 n( @6 @' X
MCI的控制方式:" h+ \. t* P# k1 J& [6 J

' {; H* k6 F/ ^8 C' t; d. |) V" A& _一般说来,程序员使用两个函数就可以与MCI打交道了:, L- N  z* T& Z

+ n4 i$ X( T/ R# R0 w# ~  dMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
$ c4 [+ s/ g% I# }: [5 I命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。* F4 l; U6 X2 ?
0 V. Z. w2 ]: j+ M/ G$ u7 T* [
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
+ ~  r2 v3 V- _1 [  E1 a命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。8 I$ m# K# w6 [. T  V
1 F. i1 A- |. d# I3 T/ c8 [' j  i
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
9 ^  v8 z1 h& W
$ O. a& o6 P/ g% H对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。5 D- k6 g& u5 d% d, x, {
: w+ x. n, J$ R4 ~3 }( N* O! S
举例:6 Q. p2 }& g! [, g  U0 C7 W) U
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备* }1 b7 Z' d3 S1 e/ l, }
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"3 j+ k5 @& M0 ^6 S7 z! N
5 Z) f, x, u% W  D
MCI的设备类型:; m% N0 d2 ^9 e7 v5 b
0 D* }3 ?3 a( w& s# f
设备描述                    描述字符串      说明
" {  m' M1 I' r0 f5 p( |MCI_ALL_DEVICE_ID                           所有设备
3 C0 |+ M0 G6 a5 H9 r& c. TMCI_DEVTYPE_ANIMATION       Animation       动画设备6 l, {; G9 D; h0 ], V- R9 G/ P
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频  K  e& ?7 n: J8 U4 x
MCI_DEVTYPE_DAT             Dat             数字音频
: W9 M0 z  r( x0 N9 N+ E4 IMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频' T: [/ y1 z  f
MCI_DEVTYPE_OTHER           Other           未定义设备
6 o/ Q( f+ c! mMCI_DEVTYPE_OVERLAY         Overlay         重叠视频* Y" Y7 _% S" \0 x) Q' }5 Z
MCI_DEVTYPE_SCANNER         Scanner         扫描仪
  b% |0 s: `/ n+ x2 G! MMCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
( A! F3 w* x2 U2 i" R4 EMCI_DEVTYPE_VCR             Vcr             合式录像机3 o) E" k% g5 E4 C& `" k' _  Q; R% g
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
  I' U- f, |1 u$ `8 [, \MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频/ a+ ~  r: K: [& h' z* U

4 _- c& ^4 T/ [7 g) k) }对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
- ^, _( ^+ d& q! g' u; `# C. t* s  K( E0 C) b
[mci]& z6 y: h- N3 G% O# E( d1 Q
cdaudio=mcicda.drv
: ]+ p. j$ q( I. psequencer=mciseq.drv: x9 f7 O  C# f8 l. |6 P( h
waveaudio=mciwave.drv# y+ y3 j, E8 Q: Q7 d+ i2 F
avivideo=mciavi.drv4 F9 G2 u% ?  H1 g& X* g
videodisc=mcipionr.drv% W/ c" g  x, O- _* d
vcr=mcivisca.drv
) @0 f1 L! P1 L0 IActiveMovie=mciqtz.drv+ U& ]1 W( q- l+ \5 D
QTWVideo=mciqtw.drv& t% A9 ], H% l( \6 |
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
: y8 {* r8 y! z3 c4 p
" _$ l* m/ L* w# L其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。0 O! t/ j, d1 ^4 q
//------------------------------7 X3 Q$ ^) b2 U+ p3 {% l
// 广告时间:# [( y2 o7 E9 U( w0 G* h' ?
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com' z' x6 g- a. T( f% G  V: M2 ^/ ~
//------------------------------* Y7 q% I$ T" Z
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
3 `) m7 F) R. C, a' B5 v举个例子来说,打开一个多媒体文件有以下三种方式:! d, P: n3 D5 a, [
* y  `# w+ Y( e8 l- B2 w! o
[1]:自动识别:打开一个"WAV"文件5 Q) T3 X! f, x4 T2 [2 \; Z
MCI_OPEN_PARMS mciOpen;
' E! `8 z& P" j5 J7 g% n$ `8 y2 FmciOpen.lpstrDeviceType = 0;
/ A! ?; o5 K" p& ?" hmciOpen.lpstrElementName = "aaa.wav";
4 O: G; s2 U/ ?9 V* _mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);/ M  T3 B4 E9 @5 `9 L" @+ {

7 i" Y( a* p: p7 K) [2 v& C[2]:指定设备描述:打开CD播放器
! |7 H/ b, F* kMCI_OPEN_PARMS mciOpen;+ n2 B% a( s9 x. i. f$ {" M
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;+ n! c3 d* z" J! i6 a6 e# X# u0 m
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
4 a+ a. _0 E2 {
" W6 Q2 b5 x' e; F8 h+ n5 N[3]:指定描述字符串: 打开一个AVI文件( n9 s" `3 n  P
MCI_OPEN_PARMS mciOpen;' V, q/ X2 F1 w/ f" l8 |
mciOpen.lpstrDeviceType = "avivideo";
7 i1 m; t+ A, |, k  H' c! XmciOpen.lpstrElementName = "aaa.avi";& u' O; X% j1 ~% r2 _: J  A  Z; g; Y
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
( z( f; E! {# c; F! V% }/ [
4 G. D& H* E* ?! I1 X$ v2 s注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
. }2 C& F) g# V8 N3 e+ X; ]3 v5 q& P, C% P6 X3 E6 H- B5 U, H
MCI指令 ! Q7 P  l; d6 Y2 N% B6 C4 \3 Z
( q& _% x8 w; B/ n
MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
+ I5 }. A- b1 E, I7 ^% z# l, TMCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
1 k* D3 e* g: v% xMCI_CLOSE        关闭设备1 `+ ^/ j' b$ }+ K
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频
6 S/ e7 J9 G7 [1 p+ EMCI_COPY         拷贝数据至剪贴板& X& t1 t5 E8 Y2 @: a) [( h5 n
MCI_CUE          延时播放或录音, U" C2 C. F# Q7 M. s9 J
MCI_CUT          删除数据
* w" h/ ~0 U& u5 g& nMCI_DELETE       删除数据
9 c! E/ K! M) p6 u. Y3 s% RMCI_ESCAPE       仅用于激光视频
, O- Y( l3 x$ e' H% T* {6 e7 k" UMCI_FREEZE       将显示定格
2 S! p% p5 d4 x: ^9 w, j/ Z8 `MCI_GETDEVCAPS   获取设备信息  M0 g0 V5 ~) I4 G
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备( u$ O# Y) V% M+ J5 x4 y
MCI_INFO         获取字符串信息
( f; V7 Q" C6 K4 k* jMCI_LIST         获取输入设备数量,支持数字视频和VCR设备
" |3 y7 q# r% S; n4 t" iMCI_LOAD         装入一个文件# }3 v  r4 Q( t% Q4 W6 \
MCI_MARK         取消或做一个记号,与MCI_SEEK配套' }9 `* k- T$ a
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
2 U- |8 c" v# s. l' z1 qMCI_MONITOR      为数字视频指定报告设备
! u; \& O+ F( A& d$ U5 eMCI_OPEN         打开设备7 C* X& q7 v8 q
MCI_PASTE        粘帖数据
: ?7 k. Y/ s/ o1 M! ~) ?. z% MMCI_PAUSE        暂停当前动作7 a: U) P. y4 @9 Z. U: N* @3 @" F- S0 [+ A
MCI_PLAY         播放
9 _% Q+ `( E. wMCI_PUT          设置源、目的和边框矩形
$ U, ~2 ^. L; K6 D5 RMCI_QUALITY      定义设备缺省质量1 C$ W! w; N& W3 d
MCI_RECORD       开始录制
8 L' c, Y1 G  R0 U- G& ]: M- {( F- B% AMCI_RESERVE      分配硬盘空间
  i1 A: o1 Z( S+ lMCI_RESTORE      拷贝一个bmp文件至帧缓冲
  x2 ]  G' F2 zMCI_RESUME       使一个暂停设备重新启动% t6 \( G1 Q/ [; o+ P! a
MCI_SAVE         保存数据
( |7 H3 h( c" oMCI_SEEK         更改媒体位置
/ x) t( N# E2 y' z' u- a( S4 @5 tMCI_SET          设置设备信息
( q' I1 d+ M' h0 zMCI_SETAUDIO     设置音量0 q! n6 Y/ V! w1 Q" m( d
MCI_SETTIMECODE  启用或取消VCR设备的时间码2 A0 H7 b" q1 I# y6 _6 L% c  X
MCI_SETTUNER     设置VCR设备频道
' ~  s5 A2 I  ~: x$ jMCI_SETVIDEO     设置video参数
0 a) v! t( y8 z5 d6 WMCI_SIGNAL       在工作区上设置指定空间
! J# R0 a" n0 n0 ]5 ?7 aMCI_STATUS       获取设备信息' R/ p" ]! I' C( i. R) l% g
MCI_STEP         使播放设备跳帧
3 ~+ R, `8 k+ H  Q8 @; XMCI_STOP         停止播放% J# ]4 D  p+ j4 F6 j: L* h. a
MCI_SYSINFO      返回MCI设备信息
3 A, c0 X, J3 k1 o- {  [5 o, MMCI_UNDO         取消操作: t# J6 G! S! A7 i6 u
MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动  N5 m6 H4 z  [6 H
MCI_UPDATE       更新显示区域
# u7 n; }+ ~5 q2 v7 X$ ZMCI_WHERE        获取设备裁减矩形
+ a1 S  k* {* E; E! ?MCI_WINDOW       指定图形设备窗口和窗口特性
, ^: x/ I0 F: D. `1 C1 C- ~" e0 W1 o* P* F1 D* x( L
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 01:41 , Processed in 0.018297 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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