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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。: B/ t. U4 v" `9 t$ t, X- A- z

1 [9 n) \8 s* d% JMCI的控制方式:
! S# `5 D6 w$ Z% Q( T
3 ?0 ~+ |7 A0 X$ ?一般说来,程序员使用两个函数就可以与MCI打交道了:
# [2 a  ]+ o" y. S" V' n2 ~, {' ?9 c5 x. d: V: k5 u  o6 g9 t
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);; q  M: P: N9 W0 @. q5 r# b7 f0 G4 R! M
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
5 d, N- j7 d3 Q* l2 T4 E& H" X
: p# {. w+ V" p! s, _8 nMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
+ Q4 \3 r' d6 Y* T" s# w* b$ h命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
0 }% I$ ~1 M# e
+ X( X  T, k: C) @3 s* `对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
% s  r  [$ x& N9 x. J7 s+ p. V4 G+ s0 q, F, O( r
对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。9 c# _  X4 M/ F8 V" Y$ L

) z" D9 Q! b. Y* X$ C/ _  h; K: B举例:
" G4 Z+ D- D- @' S; x5 F8 JmciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
9 Q5 \6 l' C, }* E7 smciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
& t5 r4 b8 Q, D" i% Q4 z1 H7 R4 h% }: l! Z) T/ W2 z8 u- a2 q
MCI的设备类型:$ p- s- v) y1 h( o, D

/ h* f- m  m0 f2 y# b设备描述                    描述字符串      说明
' |' K0 _( {. D# a2 v( ^MCI_ALL_DEVICE_ID                           所有设备
  m1 d: j* p: a0 D6 kMCI_DEVTYPE_ANIMATION       Animation       动画设备  q( R: h% X! i* [
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
; Z* w9 p" @( r7 L+ d6 _MCI_DEVTYPE_DAT             Dat             数字音频1 E6 X4 X2 k' U" M# V
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频0 G3 H1 S5 x& W" c: _* j2 Q
MCI_DEVTYPE_OTHER           Other           未定义设备
2 N" R) v& ^. {/ S& M$ Q4 A% ~MCI_DEVTYPE_OVERLAY         Overlay         重叠视频
" m" x1 q/ ~/ L0 R% s' IMCI_DEVTYPE_SCANNER         Scanner         扫描仪% @& I+ `1 {1 R* Z! W7 T
MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器% f/ C3 a. ?% |* I
MCI_DEVTYPE_VCR             Vcr             合式录像机' g+ Q5 Q" F; r4 N& t) A
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘" O$ Q( L+ h1 B+ z* v5 @
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
. v, o" O) {# ^) D0 r. P6 h1 H; Q1 [4 i4 x6 N# |" H( u
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:1 x! y& D4 l4 b( q* A

& ?  o: p% l- j( u* v& f" L% D% L! G( N1 ?[mci]# S% Z! x  u4 n$ h
cdaudio=mcicda.drv7 r+ j( S/ O7 ]+ `- G8 M
sequencer=mciseq.drv
+ u1 W5 e4 u& d, }. c6 ^waveaudio=mciwave.drv
" i) d2 J; M4 P* b: ^avivideo=mciavi.drv0 W/ \: e- L  }: n" P7 u2 \3 A
videodisc=mcipionr.drv
( b5 K- f) p* A$ H5 b$ Fvcr=mcivisca.drv* ?1 D3 l6 T0 {- T
ActiveMovie=mciqtz.drv" F$ Y/ _* f8 k2 e8 N$ z
QTWVideo=mciqtw.drv
0 E! L4 ~6 k4 q, M& G; ^MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll8 j! @3 k) C. }& y( h3 ~
& X/ S2 @. J; Y! Y& w! [$ ^, T
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。. g. q" V6 |) p1 S  k" o
//------------------------------
; b) P; F) U. u  O1 Q// 广告时间:; U) ?* C6 P% B, Y
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
: a* p: A5 o. r3 K//------------------------------( B6 n! B! y. Y8 D
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
6 T! W. b- J0 v  T举个例子来说,打开一个多媒体文件有以下三种方式:) [  p, ^. [6 ]/ D8 x; ^& R$ E# m6 _

+ {# a% d" U5 ][1]:自动识别:打开一个"WAV"文件
. C  x+ V/ @" e/ oMCI_OPEN_PARMS mciOpen;
  B5 Q8 u; t# a4 V, cmciOpen.lpstrDeviceType = 0;
) @( L( q' j8 O: }2 y! z2 D$ c; ImciOpen.lpstrElementName = "aaa.wav";
6 O5 H3 m% k; q; K! e  ^7 ImciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
- t# x& y( |0 W
* z0 a- p, [  h[2]:指定设备描述:打开CD播放器
) r4 G1 s1 Y% _2 h" v) WMCI_OPEN_PARMS mciOpen;% e% i1 i; R' o9 e
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
) k0 U) }( A) X6 dmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
# B- q- X5 K3 E) h
" k4 Q- }7 n4 h7 {4 O) [[3]:指定描述字符串: 打开一个AVI文件
. Z: V/ v, l. Q" ?+ L; F* C; F; h3 HMCI_OPEN_PARMS mciOpen;
5 B8 P- A+ h' E# F- GmciOpen.lpstrDeviceType = "avivideo";$ d; G+ b# G% Q8 W' k% H
mciOpen.lpstrElementName = "aaa.avi";3 u- q! G% y* j* t" F
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
, O7 I) H+ n, ^/ j# F3 G+ p) u2 _* x# {
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
) U- [. w" H2 c
8 L5 H+ o4 W: d$ I0 e5 [! I: BMCI指令
& o) a8 @, A1 k  `  _
. D& c/ ^: u* A! w' }% O3 ]! J7 {MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
; b+ Z$ G( T' ^MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频) L- z* I) C, i
MCI_CLOSE        关闭设备
, c7 [( `" E3 X( [MCI_CONFIGURE    弹出配置对话框,仅用于数字视频0 E6 t+ d3 e1 c- e6 w
MCI_COPY         拷贝数据至剪贴板6 I! J2 X& e2 v, z4 @* u
MCI_CUE          延时播放或录音  Y/ A) f1 l' i5 n9 f+ e
MCI_CUT          删除数据
+ r! L3 X0 }! j/ u) H! cMCI_DELETE       删除数据; E7 n3 A. E" D! ?& S) e
MCI_ESCAPE       仅用于激光视频  {0 H7 [6 A; M+ B: x- y1 R
MCI_FREEZE       将显示定格
) l' e( }( b- WMCI_GETDEVCAPS   获取设备信息
1 `! ?" d3 V: L, W7 D1 S6 GMCI_INDEX        当前屏幕显示与否,仅用于VCR设备
3 K2 W7 c+ R  N" LMCI_INFO         获取字符串信息
( w( u* |2 j6 W9 ~) U2 d0 `MCI_LIST         获取输入设备数量,支持数字视频和VCR设备
( w+ k- `! W3 w, N  Z; ^) U# cMCI_LOAD         装入一个文件  o) q9 ~* U; s( [$ O0 j. h, g
MCI_MARK         取消或做一个记号,与MCI_SEEK配套% H& t  J& ~$ A8 @! O$ J
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
" Z7 M; i- S2 x. A/ ]9 Z- yMCI_MONITOR      为数字视频指定报告设备8 U) o, N* Z6 v, L& W
MCI_OPEN         打开设备
3 m' Q8 v6 v. aMCI_PASTE        粘帖数据
5 P/ W. d  @7 Q) VMCI_PAUSE        暂停当前动作
1 A1 r4 q' s  X! mMCI_PLAY         播放
- I- q' P& Y2 x! n3 m% cMCI_PUT          设置源、目的和边框矩形
; c* ]& S; q) c( z, G4 [0 K8 WMCI_QUALITY      定义设备缺省质量. e! O& A! P' S1 x# ^
MCI_RECORD       开始录制) `4 y. J3 S/ R- U- |% d2 @
MCI_RESERVE      分配硬盘空间  u) O- C8 R- J* f8 y
MCI_RESTORE      拷贝一个bmp文件至帧缓冲
1 v& D* Y3 x+ x' S9 B1 UMCI_RESUME       使一个暂停设备重新启动6 k3 k; X9 W4 o
MCI_SAVE         保存数据( k/ V4 h1 \4 `. e- n
MCI_SEEK         更改媒体位置
$ F7 c; @3 V  z( tMCI_SET          设置设备信息" @- q# d! F5 I
MCI_SETAUDIO     设置音量
; ]0 y& _. w! m( m" e5 D6 VMCI_SETTIMECODE  启用或取消VCR设备的时间码
% r' v4 E% e4 D' v; rMCI_SETTUNER     设置VCR设备频道6 P" a& H- o7 m/ f
MCI_SETVIDEO     设置video参数2 K& I) {7 S% f" l& U8 {: R
MCI_SIGNAL       在工作区上设置指定空间* p0 A% P5 u/ {, u  S
MCI_STATUS       获取设备信息  _* {$ V, \% P0 Y) U5 q
MCI_STEP         使播放设备跳帧
" p% D0 ~# j- P% aMCI_STOP         停止播放! l) g7 ]- h  M! ~
MCI_SYSINFO      返回MCI设备信息2 N, `: m5 w2 h# @" h7 Q
MCI_UNDO         取消操作
: I. @+ h- C) R+ D! H, IMCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
' l& y2 u/ ?2 V2 N6 n  c6 aMCI_UPDATE       更新显示区域  |) J) Q) q# H  z. N7 g. P
MCI_WHERE        获取设备裁减矩形3 X1 S1 ?' J; K( ^/ \) b# t
MCI_WINDOW       指定图形设备窗口和窗口特性( X+ ]( c; G% }7 g
- L8 H; ]! O5 g1 t9 f
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 23:43 , Processed in 0.022036 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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