找回密码
 注册
查看: 4861|回复: 0

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。3 l* Q" w& j. |' D
/ m; s; Z/ m1 L6 t/ J8 L6 b7 ]$ `
MCI的控制方式:; t' D/ j3 s7 `. z
! i& X2 m* R- j( \5 M, Q* U. ?7 a
一般说来,程序员使用两个函数就可以与MCI打交道了:
9 B3 h/ G" v, {  q- A: A& O8 c# N3 Z1 i$ Y
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
  I" H, G0 i# Q5 `4 s% \* K命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。0 X4 z! N) b, ]8 o" f% Y/ l

, n, M8 c% I/ S! e! rMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
" a+ w/ g0 P/ ]' a) M命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
" f8 S4 ^4 I1 ^) O+ j; G: [' ]/ r4 r% M4 v/ K: c! V4 E1 n' d  s, _9 T
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
  {/ w, A/ S5 I& g0 r1 A  j" u3 l& p
对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
  h! Z( r2 Q7 t; X
: M: f/ Q: F. Y* s6 g- U- q举例:
. k+ m' b0 b$ q" TmciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备- o' Q: [4 ^7 g- R* K
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"2 v& h" q; ^- Q. ]/ w

' h' K2 {- d4 h3 Z: A& FMCI的设备类型:; j3 j+ S) ]% @

8 N* n! ]9 P# p" Q设备描述                    描述字符串      说明$ B6 |0 B: V) Y( z. U, ]1 J
MCI_ALL_DEVICE_ID                           所有设备
3 [: B3 h  f( t4 W% b$ g* |5 |MCI_DEVTYPE_ANIMATION       Animation       动画设备1 I. ~9 B! H' y4 @% b! A5 E
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频! E3 c0 H$ \6 a
MCI_DEVTYPE_DAT             Dat             数字音频* V  G" m  R' ]7 c
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频
% V7 u, p! ^# r/ z1 A1 [& n/ [MCI_DEVTYPE_OTHER           Other           未定义设备
' X! F, ]- j) e" V. U6 c/ \# V, FMCI_DEVTYPE_OVERLAY         Overlay         重叠视频
) U  D' {, B! _/ X6 nMCI_DEVTYPE_SCANNER         Scanner         扫描仪
! p; P' W8 p/ B1 {/ eMCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
- S' L4 p7 w' j! p" H4 b" N' dMCI_DEVTYPE_VCR             Vcr             合式录像机2 k' T. Q: w. Z% u6 ^1 l
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
: `! h3 f* V" d& C# NMCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
; _5 S' v9 C) Z9 w9 M% T
' z" g% F1 w% j' x* J/ v6 _# [! u' V9 }对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
" w+ `, J+ `( e) |5 X! v7 k& G" p* F% [* q1 I
[mci]
- v9 m6 _0 ~( F/ [$ g, y* hcdaudio=mcicda.drv+ C5 G3 U* u7 x+ k- Y% X
sequencer=mciseq.drv
$ F3 L% w3 I) C6 k: c; T6 L- ^waveaudio=mciwave.drv
  F3 |8 q$ d5 N& Yavivideo=mciavi.drv% a9 _" R  @7 Y7 I' z( W/ R
videodisc=mcipionr.drv
# @* g6 F! _6 Y( G/ fvcr=mcivisca.drv1 c8 G4 p* V' u( T: L; x
ActiveMovie=mciqtz.drv1 _1 \/ e. a% r  g
QTWVideo=mciqtw.drv/ `# d. w! v, {9 A+ q( V* Z. Z! K
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll1 b% N" ?; |. _. `+ Q* C
  }9 N- E& u6 ], U' r1 U; r; L! |" [* O
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
* ~0 H0 R4 E( s$ ^//------------------------------
0 l% K, X, {7 N, l. V; Z/ b// 广告时间:  G' L6 B- p5 w& I, P7 Z& E
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
) s$ i- z% T4 w/ ?# \//------------------------------! z2 S2 A) W9 c& X% y$ }
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。$ X5 h6 A6 n& {8 x) @; j) N
举个例子来说,打开一个多媒体文件有以下三种方式:7 e. M" X& Y+ T2 d4 o
# w) i  _% R* D8 ], w- {% F" }# ~
[1]:自动识别:打开一个"WAV"文件) B/ P$ u1 g# G1 m- H
MCI_OPEN_PARMS mciOpen;) R/ K6 F3 T1 e
mciOpen.lpstrDeviceType = 0;
! l0 h7 z) T, w# u' ]' f+ I3 {mciOpen.lpstrElementName = "aaa.wav";" Z1 ~3 E& _/ u6 w
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
4 f/ c  l# M( S! B, a& f, r' y+ a0 r3 D- H8 `. N  d7 p$ a
[2]:指定设备描述:打开CD播放器
+ m. a) ~" H3 Y( {7 I; zMCI_OPEN_PARMS mciOpen;; R- l2 k1 S3 u4 }9 N% t
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
: B* J9 S6 M2 S  V1 g4 kmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
+ F7 `- _* {: _3 `  v" ]5 L* q" B8 b$ s" p) s0 D7 a0 P2 r  q
[3]:指定描述字符串: 打开一个AVI文件
3 ~( ?3 c: c! h: I+ Y% `( cMCI_OPEN_PARMS mciOpen;
& @/ ?* v  \' D6 `! K. imciOpen.lpstrDeviceType = "avivideo";' g8 S; D# ?$ m0 Q6 t
mciOpen.lpstrElementName = "aaa.avi";* O9 _+ x/ J9 A# h; `
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);! ^: |" s9 O. F, L' [3 x

- ?: U4 W( }8 D8 `注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。0 n; L/ b' V/ c+ u, w0 ~' {0 Y
/ J. w' h* S3 y- p; A
MCI指令 ) |) z2 x# ]5 _% t' @& ?

& c1 ^' d8 a$ a. s. J5 E, e& Z8 O* J; |MCI_BREAK        设置中断键,缺省是”CTRL+BREAK", l: S; I, [( e" J, f
MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频; q  T/ \. s+ O* z- N6 u; N
MCI_CLOSE        关闭设备9 a. k! e" s* ^
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频+ u0 u* s+ x" x# j3 W# s
MCI_COPY         拷贝数据至剪贴板) O( U- r$ o0 n$ O: T* m: `% \) B
MCI_CUE          延时播放或录音+ R6 W& b1 K% b/ e
MCI_CUT          删除数据
' r4 u: k& L1 K. @MCI_DELETE       删除数据
  P3 h6 M" m( O4 P9 t3 ^MCI_ESCAPE       仅用于激光视频
8 M8 ?" ~. ?" k2 L' M; vMCI_FREEZE       将显示定格3 R- n* t5 H% V/ L" I4 q
MCI_GETDEVCAPS   获取设备信息
. k) _- s$ N5 g9 l' F% F' \8 TMCI_INDEX        当前屏幕显示与否,仅用于VCR设备% I' B1 U5 V. w) F$ _
MCI_INFO         获取字符串信息
* @% u  N0 e. u5 U2 R7 G  jMCI_LIST         获取输入设备数量,支持数字视频和VCR设备
; D  c% y  [* p$ v  I- gMCI_LOAD         装入一个文件7 ]- K  N3 W+ z3 X0 X( \2 _" a
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
2 Y: ?" F4 \9 T7 XMCI_MARK         取消或做一个记号,与MCI_SEEK配套
5 W3 P9 n: h! c7 QMCI_MONITOR      为数字视频指定报告设备) f6 j) \- W4 m- G
MCI_OPEN         打开设备2 _( a3 R  U$ V+ e" ^
MCI_PASTE        粘帖数据1 l; ]' C( \# W
MCI_PAUSE        暂停当前动作3 |+ i2 n1 Y' `
MCI_PLAY         播放% ^/ H, X/ o7 P' Z; w5 Z# G  I  b
MCI_PUT          设置源、目的和边框矩形
  b- Y1 }* K# T8 c- GMCI_QUALITY      定义设备缺省质量
4 ^" L  c" ?& X% AMCI_RECORD       开始录制
9 Z2 y- |- |/ N" R% ]MCI_RESERVE      分配硬盘空间; c6 }) l/ ?- l; Z, h& p5 P
MCI_RESTORE      拷贝一个bmp文件至帧缓冲* v7 O( d" H4 `/ L8 Z" }
MCI_RESUME       使一个暂停设备重新启动
% P' u* i. j' i% g- l: \MCI_SAVE         保存数据! Z# o% V( p0 j# ]8 P, O& }
MCI_SEEK         更改媒体位置
5 ]. o8 g4 w7 k) ^% @; gMCI_SET          设置设备信息$ B/ K, _% `8 [) L
MCI_SETAUDIO     设置音量& r6 O3 {9 y/ V
MCI_SETTIMECODE  启用或取消VCR设备的时间码6 [- ~9 D/ D6 o5 V$ b; u
MCI_SETTUNER     设置VCR设备频道, B% ]* e' i, L- Y
MCI_SETVIDEO     设置video参数" b, H7 g! z* M5 [
MCI_SIGNAL       在工作区上设置指定空间3 q2 k# f0 ^# y, @7 v- I& s
MCI_STATUS       获取设备信息
( F9 R; D4 `2 x& ~$ c: TMCI_STEP         使播放设备跳帧; b2 J" q; v& @( x* Z: ^( e
MCI_STOP         停止播放
2 n3 o( F, c) z( _MCI_SYSINFO      返回MCI设备信息
  A& {6 F- H  S* S( R, RMCI_UNDO         取消操作
" N/ C: n& I6 _; HMCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动+ c. P2 ]7 K: z1 M4 S( B
MCI_UPDATE       更新显示区域
( M9 \4 ]' u1 R' `9 ~5 yMCI_WHERE        获取设备裁减矩形
/ i; {( A6 T* F# M- jMCI_WINDOW       指定图形设备窗口和窗口特性  t. _% Y. g/ m

8 R1 `  i$ |& |) m' |2 [8 R其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 07:31 , Processed in 0.017036 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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