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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。0 f, G6 f* _6 s& K  R
7 x# M. x  c5 R# @: c$ ^
MCI的控制方式:
/ E7 y7 R) z0 z" x) g
, r) ~" q  x3 {一般说来,程序员使用两个函数就可以与MCI打交道了:6 X3 ]4 K4 j9 t# r
( [, z% X6 g5 y1 [
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
; o( n' l2 S4 p3 r  a9 H/ ?命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
4 x5 a1 Y/ b; z5 X. f
1 @1 h3 V- D$ P5 r3 W4 AMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);$ [4 h( }- V: j! z% P
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。4 F+ [  w% X4 r" `) j. s8 E
6 H* H/ X4 n, |3 ~
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
" ^; W  v+ ^8 x2 [5 ?: n7 C$ k' l) P! K4 r! F3 k5 P4 {/ ^4 p
对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。+ ~: W- }5 S3 `, G0 k) ?

( |" Y7 t6 J: h+ S, U+ F举例:
  t+ U3 G3 L, W  ]0 [" y$ imciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
4 f8 H- m2 }$ h% i2 d; y$ T# TmciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"2 d7 P. u5 Z0 |  |5 Y9 n5 V

, ]1 L( t& _: j$ ]9 i* V7 z6 _$ ]MCI的设备类型:' T4 ]& d& _6 h0 ^
% t$ x& B- u( ]  {( Y
设备描述                    描述字符串      说明
  {" ]/ j! H/ s6 R& d5 O" e. mMCI_ALL_DEVICE_ID                           所有设备' M4 c/ B. p0 F. H2 ?9 J. Z
MCI_DEVTYPE_ANIMATION       Animation       动画设备
% N0 V( Z+ q' \7 k& MMCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
8 H* Z; q- h4 g- IMCI_DEVTYPE_DAT             Dat             数字音频
) C* w- ^. ~  zMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频
; ?- |: u8 O5 }) b$ @% cMCI_DEVTYPE_OTHER           Other           未定义设备
& s, S/ R. L" y  o& tMCI_DEVTYPE_OVERLAY         Overlay         重叠视频+ }# Q; N5 a- N3 c8 b! T
MCI_DEVTYPE_SCANNER         Scanner         扫描仪8 L5 s) P; |8 e" R: b
MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器' b) v! T! k' ]
MCI_DEVTYPE_VCR             Vcr             合式录像机# W) g/ b0 }6 f' _
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘3 [0 R) j$ l6 M0 \2 O" [
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
  H& K  k7 e/ _5 p5 X* Q" B: J: }6 W
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:/ N6 E& X4 x1 z$ Z

: c( E# J1 P+ e4 G9 `[mci]. x8 X! _0 B& N5 U
cdaudio=mcicda.drv1 W: \+ z! J+ L! j
sequencer=mciseq.drv
1 p# {' K# \- {; G  Qwaveaudio=mciwave.drv
4 z6 S1 X8 W( T$ t/ ~+ Zavivideo=mciavi.drv$ [9 L+ v8 C* ^
videodisc=mcipionr.drv
4 J4 u+ Y) e/ C3 ~" w2 wvcr=mcivisca.drv$ w8 z( M# p2 ^2 d  z0 G" \# B
ActiveMovie=mciqtz.drv
& F! N  _$ z) C) A/ |QTWVideo=mciqtw.drv- Q) ]! Z, ?( ]4 h
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll1 h* ^: X/ |0 G4 y6 P; B' B

  ^, ~( X" \$ s其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
/ s- M0 l. k: S8 f//------------------------------
( H3 Y: L# i0 b6 o6 ?% Z4 H// 广告时间:
- S3 N! k  d$ p2 `// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
1 e* r& N! u5 Z6 u* N//------------------------------9 A/ B* L* |& c
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
4 e9 e. X" a/ `举个例子来说,打开一个多媒体文件有以下三种方式:
% ~6 c+ w& C' N7 G; r& m
- s! _; }+ |& Q. v: R[1]:自动识别:打开一个"WAV"文件: T+ m6 J( K! z3 H
MCI_OPEN_PARMS mciOpen;( }' F4 d9 j8 c  D  Y7 k
mciOpen.lpstrDeviceType = 0;; d1 S/ x7 p- {# Q- v8 ]) A: ~. O
mciOpen.lpstrElementName = "aaa.wav";
" \2 g/ L# v: p7 \0 G' SmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);3 n* R$ W+ N  p. i1 \  L8 p

9 b& y  u# U/ O0 G[2]:指定设备描述:打开CD播放器$ ]9 h. n6 x! h) D3 e% |
MCI_OPEN_PARMS mciOpen;
. j/ g- G) T% J) e7 Z1 bmciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
2 S0 M! i  _2 K0 e" G6 f3 @. EmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
  x8 m3 a9 O% H& w9 g( m  `( X. m% }1 ~9 @0 J* w
[3]:指定描述字符串: 打开一个AVI文件
: K, @' b9 {6 r9 o! LMCI_OPEN_PARMS mciOpen;
9 h. ]5 s; `& ]% q8 j  o8 lmciOpen.lpstrDeviceType = "avivideo";
: U& a5 k" o# A& TmciOpen.lpstrElementName = "aaa.avi";
8 x4 J0 \  Y' L3 v4 T2 g/ O$ K( tmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
' ?2 u( ?4 k& r& l
3 H" F8 H  d3 q8 R4 Q0 r注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。# T7 f& O& h- {& b

6 @1 u6 T& \& S8 vMCI指令
0 Q: p) u5 }" X8 p$ I; U
+ E+ v+ S1 Z! M) E. sMCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
- M# w+ U9 \: K! S- @+ `MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
2 L; I8 m/ M2 Y& BMCI_CLOSE        关闭设备
) I: H. r. [  m8 V& uMCI_CONFIGURE    弹出配置对话框,仅用于数字视频; A8 i, N: l- I; u& w
MCI_COPY         拷贝数据至剪贴板" _% u. E; v( l8 p% ]7 s" W6 v
MCI_CUE          延时播放或录音( [, I2 f& {% k. K5 c' }
MCI_CUT          删除数据7 J3 U, B: f$ R4 a" W2 s$ X
MCI_DELETE       删除数据
( V9 ~' ^0 d3 _& L. d0 v* A8 |. t1 wMCI_ESCAPE       仅用于激光视频
6 M$ v# H; t. ~4 F( o# wMCI_FREEZE       将显示定格1 M* f: y' a% H) ^8 u/ A( f+ G
MCI_GETDEVCAPS   获取设备信息6 w) A" \: ?7 h! Y
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备$ Q6 V5 Y: n: j: i' m) m4 v: M* o
MCI_INFO         获取字符串信息; M; X( _) ]5 _6 p0 j7 w' y
MCI_LIST         获取输入设备数量,支持数字视频和VCR设备
9 r8 l5 j/ D5 w9 f1 n  u7 O) E9 }MCI_LOAD         装入一个文件
# Q) u% c3 C. b" K/ pMCI_MARK         取消或做一个记号,与MCI_SEEK配套0 J: J7 l1 L" c2 D: J( L! G  v
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
0 U* r3 r6 \! ?2 }% Q  D* E0 _MCI_MONITOR      为数字视频指定报告设备. l5 ^0 K' _  C  ~
MCI_OPEN         打开设备
% z( I( x: K% g( Y& IMCI_PASTE        粘帖数据* [5 d8 ?* j8 U
MCI_PAUSE        暂停当前动作
, k% i) I  b3 Z4 m* {& W1 _MCI_PLAY         播放
( |7 D& E0 W1 r1 ~/ [; j& XMCI_PUT          设置源、目的和边框矩形
) n& m5 ^! w9 w: TMCI_QUALITY      定义设备缺省质量: [& Q/ S( a. T1 G! E  E: @
MCI_RECORD       开始录制6 j0 q- h8 D9 b: ?) I- j. c5 A  b
MCI_RESERVE      分配硬盘空间
2 F8 a9 ~3 o$ ]! mMCI_RESTORE      拷贝一个bmp文件至帧缓冲
4 r7 j* I+ u. e* Q6 eMCI_RESUME       使一个暂停设备重新启动
; y$ E7 }7 V) `8 t; E4 u, P# c' wMCI_SAVE         保存数据8 H& b+ V% J! w* E' P  r# c( N
MCI_SEEK         更改媒体位置
7 A/ u( R. x( ~* ^" n6 oMCI_SET          设置设备信息
; H: W- N# ^8 D! {9 U+ l; g1 aMCI_SETAUDIO     设置音量! v0 K9 U- U5 ~* G% p
MCI_SETTIMECODE  启用或取消VCR设备的时间码
  ^5 K9 E8 }' O# O( tMCI_SETTUNER     设置VCR设备频道
# x$ R( R, D. b1 Y/ h% w. mMCI_SETVIDEO     设置video参数
! B4 z' T! a  u+ |9 eMCI_SIGNAL       在工作区上设置指定空间7 n* H# d; X' L: z+ j- K$ f2 _3 X
MCI_STATUS       获取设备信息- @  {1 J- r3 N1 b  q" X: ^
MCI_STEP         使播放设备跳帧2 s: G$ f; [* V! F0 y
MCI_STOP         停止播放* U; j" S& w0 a; W! z, V8 C' ]
MCI_SYSINFO      返回MCI设备信息
3 Y. o, i4 L4 |2 U+ Q  LMCI_UNDO         取消操作# q! y' e) u7 Z% e; j' Q
MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
3 ]2 B  q) \8 G: s  G& R+ i. Y7 `8 _MCI_UPDATE       更新显示区域
$ C. T, q4 U5 U0 p( q5 a( a1 tMCI_WHERE        获取设备裁减矩形( i2 L, X; U& E' V# |1 N2 z# O$ M* s
MCI_WINDOW       指定图形设备窗口和窗口特性
2 o, {9 N* @' E. d; T' E
( B% z* l. h% h9 b其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 23:48 , Processed in 0.035450 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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