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

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

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

# }6 A/ u# P. i5 z* A9 BMCI的控制方式:- C& J0 |# Q& f

; z2 i3 w( O9 k% e+ i一般说来,程序员使用两个函数就可以与MCI打交道了:7 e$ Q1 S$ h* K5 e
: G8 p$ `6 T+ q6 m& M$ a
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
, I, V& D& t7 a& n4 q; d" L命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。8 _% R4 ^* v+ q: J1 d3 p, R
: v8 v9 r$ ]/ F5 P# n; `
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
+ O8 e$ Z& j# u2 v命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。+ c7 `& f! ]9 F0 b( B2 z
1 r, b4 I) s. b5 \# c
对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。- l( i; J# C- @

1 z$ L5 B" x; g' t) g; V6 _  l对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
/ [' r9 F- _9 ~' C  H, H; @( t1 Y" A) J5 s3 I
举例:) [# F- E+ v" H9 b1 f
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备: t+ D/ v7 y" \9 U, t5 p$ V' T8 s
mciSendString("open aaa.avi", 0, 0, 0); // 打开文件"aaa.avi"
" ~" i  B% ?) w7 i
. @& l9 h9 P& RMCI的设备类型:) x; n- r; _$ n, M
4 T! v5 e' l, B+ K
设备描述                    描述字符串      说明! h5 Y5 }+ K1 V9 q
MCI_ALL_DEVICE_ID                           所有设备
# t4 P5 R+ C! H! V3 O& cMCI_DEVTYPE_ANIMATION       Animation       动画设备
' p9 |5 W: X& `  _+ l: A; a5 vMCI_DEVTYPE_CD_AUDIO        Cdaudio         CD音频
( Z, F: A" |% \( l' uMCI_DEVTYPE_DAT             Dat             数字音频; K3 x1 |: k5 p( Z  n9 R6 n
MCI_DEVTYPE_DIGITAL_VIDEO   Digitalvideo    数字视频
! V% N& g0 l# U* P- nMCI_DEVTYPE_OTHER           Other           未定义设备3 R* b2 ]9 A- p6 \* @6 b# O( ~
MCI_DEVTYPE_OVERLAY         Overlay         重叠视频9 ]) ~! B% t0 x7 S5 L
MCI_DEVTYPE_SCANNER         Scanner         扫描仪4 S/ S6 K3 k( s$ T9 ^
MCI_DEVTYPE_SEQUENCER       Sequencer MIDI  序列器/ i) A5 P* h& L! ?
MCI_DEVTYPE_VCR             Vcr             合式录像机+ e- E5 o; P7 o- }- N7 e
MCI_DEVTYPE_VIDEODISC       Videodisc       激光视盘$ }7 h$ y# i! [+ e( p
MCI_DEVTYPE_WAVEFORM_AUDIO  waveaudio Wave  音频2 ?1 u1 c" E! Q" s& A
, P8 C% b9 ~2 ~, ~9 t/ Z. N' d- \; |' r
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
  J$ @- n6 M6 m: t' i& c
, o% h) C* S5 H! T2 i[mci]( ~. X3 u; `4 v( E5 H6 G! r
cdaudio=mcicda.drv
  Q7 n# e& B. ~' a# @1 V8 [1 \+ ysequencer=mciseq.drv- F& H. n8 V4 `
waveaudio=mciwave.drv
" M/ |! m, F3 H. iavivideo=mciavi.drv0 P( T5 J3 s9 S2 J
videodisc=mcipionr.drv. v$ h1 i. \4 X" Q0 [. I- z1 ]4 P
vcr=mcivisca.drv
( O8 h8 {% ]5 n+ u  ^ActiveMovie=mciqtz.drv
9 S2 J8 L; u# J8 j# O% a9 y5 VQTWVideo=mciqtw.drv
. R: B! l- e4 R/ y+ L5 B$ dMPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll4 b' w" G- X5 f3 p* M! D( u  E
9 ]6 ?0 V! k7 W6 G
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。7 T. U# U, W' V
//------------------------------
4 }3 P( Q' g9 ?// 广告时间:" _+ i. l7 |% t6 \! t
// 欢迎访问 C++ Builder 研究 - http://www.ccrun.com! a) n: k1 F" n
//------------------------------/ W6 s+ X' f2 z0 Y! \( x0 L) o& G
在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
1 C( i% O1 D3 D  c: t! q9 u举个例子来说,打开一个多媒体文件有以下三种方式:
% O1 T" s: g; g# i  f. a5 Y7 k
9 }! O- S! E' j5 N[1]:自动识别:打开一个"WAV"文件* j3 N( F8 @# W' t$ ]
MCI_OPEN_PARMS mciOpen;; Z! q/ G  E: w# |5 R2 G
mciOpen.lpstrDeviceType = 0;' {- h# d( h) u+ J. l
mciOpen.lpstrElementName = "aaa.wav";1 z- k# f% o5 K. h% g
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);! Z5 k$ G0 g& j1 F3 z# D5 w
7 I( M) M* Q, u  A' R$ Z0 O' H% J& t* ^
[2]:指定设备描述:打开CD播放器' J, Y' \8 R* H. u9 D
MCI_OPEN_PARMS mciOpen;' K, P0 b/ `; X; M9 |4 C/ ?
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;% P, Y6 q+ ^. c' c
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);: q& o; \$ W) q

8 p, g8 [1 A  }* ^- W[3]:指定描述字符串: 打开一个AVI文件' e& U) k, Z4 Q. C
MCI_OPEN_PARMS mciOpen;
" \/ ]$ X4 i- D7 EmciOpen.lpstrDeviceType = "avivideo";
+ }4 V% a: T0 V1 V! [; W" QmciOpen.lpstrElementName = "aaa.avi";$ \: }0 @  b* y3 _
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);! V, `4 b* f; k$ t: I
% O2 G7 U. `* N& }& l
注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
5 B# j. ^3 ~6 Z5 c6 m9 [- v& [, u
% E" i* P# p. F& j. N+ l9 O: L. U6 sMCI指令
) A) `" h4 K6 S3 a2 r
* f8 j: T6 E2 O! W( iMCI_BREAK        设置中断键,缺省是”CTRL+BREAK"
, {# {! O$ z2 S; @8 ^MCI_CAPTURE      抓取当前帧并存入指定文件,仅用于数字视频
3 `$ A7 u0 Y8 }! IMCI_CLOSE        关闭设备
4 e: r4 T# f) u- E( c4 @! D4 s9 S1 FMCI_CONFIGURE    弹出配置对话框,仅用于数字视频
/ b/ }( o7 u  j( fMCI_COPY         拷贝数据至剪贴板3 W* F$ L2 c  h) \
MCI_CUE          延时播放或录音
* T/ P! y# @" ^( O; C8 P3 AMCI_CUT          删除数据0 e- n; l( u3 B/ D- V) K0 ]
MCI_DELETE       删除数据
. L4 k) p) K, v0 u9 [; VMCI_ESCAPE       仅用于激光视频
$ @% u( I6 S" z/ y' B+ mMCI_FREEZE       将显示定格5 l" D$ u) S2 d1 \3 o8 _
MCI_GETDEVCAPS   获取设备信息: P' z& u5 {9 N) A! O
MCI_INDEX        当前屏幕显示与否,仅用于VCR设备/ V) [  e! t+ V6 E+ x
MCI_INFO         获取字符串信息
" g& K" m/ X7 {! YMCI_LIST         获取输入设备数量,支持数字视频和VCR设备: J1 w% t8 d% b
MCI_LOAD         装入一个文件$ p" o9 V; b5 {4 v& Z: S
MCI_MARK         取消或做一个记号,与MCI_SEEK配套
0 r! z! m7 ~, QMCI_MARK         取消或做一个记号,与MCI_SEEK配套$ o# X9 t& L  w6 c- T1 B6 {
MCI_MONITOR      为数字视频指定报告设备
% h1 K2 N, n$ B# I* oMCI_OPEN         打开设备
' s2 N9 |1 O- nMCI_PASTE        粘帖数据
! X! j4 R* }# n$ S- M! Y/ OMCI_PAUSE        暂停当前动作+ U; A7 k! D) T; _' G6 Y
MCI_PLAY         播放0 L' b4 g2 ?) i; U% t
MCI_PUT          设置源、目的和边框矩形* h. u5 a' ]! b$ c: R7 Q
MCI_QUALITY      定义设备缺省质量
/ T/ Z, v' I! Y! e  PMCI_RECORD       开始录制; [# `& d2 P4 F4 l* H; @( @, B/ w3 O
MCI_RESERVE      分配硬盘空间! B  k% S8 g3 l; n6 w: t- m5 h
MCI_RESTORE      拷贝一个bmp文件至帧缓冲' F$ Z) m; I$ g: a" v- {5 O( J" A
MCI_RESUME       使一个暂停设备重新启动- }$ q8 a! ?+ V; w: \
MCI_SAVE         保存数据8 l, N7 D0 N8 C7 h8 {
MCI_SEEK         更改媒体位置5 l1 h9 [' A* `0 e3 X* @6 ~
MCI_SET          设置设备信息
7 j2 \9 _; U) n: J* f% V! iMCI_SETAUDIO     设置音量
7 ^* Q  {5 O$ P: D7 GMCI_SETTIMECODE  启用或取消VCR设备的时间码
+ E2 M1 D2 t# J' C! X5 IMCI_SETTUNER     设置VCR设备频道1 S: D8 g# V3 j$ R
MCI_SETVIDEO     设置video参数( E1 F/ ~7 V, O" T# x
MCI_SIGNAL       在工作区上设置指定空间+ O0 n1 ~# N1 v; L& d4 u6 N- D
MCI_STATUS       获取设备信息# Z' A4 q, t8 [4 C$ U. \
MCI_STEP         使播放设备跳帧
3 ?5 z5 f& x' uMCI_STOP         停止播放
; V5 \0 B! x' q3 J1 P' }MCI_SYSINFO      返回MCI设备信息
- W$ |% k# ~5 r3 N* cMCI_UNDO         取消操作* S; G' r1 u$ z6 A% F" d6 j7 P/ G
MCI_UNFREEZE     使使用MCI_UNFREEZE的视频缓冲区恢复运动0 G3 F2 _9 {6 s
MCI_UPDATE       更新显示区域
* K2 \9 m3 J8 q; T# PMCI_WHERE        获取设备裁减矩形. t* f, y  R* X6 U6 A
MCI_WINDOW       指定图形设备窗口和窗口特性
! W3 B: p! u$ n( K% F/ I* t4 l7 h
其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 20:17 , Processed in 0.018416 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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