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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
$ a+ q2 s3 ^' u5 c, p% N( O. a& O6 {, t" v; L
MCI的控制方式:6 M  E6 [# ?# X4 d$ l6 t

  ^. E- s" K0 [2 `& D一般说来,程序员使用两个函数就可以与MCI打交道了:  a. X/ ?1 j- m0 P0 [

3 d7 |7 B; d; z' B+ bMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);* ^- i: i+ \& m* Y
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
1 s8 v1 _2 V' U) v8 i* T5 J" c$ Q( B; l. Y( Y9 B
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);  E4 I# [5 R. q+ H
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。+ U* |2 j! D& b6 B) P$ i

' L7 z4 j8 x' `( V, B& _对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。- Y* E: R( q) ~; o, ^  l7 j

; j+ j. h  n+ D" J对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
3 c5 s8 a) _) Z, A; \# I0 q( ?7 g) h5 E/ \& Y* y8 Y  t; N8 _
举例:7 X4 K% x/ n6 @- Y  M
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
; b; B: h; `. n% ?+ ~mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
5 A0 o2 s/ m( }. N$ F) W" @7 w; M2 Q
* O& E. M7 v* S* o! a0 ?5 iMCI的设备类型:
2 x9 J, X- r* U- ?# h
: q& W4 |# \5 |: p设备描述                    描述字符串      说明
& t) z1 W; ^7 o4 y; K7 {MCI_ALL_DEVICE_ID                           所有设备1 N5 e. u! {* ^) G) W& H& Z
MCI_DEVTYPE_ANIMATION       Animation       动画设备
, N, B- G6 |  ]7 t% @MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
) Y" X' ^2 i' i: Z4 oMCI_DEVTYPE_DAT             Dat             数字音频& G8 Z+ ^# I+ M+ y( r% l) d* K
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频- ^3 \6 t: ~* L+ w6 S
MCI_DEVTYPE_OTHER           Other           未定义设备
& I) D& s3 X6 ]2 [6 S) MMCI_DEVTYPE_OVERLAY         Overlay         重叠视频
$ e# l8 c2 u; T5 b3 v6 R. W4 b% X6 ZMCI_DEVTYPE_SCANNER         Scanner         扫描仪( e, M; A& R1 Z! h, h$ q, F
MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
& ^+ f# D' U; S8 S% D7 NMCI_DEVTYPE_VCR             Vcr             合式录像机
$ ]  z% F! O' H% j1 n5 J. s: LMCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘2 a- I$ c0 `0 D/ \  ]4 L! e1 r
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
* e/ W- C1 n' ^& J5 ^" v
$ V- p+ {  x: z! {对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
! B( }3 i" _$ B2 k! K) S5 B3 L5 g- j5 r
[mci]
. F# @. j6 E4 s' B' {& S4 Wcdaudio=mcicda.drv- `) m8 O2 h: T* _0 C- s
sequencer=mciseq.drv1 \* p7 _( m' l+ u
waveaudio=mciwave.drv
/ q( C# K9 b# f; [avivideo=mciavi.drv1 ^/ l5 y  I; }. U
videodisc=mcipionr.drv9 A- m8 t$ A+ X
vcr=mcivisca.drv" z4 S; r1 R7 M: Q$ C" l" w
ActiveMovie=mciqtz.drv
! A6 E- ~, o# d9 I" M5 rQTWVideo=mciqtw.drv& t7 w+ u4 n( }6 V; k/ N" r
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
' J; v+ L/ C! n! G4 ?, d
1 Z8 Y4 p# ?4 g" p: {1 s, n其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
1 s& @( Q* R9 B3 U+ k4 ]* G0 `5 N- n//------------------------------# I+ H  Y9 v: z1 ~0 W+ b" v! \
// 广告时间:
2 Y4 g! U- _' v) d- ^; @% a4 Y. q& e// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
( E* j- D) J; [- W% G0 Y//------------------------------3 E2 ~8 ^2 Z5 [$ h
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。- w' K7 E' G* ~6 u
举个例子来说,打开一个多媒体文件有以下三种方式:
6 n* g$ T2 d( ^  J& T' N8 q. R4 s" Q) C
[1]:自动识别:打开一个"WAV"文件
& B( [) z$ @6 ~" L* eMCI_OPEN_PARMS mciOpen;7 f+ \" A5 o; v/ a. g8 ~
mciOpen.lpstrDeviceType = 0;  P' G1 {+ i% g& b0 Z$ z
mciOpen.lpstrElementName = "aaa.wav";: P) W! i9 P2 U! O. b/ D
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
5 w' {. J6 C' m7 V1 I& T' ~
+ n' c6 h3 P' o: t[2]:指定设备描述:打开CD播放器
' z+ z, ?) v' A1 RMCI_OPEN_PARMS mciOpen;6 D* c- r! s: d) d) c! |7 W* c
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;% F! V# @& _$ O; S% n! {
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
. o. D6 T. ^$ O& e% t
8 {) `3 U; y5 A9 i# q2 ~, O[3]:指定描述字符串: 打开一个AVI文件4 ?# v& W, N  [) j
MCI_OPEN_PARMS mciOpen;
. b8 }& t3 P' x4 W! L# S, WmciOpen.lpstrDeviceType = "avivideo";
: w; d) ], G5 ]! t1 U, Z* e! I2 OmciOpen.lpstrElementName = "aaa.avi";
. w3 ?# K; P9 KmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);$ U/ ^( k: E# \% F& k- o

$ o, l, m2 }- B8 V, t注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
9 O4 M. ]* j3 _& d/ J+ w& y' U$ ]+ F8 Q) p. b) w& H. p8 T$ d
MCI指令
" R# d2 i5 I( w
# R# [6 A" q, o3 ^% k3 MMCI_BREAK        设置中断键,缺省是”CTRL+BREAK"( j6 H. s  k3 h! [
MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
3 o& z6 }8 @8 |3 U9 ], _MCI_CLOSE        关闭设备
- A. K) S3 g# D. y8 [MCI_CONFIGURE    弹出配置对话框,仅用于数字视频6 b$ E% N+ C, {1 t: J
MCI_COPY         拷贝数据至剪贴板( e+ c& N) [9 v, X; t
MCI_CUE          延时播放或录音* h5 }3 a+ |1 Y, `$ C
MCI_CUT          删除数据% a( t% j: R+ q* Z2 A5 }
MCI_DELETE       删除数据
. S' |7 ^4 ?+ ~7 w! A! FMCI_ESCAPE       仅用于激光视频
% D0 V: @  q' g- qMCI_FREEZE       将显示定格
6 j2 ], q- L8 o+ I/ a/ w/ PMCI_GETDEVCAPS   获取设备信息
6 f( Y! z. g: x# ~MCI_INDEX        当前屏幕显示与否,仅用于VCR设备, R) _5 l6 O% D+ b5 D" V
MCI_INFO         获取字符串信息1 }" p- u- x* o) P& l
MCI_LIST         获取输入设备数量,支持数字视频和VCR设备0 k4 {; I4 |+ ]/ F# ]) a
MCI_LOAD         装入一个文件
* g9 o0 W" |$ U1 i5 ~MCI_MARK         取消或做一个记号,与MCI_SEEK配套
3 }3 I# |$ L' g- W1 Y) CMCI_MARK         取消或做一个记号,与MCI_SEEK配套% ~0 G& E6 O/ r$ |1 J
MCI_MONITOR      为数字视频指定报告设备" H# M* }3 i$ s5 w3 p) r" h
MCI_OPEN         打开设备' f' E7 S4 o/ K) ^1 I( N* X
MCI_PASTE        粘帖数据
' _: o: x6 O. w1 Y8 GMCI_PAUSE        暂停当前动作6 z/ a, m( X4 e' \- z; y6 v/ V) [
MCI_PLAY         播放8 H( M; u6 @/ B$ Z
MCI_PUT          设置源、目的和边框矩形8 X4 [0 i3 Q. F4 C2 v. p8 z
MCI_QUALITY      定义设备缺省质量
' q# ]* L7 ^" y3 j- L1 FMCI_RECORD       开始录制( z& _  }+ T" s; ~7 K/ @+ \, m) W: {
MCI_RESERVE      分配硬盘空间2 }8 g8 ]& }9 }2 v7 a9 H. `( f& v
MCI_RESTORE      拷贝一个bmp文件至帧缓冲
- A8 [( x" O: A3 u  E& l7 s" _/ }MCI_RESUME       使一个暂停设备重新启动
+ Y9 F* F# g% Y* _! [, oMCI_SAVE         保存数据
. Y/ }  R+ B7 n& k6 v: o9 dMCI_SEEK         更改媒体位置) X( `2 s3 v3 g; v9 X
MCI_SET          设置设备信息
& a$ b# ^' M1 BMCI_SETAUDIO     设置音量
: O. K* r3 k4 b/ K3 `6 oMCI_SETTIMECODE  启用或取消VCR设备的时间码
# p, @: D9 m. c. cMCI_SETTUNER     设置VCR设备频道4 U) U# N. O+ w# F$ [- N
MCI_SETVIDEO     设置video参数( `4 s* W2 O- r  x) E
MCI_SIGNAL       在工作区上设置指定空间
) P" M% G/ x8 P& O# J8 b6 q& g5 `MCI_STATUS       获取设备信息
3 C* Q- f3 ]6 }. w  P5 Y6 IMCI_STEP         使播放设备跳帧: f1 V. ~. ?2 F& m1 I/ {
MCI_STOP         停止播放/ l+ N5 S. G& r
MCI_SYSINFO      返回MCI设备信息8 p9 M! |3 f  c! n
MCI_UNDO         取消操作
% y% I; y( |! BMCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
' n$ R0 `7 Y8 D3 b4 jMCI_UPDATE       更新显示区域0 A# g- E0 H* y  F% }& s5 d
MCI_WHERE        获取设备裁减矩形
5 [1 a. Q# w: z: Z+ v; AMCI_WINDOW       指定图形设备窗口和窗口特性
: y7 q; h, E  F5 b- d. e9 P+ g" v4 T9 z% z
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-20 08:55 , Processed in 0.037035 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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