扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
让我们先来了解一下什么是MCI指令,MCI的全称是Media Control Interfase(媒体控制接口)。实际上MCI是一个高级的函数调用接口,我们可以把它看作是一个解释器,通过它,我们就可以直接和外部音频或视频设备打交道了。
接下来,就需要了解一下需要用到的API和MCI指令。有三个与MCI有关的API,它们是:
mciSendString(),mciExecute()和mciGetErrorString()。
mciSendString函数的功能是传送指令字符串给MCI,mciExecute的功能和mciSendString一样,不同的是当发生错误时mciExecute会弹出对话框显示错误信息。mciGetErrorString的功能是将MCI错误代码转换为字符串。现在假设我们的编程环境是VB或Delphi,下面就在这两种环境的情况中介绍其使用方法。
在VB中,调用API函数必须先进行声明,它们的格式分别为:
Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand
As String) As Long
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal
lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As
Long, ByVal hwndCallback As Long) As Long
Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA"
(ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long
在Delphi中相对较简单,由于Delphi已经将多媒体相关的API声明预编译在MMSYSTEM.DCU文件中,所以我们只需要在单元的Uses语句后加上 mmsystem即可在本单元中使用上述三个API函数了。
接着再介绍一些常用的MCI指令。
MCI指令一般格式为:MCI指令 设备名 [参数]
打开多媒体设备:open,如:open CDAudio、open c:\windows\chimes.wav type waveaudio。
播放多媒体设备:play,如:play CDAudio from 5000 to 20000(播放CD的第5秒到第20
秒)、play c:\windows\chimes.wav。
关闭多媒体设备:close,如:close all(关闭所有多媒体设备)。
得到设备状态信息:status,如:status cdaudio number of track(得到CD的曲目总数)
有了这些预备知识,就可以将MCI和API结合起来进行多媒体编程了。
例如,要在程序中使用音效(播放WAV文件),要求如果WAV文件不存在的话要求忽略错误(即不弹出出错信息),则程序如下(以VB为例,Delphi中类似):
Dim Result as Integer
Dim ReturnStr As String * 1024 ''注意,必须指定String的长度
Result=mciSendString("play c:\windows\chimes.wav",ReturnStr,1024,0)
''其中ReturnStr为某些MCI指令执行后传送给程序的文字信息
以上这段程序可以播放指定的WAV文件,如果成功执行,则Result的值为0,如果文件不存在或出现其他错误,错误代码会传送给Result,但程序不会中断。若要根据错误代码自行处理错误
信息,可以使用mciGetErrorString函数处理:
Dim ErrStr As String * 1024
if Result=0 then
msgbox "播放成功"
Else
i%=GetErrorString(ReturnStr,ErrStr,1024)
msgbox ErrStr
End If
下面,我们举一个完整的程序作为例子(还是以VB为例),我们可以用API写一个CD播放器来代替使用多媒体控件。这样做的好处很明显,当你把程序编译成为EXE文件后复制给朋友的时候,
你再也不必附加其他OCX文件(如果是Delphi的话,EXE文件体积也可以减小)。
在VB中新建一个工程,在Form1中添加6个按钮和一个Timer控件,属性如下:
名称:Command1,Caption:弹出
名称:Command2,Caption:播放
名称:Command3,Caption:暂停
名称:Command4,Caption:下一首
名称:Command5,Caption:上一首
名称:Command6,Caption:退出
名称:Timer1,Interval:1000
接着,我们就可以编写代码了,如下:
''函数声明
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As
String) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA"
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal
uReturnLength As Long, ByVal hwndCallback As Long) As Long
Dim Cur As Integer ''保存当前正在播放的曲目号
Dim Total As Integer ''保存CD曲目总数
''弹出CD-ROM
Private Sub Command1_Click()
i% = mciExecute("set cdaudio door open")
End Sub
''播放
Private Sub Command2_Click()
i% = mciExecute("play cdaudio")
End Sub
''暂停
Private Sub Command3_Click()
i% = mciExecute("pause cdaudio")
End Sub
''播放下一首
Private Sub Command4_Click()
Dim ReturnStr As String * 128
i% = mciExecute("set cdaudio time format tmsf") ''设置from后的时间格式
If Cur < Total Then i% = mciExecute("play cdaudio from" + Str(Cur + 1))
End Sub
''播放上一首
Private Sub Command5_Click()
Dim ReturnStr As String * 128
i% = mciExecute("set cdaudio time format tmsf")
If Cur > 1 Then i% = mciExecute("play cdaudio from" + Str(Cur - 1))
End Sub
''中止CD的播放并退出
Private Sub Command6_Click()
i% = mciExecute("stop cdaudio")
i% = mciExecute("close cdaudio")
End
End Sub
''程序启动时打开CDAudio设备并得到曲目总数
Private Sub Form_Load()
Dim ReturnStr As String * 128
i% = mciSendString("open cdaudio", ReturnStr, 128, 0)
i% = mciSendString("status cdaudio number of tracks", ReturnStr, 128, 0)
Total = Val(ReturnStr)
End Sub
''退出时中止CD的播放
Private Sub Form_Unload(Cancel As Integer)
i% = mciExecute("stop cdaudio")
i% = mciExecute("close cdaudio")
End Sub
''每隔一秒监测当前播放的曲目号
Private Sub Timer1_Timer()
On Error Resume Next
Dim ReturnStr As String * 128
i% = mciSendString("status cdaudio current track", ReturnStr, 128, 0)
Cur = Val(ReturnStr)
End Sub
好了,现在这个CD播放器已经可以工作了,如果你再为它扩充一些有趣的功能的话,就是一个完整的小软件了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者