?? 64(1).txt
字號:
用MCI指令進行多媒體編程
我們有時會希望為自己的程序增加音效,例如警告聲等,這就需要播放WAV文件。較簡單的做法,我們可以使用多媒體控件(VB和Delphi都提供了MCI控件)來完成,但這樣做無疑會增加系統負擔和使程序體積增大(使用OCX的話尤其明顯)。如果我們的程序并非一個多媒體程序而僅僅是用來播放音效的話,就更不劃算了。有沒有更理想的方法呢?答案是肯定的,Windows已經為我們提供了一個關于多媒體處理的動態連接庫WINMM.DLL(舊版本為MMSYSTEM.DLL),通過調用它所提供的API函數,我們就可以使用MCI指令進行多媒體方面的操作了。
讓我們先來了解一下什么是MCI指令,MCI的全稱是Media Control Interface(媒體控制接口)。實際上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 hwnd Callback As Long) As Long
Declare Function mciGet Error String Lib “winmm.dll" Alias “mciGetError String A" (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播放器已經可以工作了,如果你再為它擴充一些有趣的功能的話,就是一個完整的小軟件了。(上海 申 )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -