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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
  {: f  a; M- x) G# I5 M  w- d# q  g9 u1 d/ e+ ]" E
MCI的控制方式:
3 ^1 ?( t& J( d. O6 p; ?6 S2 i! @; l5 g4 f8 _
一般说来,程序员使用两个函数就可以与MCI打交道了:
/ U) _- c: A' ]) |5 I! h, q
; Z. X8 q4 p+ EMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);! i+ L" S, Y; s0 c9 D( D1 w/ G
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
/ w% s! l# M+ `  M3 m* v9 J# @2 X
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);* W' J( y+ M5 E5 H. |0 w6 s7 z
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
$ Q6 [! e5 r4 H2 S! O' |% k. c1 g% H* V. d& A
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
/ y  E6 G/ \3 _$ o7 [4 b# M  C" \/ e
对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。" ?8 U) A; s$ Z% U

. Q) H# {# T: v举例:
* @$ m+ d/ z7 J( d2 t% rmciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
6 u! S) g% z2 omciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
. P9 Z- t! c9 W6 G  }. [1 \. F2 Q
; N- i8 e$ o" mMCI的设备类型:- l6 T$ S/ f" H" V
2 `- p+ n0 h8 v+ ~) \
设备描述                    描述字符串      说明4 W( F: s* V# z1 u
MCI_ALL_DEVICE_ID                           所有设备
+ z6 l  P- E7 p+ t2 L0 ~- g$ m( t4 mMCI_DEVTYPE_ANIMATION       Animation       动画设备
* r3 j: p( ~4 bMCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频* O7 f" M. f6 |3 B
MCI_DEVTYPE_DAT             Dat             数字音频6 [9 t3 J0 b2 B5 p. H: `
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频7 R  R+ r' Q2 H+ i& S
MCI_DEVTYPE_OTHER           Other           未定义设备
' v( j' d- M  U4 rMCI_DEVTYPE_OVERLAY         Overlay         重叠视频
* Q- G; z3 R+ Z8 _; a- Z5 DMCI_DEVTYPE_SCANNER         Scanner         扫描仪
% ~2 g& w" l2 L9 ]MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器2 B& p. Y& M: G& R3 R
MCI_DEVTYPE_VCR             Vcr             合式录像机
" w  T& t5 \( u. KMCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
, o3 }7 f; a$ b& aMCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
9 E1 x% K, \, k& y: [6 w) n5 r2 d5 t
6 `3 ^' T: `7 G' `% y7 \对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:5 l! ?0 q/ p/ J. g$ u& K
# V6 D' J; f& J8 @# `# ?# H" a. c$ P
[mci]
! U. Z/ a# U2 _cdaudio=mcicda.drv( Q0 ?& j3 m' l, p' d) H  W) E
sequencer=mciseq.drv. U" B( c2 ?$ k4 {$ [/ ]
waveaudio=mciwave.drv
9 L! F5 D5 j& }# A9 h& Pavivideo=mciavi.drv
# q+ H9 M$ P9 R5 Rvideodisc=mcipionr.drv  d& [* b' f0 e4 v+ p/ t' v  z
vcr=mcivisca.drv, _* U1 w6 t* z9 j/ z- P  [
ActiveMovie=mciqtz.drv  [; ^2 ]7 q( S% {
QTWVideo=mciqtw.drv, D5 L+ Y! J1 ?! W: @
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
' t1 f; C: g2 Z7 `
7 D! m' ]# H% B# h其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。# T# z# l, F  P& u3 o
//------------------------------
( \1 P  }9 G* a6 f/ J) i// 广告时间:
: B$ }; @6 `4 K, D: @// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com" [3 U3 Y6 y  {: z
//------------------------------
, |6 o, q1 x7 H) b8 y, Z; k: a/ b: D在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。8 l7 u6 A2 X1 g8 @, i) a) g' q
举个例子来说,打开一个多媒体文件有以下三种方式:. ^  [# g( I% u4 B" A) s1 t/ Y
8 c5 k+ E! {' d% ]3 Z
[1]:自动识别:打开一个"WAV"文件+ S: f" Y5 i0 R% n
MCI_OPEN_PARMS mciOpen;8 @! D5 z/ q: ?; V" r: z2 {
mciOpen.lpstrDeviceType = 0;
* j4 k+ e' \# |- [: o8 j& FmciOpen.lpstrElementName = "aaa.wav";! N* L) y+ l- o: r. n. P5 f
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);$ u0 A: g& p# \

$ o$ M8 l( S8 S" i: b[2]:指定设备描述:打开CD播放器
  y% f5 h+ ^# s# g- Q9 ]4 @! EMCI_OPEN_PARMS mciOpen;( Z4 B* u: F$ w9 `
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;. P' U3 s4 `8 A2 E4 O6 f1 ]" ~3 |
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);5 T/ A* j: s. h3 d  c
6 b8 q( p/ P" r
[3]:指定描述字符串: 打开一个AVI文件4 F' C: K8 U2 t! u
MCI_OPEN_PARMS mciOpen;; w* ~% x3 d3 @9 {3 S: H
mciOpen.lpstrDeviceType = "avivideo";
2 S) }7 K  w8 Y) vmciOpen.lpstrElementName = "aaa.avi";
8 j) I/ M2 J) {+ f+ p+ B2 ?9 RmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);% |; D2 d9 V; {$ s% Y# ~
9 ~: t/ g- Y0 I3 T8 t; d& h! H
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
6 G5 l" s+ F1 d9 W) [% |
% O, d( b0 w" SMCI指令 + p, s) E" N7 r0 {

( L  @& G2 i9 {5 @5 x* B; X! c5 PMCI_BREAK        设置中断键,缺省是”CTRL+BREAK"4 u) S7 ?9 p; ?
MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频) M" C: s& p9 G$ _; U* ]; G
MCI_CLOSE        关闭设备' z/ b5 b  y2 g4 ?1 q7 H
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频0 l2 n8 w4 Z5 i7 S
MCI_COPY         拷贝数据至剪贴板
1 ]1 D. i: W9 s, W2 G3 nMCI_CUE          延时播放或录音
; p5 \, r9 W5 n/ iMCI_CUT          删除数据
. v6 |6 x7 h( D9 m$ [+ DMCI_DELETE       删除数据
6 Y; [) I6 d/ t, u, P1 dMCI_ESCAPE       仅用于激光视频6 o4 k( O4 Z2 O# O6 s/ h6 v0 V
MCI_FREEZE       将显示定格
' J$ B& E" ?3 L/ |MCI_GETDEVCAPS   获取设备信息! a% t( p* K& h! U5 N- U
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备
9 u. ~+ W, T0 h% F; P8 s3 {( hMCI_INFO         获取字符串信息
7 r- I! L- G7 oMCI_LIST         获取输入设备数量,支持数字视频和VCR设备
+ L2 X2 d# h* h) z( u3 k( ^2 R% tMCI_LOAD         装入一个文件
2 x4 Z6 w" P& Y# i* F; kMCI_MARK         取消或做一个记号,与MCI_SEEK配套! |( g1 o% R, V3 h1 @' J. }
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
  }% n5 Z% ?  F- ?- gMCI_MONITOR      为数字视频指定报告设备
) o, H9 m2 x$ b2 Q) T. NMCI_OPEN         打开设备/ L( ~  F, m6 v: }
MCI_PASTE        粘帖数据2 W' Q9 g2 b  r
MCI_PAUSE        暂停当前动作
/ Z# }8 _( g; jMCI_PLAY         播放
' T" K. g3 S& o! u4 GMCI_PUT          设置源、目的和边框矩形
; a5 P5 O% q/ j+ R! |4 s* `8 {MCI_QUALITY      定义设备缺省质量
, a7 T2 L$ _. T( F; EMCI_RECORD       开始录制
4 }, w" M3 r4 b, R; V$ G. i+ R; gMCI_RESERVE      分配硬盘空间
$ q6 W0 F: J! f# I; P1 Y8 t  WMCI_RESTORE      拷贝一个bmp文件至帧缓冲+ B# M+ ]1 J  [1 T6 Y( a
MCI_RESUME       使一个暂停设备重新启动
  W9 ?2 D7 F9 K# p' d* W8 BMCI_SAVE         保存数据" U" L2 E- o5 u) Q; j/ O
MCI_SEEK         更改媒体位置
% A% Q! Z  `) d$ G: o3 X" p5 aMCI_SET          设置设备信息
3 B+ z1 y' Q, [9 o  K' A$ WMCI_SETAUDIO     设置音量  ?" B! c4 L$ V- q3 y/ u8 T! Q- k! L
MCI_SETTIMECODE  启用或取消VCR设备的时间码3 E+ Y! e2 g; D5 w4 L
MCI_SETTUNER     设置VCR设备频道
4 U/ G% d0 v4 M& tMCI_SETVIDEO     设置video参数
& R" r, z2 e& E6 BMCI_SIGNAL       在工作区上设置指定空间
7 ^, j, x: ?) Y/ y0 E7 I  }MCI_STATUS       获取设备信息- H8 j" h4 O2 k% l
MCI_STEP         使播放设备跳帧
7 F, Z* R1 C1 G2 c# S0 ~MCI_STOP         停止播放6 t% L, I+ c3 [% T1 ^8 b
MCI_SYSINFO      返回MCI设备信息
; u; S1 P1 Q+ I+ `5 v2 k9 Z* H6 H7 GMCI_UNDO         取消操作
3 c% _' A4 {! v' v" ]2 Q' DMCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
1 j8 K! c8 |% s" p7 N) s4 [MCI_UPDATE       更新显示区域4 \& w, E, v; N+ Y* H% F9 @
MCI_WHERE        获取设备裁减矩形6 x8 _& d- x" ~* b
MCI_WINDOW       指定图形设备窗口和窗口特性
- |% R5 \. A% R8 T& D' C: ]1 i* z) o) K, S0 ?0 p5 F) N. u2 |' X
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:10 , Processed in 0.019413 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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