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

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。# @2 C  u! J2 L& X0 I* [" ]
7 F5 [/ l8 h* a% Y4 D
MCI的控制方式:- f/ S* E6 V7 ^
' v1 s7 }! z9 H* o7 _
一般说来,程序员使用两个函数就可以与MCI打交道了:1 r$ W2 R5 w! p3 k& H9 P

  A# R$ K) k2 Q$ f2 y  L+ zMCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
! X+ P1 b; \: i' F/ A+ h: I命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。7 m9 ?, S: v* b% u

) j) {  ?5 Y! b- R4 u+ DMCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);/ i  q5 ~' Y5 V5 k- J$ y
命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
4 R" ~7 E  E  p8 j4 _. E. r4 t* I( B( T  t
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
6 s3 S# F1 c0 t8 t- ]* v$ }
  \% H0 }8 I  ]1 x% R& p对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。! H: L9 [( I+ k% ]" O9 i

2 Z& Z+ ?) h3 ~8 |3 k$ Y2 p. A( n举例:. v5 k9 C  h: K4 h
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备( w: T0 T6 g/ P/ |9 c
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
7 ^, k8 F# y2 d$ Z
3 E0 n* t  ?/ nMCI的设备类型:
: e0 s0 X: t* @% p
5 i" }/ J  z, z' Y设备描述                    描述字符串      说明
0 `9 e  [) T3 x. L% H# IMCI_ALL_DEVICE_ID                           所有设备
( S$ `! ~4 a: X+ ]MCI_DEVTYPE_ANIMATION       Animation       动画设备% g, [  C& }4 |; _4 A1 D5 K- ^
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
# w1 V  t' W7 K& v. r6 X3 ~MCI_DEVTYPE_DAT             Dat             数字音频5 H) U' p2 E! G
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频7 s% V& y1 I3 Z& _" W- J0 W( C+ o
MCI_DEVTYPE_OTHER           Other           未定义设备/ T' ~- @# r2 B( R. k; L: v( c
MCI_DEVTYPE_OVERLAY         Overlay         重叠视频; t2 p4 z2 L5 ]; C$ m
MCI_DEVTYPE_SCANNER         Scanner         扫描仪
8 n6 O# h/ \2 {MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器6 N- ~4 X. ^& O% Z1 }8 t0 z6 [
MCI_DEVTYPE_VCR             Vcr             合式录像机
" Z. Q0 g7 j$ J  u  V+ c1 RMCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘/ o5 k, W1 q! o. [- i' l
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
  @" o9 I3 P% ^$ D  F( `! m5 j8 P) Q; g% P( y! g
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
+ h9 H3 J' v* J$ O1 }* r$ w7 l  o3 l9 |' s9 U! u
[mci]6 G! c% b6 J" O( g& V3 V
cdaudio=mcicda.drv
0 p4 `3 I5 k+ G& k. ssequencer=mciseq.drv
* S6 B% {1 O# S+ Z8 ewaveaudio=mciwave.drv, u! d/ i5 ^+ q: I- d* [+ F
avivideo=mciavi.drv. T4 o; S( r5 W
videodisc=mcipionr.drv: L! C% g* `7 R/ ]
vcr=mcivisca.drv% R+ B6 h, u2 ]$ e0 q) c
ActiveMovie=mciqtz.drv, _& k' [7 ?3 ~
QTWVideo=mciqtw.drv
" \7 w$ N% M# b6 hMPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll  [1 i6 m8 w- z9 G: g

& c- w2 J1 F4 `+ @3 d$ W其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。7 d/ t; B( ]" _+ ?& r4 [
//------------------------------
! {' C0 ~$ m8 d4 r! [% ~* a// 广告时间:9 ?$ P) l1 z9 I8 k: ^4 \# m0 ]
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
9 ^2 y& ?$ V4 [7 u8 c5 I//------------------------------
7 a; Q. Q2 }; F1 H! R在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
3 p1 B  Z- i1 x9 C5 i举个例子来说,打开一个多媒体文件有以下三种方式:
& V/ l6 i1 \/ i  i# H0 c) u- F6 k0 u( ^% q# ?' X/ u
[1]:自动识别:打开一个"WAV"文件3 @4 d) P& B8 a
MCI_OPEN_PARMS mciOpen;
! W7 T8 X! m  \+ P& w/ G5 m; zmciOpen.lpstrDeviceType = 0;
: m# S0 N5 Y8 C+ e, U5 v0 EmciOpen.lpstrElementName = "aaa.wav";/ i1 Q9 I: z& p
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
  G$ `1 }# M* Q( ~% d0 ^( \- m5 Y; z+ [! V
[2]:指定设备描述:打开CD播放器/ H/ A8 ?+ ~1 Y- e0 l
MCI_OPEN_PARMS mciOpen;
  w' h3 N4 B) i) C4 AmciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
  g0 Y4 G, y, k* \! `6 vmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);. R$ Q( [2 F0 }( O- Y$ j

. ]2 X5 c$ G! I[3]:指定描述字符串: 打开一个AVI文件
. t  N- g8 ^/ s  [+ W/ `% @' D) ^: }7 rMCI_OPEN_PARMS mciOpen;
; p! [: o6 P- \: EmciOpen.lpstrDeviceType = "avivideo";
  A4 a: G" \: ~7 wmciOpen.lpstrElementName = "aaa.avi";
2 w" y' z9 O( T$ z% v, imciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);- P% B# Z% }' U8 q3 c$ R- \* a
, T8 N( e, q9 h5 \
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
5 ~" n! I' o! N0 x0 _0 }" i3 \) h1 W
( ?( h7 O" V- q) v0 z: xMCI指令   o( v0 q( x) R  N7 ~: z/ M4 u
- z! S* p" L8 @& L
MCI_BREAK        设置中断键,缺省是”CTRL+BREAK"& s) Y! T0 ]' _2 S
MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频) A& s! {" S) F' U4 \" X' W
MCI_CLOSE        关闭设备
' \7 J$ Q9 C' G) Z* PMCI_CONFIGURE    弹出配置对话框,仅用于数字视频
% P. q  e3 t# dMCI_COPY         拷贝数据至剪贴板
5 U3 {; ^) }3 a  B" e0 FMCI_CUE          延时播放或录音
3 n4 `: l$ s! x  Y5 XMCI_CUT          删除数据$ B. T3 C# u0 Y: L) F5 _
MCI_DELETE       删除数据
  i. O; w; f4 l2 kMCI_ESCAPE       仅用于激光视频
. O* U' j  b2 I# X" ?" `* t) b( B$ QMCI_FREEZE       将显示定格; J& \0 |6 F% Y4 g* @. m
MCI_GETDEVCAPS   获取设备信息- `; P% v! g( n) D$ ]
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备
. ^/ }6 z- S7 W6 }9 gMCI_INFO         获取字符串信息9 ?; V6 V/ m& {  z7 ^, \
MCI_LIST         获取输入设备数量,支持数字视频和VCR设备
1 k& |1 M  g! ~( ZMCI_LOAD         装入一个文件( h" k2 Q/ F: E- M! s8 z4 a
MCI_MARK         取消或做一个记号,与MCI_SEEK配套3 K$ w/ Y% @- V' v+ U" }2 S& m" q% z
MCI_MARK         取消或做一个记号,与MCI_SEEK配套, n6 A; m* A/ F. p% b9 j
MCI_MONITOR      为数字视频指定报告设备- ~& C5 J' K) q  b9 ^4 r
MCI_OPEN         打开设备
+ ?2 b3 I; Q5 `/ ~6 TMCI_PASTE        粘帖数据- Q8 x. o# Y( i1 F5 n. l+ j2 H
MCI_PAUSE        暂停当前动作- `7 ]) {% s& y0 ^
MCI_PLAY         播放9 j1 f3 u1 o. v6 _$ C2 B  x
MCI_PUT          设置源、目的和边框矩形3 |6 y2 p. b  a& ?. Z; {
MCI_QUALITY      定义设备缺省质量/ ^8 C- F6 c+ ~* q. W
MCI_RECORD       开始录制7 i8 x9 U/ y( }' Q8 I4 P6 R
MCI_RESERVE      分配硬盘空间9 v. J  a2 @: q  M
MCI_RESTORE      拷贝一个bmp文件至帧缓冲1 _+ B+ J3 A( s/ c6 Z
MCI_RESUME       使一个暂停设备重新启动& o! r1 j4 S" w0 o' P- C: c
MCI_SAVE         保存数据
8 y  K5 G" q1 p, J9 r2 L" ?1 FMCI_SEEK         更改媒体位置
. b. [# z& Z; j+ _8 rMCI_SET          设置设备信息
  [- ~# j# s7 r: `; C$ XMCI_SETAUDIO     设置音量# f4 q+ C& O5 W3 l" b
MCI_SETTIMECODE  启用或取消VCR设备的时间码
; R3 b7 [) t- k* r% s# WMCI_SETTUNER     设置VCR设备频道6 M8 l' y, }3 U- K1 T( h
MCI_SETVIDEO     设置video参数2 D* u1 y$ X% p/ X7 Q
MCI_SIGNAL       在工作区上设置指定空间5 s4 \2 r2 R6 Y
MCI_STATUS       获取设备信息
" l3 M( j; M( c. M8 y9 J9 i1 jMCI_STEP         使播放设备跳帧; o& L, i" }- x
MCI_STOP         停止播放
+ F/ q9 }. @5 nMCI_SYSINFO      返回MCI设备信息2 y/ o( C  ?. u7 d: t* \
MCI_UNDO         取消操作
; U% S/ b1 y4 |$ N% w$ J5 CMCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
! m, ^' y) G2 o! fMCI_UPDATE       更新显示区域( a! i) q% u6 j- y3 t5 E
MCI_WHERE        获取设备裁减矩形
" ]: t0 x* F7 d" |MCI_WINDOW       指定图形设备窗口和窗口特性
. h4 {4 _( p3 Z$ d
8 K  S# Q! C8 J; w: t7 A1 c) J5 P% A其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:41 , Processed in 0.017740 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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