找回密码
 注册
查看: 4860|回复: 0

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

[复制链接]
发表于 2008-1-30 16:37:11 | 显示全部楼层 |阅读模式
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
6 D5 f, e7 T  T. u; q3 W% c9 A$ _( p3 {7 p
MCI的控制方式:$ t! V; I, F+ x6 g" Z' r% I
6 b! Y% t% z; F5 R: u4 F0 I
一般说来,程序员使用两个函数就可以与MCI打交道了:9 r% b( G% p6 U* R% W0 ]. o

/ H+ t9 d, a( f) `MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);! a" ?1 U6 N; Y& {2 m
命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
8 x/ w3 v2 _- D, J) f: v0 l8 q* ?; w& e  U  ]  z
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
/ O+ i9 P( O. T0 }! J2 ?0 h命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。, f: m9 f, m' B  Y9 {, g4 X% {0 {  t' T. x

! h0 d6 }# }: E; L6 r对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
# P  I7 S8 [# b* T% W1 j
0 m2 n  L$ C6 k; F: c2 d( b4 @. l对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
0 s6 p( f. ~$ V7 d9 V1 n+ b' S9 f# A- E& T* @+ u# F
举例:
3 Z) @) t* s2 ~mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
0 X! u1 I( m( H: J$ amciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
2 I$ k5 [$ A/ P9 U' m; J) }8 O: j% X( F& `
MCI的设备类型:
6 }) ?: {! S% F* M2 _' ]$ n3 Q% j, r! i  D: _# A' W- i
设备描述                    描述字符串      说明: \( U. U  W' F, w- e$ z: M
MCI_ALL_DEVICE_ID                           所有设备
) i9 g2 ]( M4 O7 F2 p1 i6 WMCI_DEVTYPE_ANIMATION       Animation       动画设备8 d2 n/ v& N' F+ f
MCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
. r/ ?8 m' Q5 EMCI_DEVTYPE_DAT             Dat             数字音频
5 Q; E- `3 o8 oMCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频' _/ l! O2 v. T3 N; v8 H
MCI_DEVTYPE_OTHER           Other           未定义设备
4 v8 w2 r+ j0 T* U( fMCI_DEVTYPE_OVERLAY         Overlay         重叠视频, [- k6 u$ {$ ~( p3 m3 v- j( ^
MCI_DEVTYPE_SCANNER         Scanner         扫描仪
0 E3 t$ u8 k  [MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器7 C( e  J" O1 @9 N0 H
MCI_DEVTYPE_VCR             Vcr             合式录像机2 N) T" e2 R* y" K  S& z
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘. Q% ^+ |. M0 V
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频
# P" Z, l  q" l6 A5 T: D2 r3 M% R2 e/ i; g3 y
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:, Z5 F* E  g4 ?9 Q, s# w

9 N9 w( L0 Y5 U! A( ]- C" p[mci]
/ Y6 M" J# g# U8 u- acdaudio=mcicda.drv1 |9 I/ }) p; L# a0 ~  R
sequencer=mciseq.drv4 ?+ g5 m7 p+ F1 H: w9 e
waveaudio=mciwave.drv
9 D$ T) K( l% l- P5 ^" b# Savivideo=mciavi.drv& [' I3 I) ?7 ]* O5 G
videodisc=mcipionr.drv
+ Z# @# M0 `+ T0 G/ zvcr=mcivisca.drv2 `9 ]3 L2 P3 t( E% n7 X
ActiveMovie=mciqtz.drv
2 Y* ]6 W: d1 ]  u, }QTWVideo=mciqtw.drv' E! f$ c% }1 Q7 k  }+ H' A0 E' o, o
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll+ z* K% q; T5 k* _+ t! ~1 x# _

) ~9 r- G8 z; ^* ?# ?其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
5 V: _0 l. T! f' y  f3 n//------------------------------" M2 z$ r. \5 S, ]  y- u" G  H- n
// 广告时间:2 y' s  ~, C' E- h- i7 |( S- k# p
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
) }( k4 \( i6 ]//------------------------------/ n  C9 ?, I  T3 J3 x
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。( M4 x4 I3 s8 P' n) e7 Q( [- D
举个例子来说,打开一个多媒体文件有以下三种方式:
7 S9 p4 f; k2 T" ?
: F# L5 |: t+ Z! r* \% l[1]:自动识别:打开一个"WAV"文件4 }0 i! i8 s! T- q' x' s1 j: Y; o
MCI_OPEN_PARMS mciOpen;
+ T& q  K- n5 n! PmciOpen.lpstrDeviceType = 0;  k2 Q* v, B8 ]( H9 b
mciOpen.lpstrElementName = "aaa.wav";( t$ X3 h/ s; W$ l6 z9 W; A
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
! y. R3 }. H6 E7 |4 M* Q! J( U/ J5 s
[2]:指定设备描述:打开CD播放器
, h8 O. r4 e7 X* s/ d6 H" r/ i& V5 xMCI_OPEN_PARMS mciOpen;' Y5 E6 x8 _6 p/ _1 L+ h" e# i
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
) R: r4 }& ?  ?) j% N8 s0 SmciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);$ x. y% l5 a3 S
1 e2 u4 r; [6 ]% l: u1 {7 D
[3]:指定描述字符串: 打开一个AVI文件
% t' P1 c2 e3 q+ D/ bMCI_OPEN_PARMS mciOpen;' k' Q0 T3 a8 L. \, W0 w1 f# w
mciOpen.lpstrDeviceType = "avivideo";1 t! S- I  ^5 n
mciOpen.lpstrElementName = "aaa.avi";; Y7 Q: @, @2 V& J. C6 p
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);2 s; n  G( N1 w+ E# U$ _+ p$ U. B
, {. \1 Z3 h% T7 m) M( D
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
8 y' z0 }. |4 J; _5 X5 B, G- L/ G% }! E/ P( M! k; A; H
MCI指令 4 T0 ^" y' m9 A# x" H

: ^# z1 O8 S9 B% WMCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
8 ~- b2 e. E: Z$ @6 x! ^& ^MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频# r2 j$ S. [' v( Z/ C, G6 @
MCI_CLOSE        关闭设备
, q* h0 w+ |7 EMCI_CONFIGURE    弹出配置对话框,仅用于数字视频
  b: K+ L) U7 L* ^4 n% N) G2 ~MCI_COPY         拷贝数据至剪贴板
; E0 Y$ o9 G6 }7 i& {- h2 c5 S( oMCI_CUE          延时播放或录音" N) H3 D; k$ B0 x" v; k5 R$ Y
MCI_CUT          删除数据3 M. T! F% U) f$ o. T' Q) X, W1 Y
MCI_DELETE       删除数据
) s- Z# x; \( ?" a; z/ {$ ^0 E5 IMCI_ESCAPE       仅用于激光视频
9 [1 Z' K0 d. ]# cMCI_FREEZE       将显示定格! J. q* [4 C  i" O5 `* V
MCI_GETDEVCAPS   获取设备信息2 _9 K+ Z& W: U: u$ \$ i0 N$ l
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备" b* x% r. H' q% g: F* x
MCI_INFO         获取字符串信息- @8 D  S4 K3 }8 T3 K3 l
MCI_LIST         获取输入设备数量,支持数字视频和VCR设备
1 R& Y) F+ T4 F- @+ XMCI_LOAD         装入一个文件
5 j% R, j, f% mMCI_MARK         取消或做一个记号,与MCI_SEEK配套
9 S% F7 h1 c. M( l2 m( E% o& LMCI_MARK         取消或做一个记号,与MCI_SEEK配套
* v; r; h5 v# kMCI_MONITOR      为数字视频指定报告设备
( V& i! a( J/ e. V/ zMCI_OPEN         打开设备
" \/ l# V+ R/ @) SMCI_PASTE        粘帖数据, G+ C1 k. l& I; d5 ]
MCI_PAUSE        暂停当前动作0 r1 w" b# R6 S: B. m& ^
MCI_PLAY         播放/ P; k! U3 A# }* R
MCI_PUT          设置源、目的和边框矩形; s6 w/ ?* ~/ r! ]& p  I" H
MCI_QUALITY      定义设备缺省质量( K6 d% P% t! l
MCI_RECORD       开始录制+ V# V- h" w2 A) I3 s0 Z1 [6 w
MCI_RESERVE      分配硬盘空间
( b+ J' n# H. _! SMCI_RESTORE      拷贝一个bmp文件至帧缓冲1 l8 w. c4 y4 l- N8 b8 m
MCI_RESUME       使一个暂停设备重新启动& y- ~5 @7 a+ s5 K
MCI_SAVE         保存数据3 ?) S+ w; o+ N# X- f% h
MCI_SEEK         更改媒体位置. R! {1 r) k# X7 `2 r0 R1 V  ^7 y9 v
MCI_SET          设置设备信息2 |: n* c% ~# b$ [: K& A* g  j
MCI_SETAUDIO     设置音量
' ?/ p, r9 K1 cMCI_SETTIMECODE  启用或取消VCR设备的时间码2 H, @# _' w& p) O& k; B
MCI_SETTUNER     设置VCR设备频道
9 N$ l: E, \# C( p8 i! Q: l& z! jMCI_SETVIDEO     设置video参数& O$ d* E: u1 `
MCI_SIGNAL       在工作区上设置指定空间
# B: i9 t. _( `9 R: v; g5 }0 X4 xMCI_STATUS       获取设备信息1 }! g: n' W' v6 ~# O/ I$ r
MCI_STEP         使播放设备跳帧. H/ V5 ^0 r9 w4 u# p
MCI_STOP         停止播放
0 Z. O' W9 }$ N6 r. y& `* eMCI_SYSINFO      返回MCI设备信息2 p# b- ~3 S& {/ \0 O" r/ N
MCI_UNDO         取消操作
* C0 N! I6 ?4 H& k+ L1 v5 \. U/ {MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动
  r* e! L- @7 _1 x& w6 ~$ SMCI_UPDATE       更新显示区域- Z4 [5 f& j' G4 t5 i
MCI_WHERE        获取设备裁减矩形; J' }) r' g$ A9 r5 O! @% U2 A" N
MCI_WINDOW       指定图形设备窗口和窗口特性; o- y9 A, j0 P- C, s  d

% m( `' z2 h/ v' |; V其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:18 , Processed in 0.017946 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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