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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。" t0 C* `, ~2 _* O: U
* @; H- }+ K( a
MCI的控制方式:
8 O. H  v7 R+ k& _6 a2 G6 t6 b0 P6 u7 L8 I" e. k+ K- {
一般说来,程序员使用两个函数就可以与MCI打交道了:
; h+ Y  H4 x& M) _  G( X- d) T+ a7 n4 \5 Q% H
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);6 z' `2 g% H9 I' k! d
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
9 V) S8 w) q; C* h* Y7 f0 C" k6 G6 Z3 V, N! M6 K+ W
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);' i0 N7 c% g; k) V  [% E) T! b* E
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
6 I3 Z1 l9 e6 X! b5 k+ j
( l! u( P3 v" F8 c7 p5 n; q" h对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
' e6 T5 w0 c& b- p1 f6 }1 v; y: f: J  u
对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。7 e4 m2 B1 m7 v$ M- K$ q2 y0 x

5 ~5 t* F8 a, J# l, h9 \举例:
& J. m" Y' k7 w! m) P: ]$ I' l1 fmciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
; D* P8 _) |* y! L2 Z6 s& TmciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
  F7 t) b6 ]4 w$ d9 F3 [& W
6 h) [! J& o! m3 M( y" k' q. b1 oMCI的设备类型:6 y5 e- s* V. p, O

7 x/ X* e; A1 l( ~" i设备描述                    描述字符串      说明
5 p: O/ H8 ~( x0 N( y0 @  CMCI_ALL_DEVICE_ID                           所有设备
& {# p* e2 l) H) F. G3 c1 BMCI_DEVTYPE_ANIMATION       Animation       动画设备" W: n. x3 l! Q! C
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频5 [  c7 `* c3 A9 l! Z
MCI_DEVTYPE_DAT             Dat             数字音频
( n+ m. O! B" x/ f0 f  I! f; vMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频
( I" k5 |: q- Z, W# mMCI_DEVTYPE_OTHER           Other           未定义设备  z& L7 q% C; L% c, g$ t4 e- x; T
MCI_DEVTYPE_OVERLAY         Overlay         重叠视频
" F  i6 {9 S, b  R5 N% w  M/ O% O; oMCI_DEVTYPE_SCANNER         Scanner         扫描仪8 s( d: C) x0 F/ Q4 H
MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器
0 F3 _$ S( a& F1 OMCI_DEVTYPE_VCR             Vcr             合式录像机
- Q( \. s! V  Q# R0 ~- P8 XMCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘
) x8 o- [4 }% OMCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频0 g, E* V- b0 w" D

) D( R+ w6 P& t对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:- h. w8 w  u6 e3 @& a% d

" z) ^4 B3 O8 M; _7 y; E[mci]
* v' [) w6 n, S& Qcdaudio=mcicda.drv
  w  A1 O3 u& Q: M+ @3 Vsequencer=mciseq.drv" u/ E7 t  ?0 L2 E* @4 x( D
waveaudio=mciwave.drv$ \) |) I5 e3 v5 [+ {; F
avivideo=mciavi.drv- |  q* |2 G# J- A! `
videodisc=mcipionr.drv
( B2 U+ A' H$ Y* }* I$ pvcr=mcivisca.drv
. G- z. S* d! e* S3 ]6 i! {2 JActiveMovie=mciqtz.drv" G! b) Z; {) I! R. f) ?
QTWVideo=mciqtw.drv$ y% b$ X) t( H; @/ D
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
3 q: l+ @% o/ }$ W2 R# X
% W/ @3 B4 ~- _) X其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
# I% J/ e. n. ~//------------------------------: }( l  ?9 F' N9 X5 L
// 广告时间:, v: b7 f9 ?% a) |2 b. B( \; X
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
; U8 L  Y8 `* }, ?. l, K//------------------------------( ?/ z8 e; H1 ^! _: B* _) S( B
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
8 z$ y8 {; a8 [8 H$ `1 \' p举个例子来说,打开一个多媒体文件有以下三种方式:
/ S" r& @! k2 l6 r- \  x# U0 X
[1]:自动识别:打开一个"WAV"文件
! o* H5 `5 u0 }, x( R6 S" ?MCI_OPEN_PARMS mciOpen;
0 V9 Q4 B# y6 _# c: g: smciOpen.lpstrDeviceType = 0;
- [3 X/ O( l7 H/ umciOpen.lpstrElementName = "aaa.wav";
1 b. r/ J/ S& W% tmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
" |" S: D& z/ z; A4 N
& c0 l( A) p1 k$ ^# l" Z" ^[2]:指定设备描述:打开CD播放器  k* k  s1 }# ^5 i
MCI_OPEN_PARMS mciOpen;
: Z* L  ]1 ?  o2 K( ^mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
& U: E1 l0 ]( J1 ymciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
! ~) H% ^) a: m0 g5 V8 l: k% b" }
[3]:指定描述字符串: 打开一个AVI文件9 x5 s# Q; g! j( l
MCI_OPEN_PARMS mciOpen;
" X8 }5 z7 z6 Q" W6 G  A' J  S+ MmciOpen.lpstrDeviceType = "avivideo";
5 H* M+ l& ^8 w* k8 X9 KmciOpen.lpstrElementName = "aaa.avi";8 _% e  A! }; i% O( v% z+ i
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);# i8 i. _9 ^" `; a0 M  K) r% e( s% B
0 w& z, G: ?0 @( y6 B# Z
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。0 ~7 Z! s6 n& P# U0 ?
( o4 a2 y7 q$ j# C
MCI指令
9 W" X2 }% T+ Y; R- g+ _5 O
7 {# D0 f; G) d/ S) E8 ~) @MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
) y5 N5 o5 A9 ^$ q* H8 BMCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
" d  J8 @4 q$ p# f" |$ @" d) p/ |MCI_CLOSE        关闭设备' Z4 e6 c5 e3 {' v. O# E( o' D: ?2 n
MCI_CONFIGURE    弹出配置对话框,仅用于数字视频5 z# M" A5 b/ ]1 j7 O( P
MCI_COPY         拷贝数据至剪贴板
% N- x5 h6 Z6 X- eMCI_CUE          延时播放或录音: t% R$ O! m0 c  B
MCI_CUT          删除数据: z' o" v4 R" a2 @& \
MCI_DELETE       删除数据
" ~2 m% F3 q6 q; j1 I' FMCI_ESCAPE       仅用于激光视频
% y7 Q4 D8 K1 I5 {' V5 z8 TMCI_FREEZE       将显示定格
) s, y! H7 b* a; J: V- a0 ^( {+ O1 ZMCI_GETDEVCAPS   获取设备信息- T5 _6 m: W: R
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备4 j+ y. i+ J/ ?4 E
MCI_INFO         获取字符串信息
( N1 e$ }; D1 q9 g9 iMCI_LIST         获取输入设备数量,支持数字视频和VCR设备
- p$ j+ G7 \$ }; l% @$ E2 GMCI_LOAD         装入一个文件5 N5 U9 l# B  z* K
MCI_MARK         取消或做一个记号,与MCI_SEEK配套  h, D8 q9 s- S  j
MCI_MARK         取消或做一个记号,与MCI_SEEK配套1 u- V- m) x2 ]7 [. r; ]1 _
MCI_MONITOR      为数字视频指定报告设备
* w0 n( i/ T: o) P( ?7 ~2 |5 TMCI_OPEN         打开设备
8 r& i! d$ A# L9 ]9 |! y$ gMCI_PASTE        粘帖数据' F9 ^) J& [4 f7 Q) h4 n, T
MCI_PAUSE        暂停当前动作( `7 p  W+ L' g$ J# U! e
MCI_PLAY         播放
2 Q; l; p; @' g3 @6 v1 pMCI_PUT          设置源、目的和边框矩形  _0 N- H- h1 f0 \9 Z" j
MCI_QUALITY      定义设备缺省质量
  y* }8 i4 _* P: hMCI_RECORD       开始录制
) x# n; V; [; a- {& s7 p2 hMCI_RESERVE      分配硬盘空间
- I. \2 M! s9 Z/ T. IMCI_RESTORE      拷贝一个bmp文件至帧缓冲
1 g* l9 e1 {$ m0 z- bMCI_RESUME       使一个暂停设备重新启动! x/ i) W) k  \# T" b  q% {
MCI_SAVE         保存数据
; d1 C% i/ J# \. c: E6 u( E2 U4 l! P% ^MCI_SEEK         更改媒体位置
9 ]  i, {7 s8 Q, C7 {; N$ }* ?MCI_SET          设置设备信息
* D7 R" o: ]9 ?# h( m: y7 HMCI_SETAUDIO     设置音量' o! |7 Y" U1 @
MCI_SETTIMECODE  启用或取消VCR设备的时间码
2 }, r& [( W! \4 Y2 E. D  e  R" uMCI_SETTUNER     设置VCR设备频道+ `1 D. w% u: ]& E4 |7 `
MCI_SETVIDEO     设置video参数
# f% j: S2 I; Z6 h& _# E% @, aMCI_SIGNAL       在工作区上设置指定空间7 J$ c0 b' x5 v6 p2 N0 A  X9 J/ z
MCI_STATUS       获取设备信息2 N3 _! B5 ~; _0 W2 g( i# ]  {
MCI_STEP         使播放设备跳帧
1 l0 q& q" f) M' uMCI_STOP         停止播放
# r9 s1 ?) T( \2 U: s) pMCI_SYSINFO      返回MCI设备信息0 H% i/ ?. `7 Z1 a- ]
MCI_UNDO         取消操作
, _- {% k- l- n: o/ f! y. {9 y9 _. [MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
& z/ ^' L8 _9 T6 t  X: C6 @MCI_UPDATE       更新显示区域
" H# ]; @  |! F5 tMCI_WHERE        获取设备裁减矩形
* \. ?$ F$ C4 W$ i1 s+ qMCI_WINDOW       指定图形设备窗口和窗口特性
8 B3 m% O$ Q; p# C3 b8 t, }# @, W! M! T
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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