Windows Media Player 9.0是微軟推出的數字媒體播放器,它除了繼承了media player 8.0的之處外,還添加了許多的實用功能。不過這些功能并不是本文講述的重點,本文要講的是如何利用media player來編寫一個自己的嵌入式軟件,并讓它擁有播放cd,vcd,avi,mp3等的功能。
要編寫這個程序你首先要熟悉vb.net,因為本程序是使用vb.net編寫。在你的計算機上要安裝windows media player 9.0。關鍵的是要安裝windows mendia player 9.0 sdk,在sdk中包含了一個dll,這個dll的作用是完成com和.net之間的轉換,因為media player 9.0的編程要使用一個media player 9.0 activeX控件,而activeX的本質就是一個com。對于windows mendia player 9.0 sdk可以到微軟的msdn去下載。
完成上面3個軟件的安裝后還不可以動手編寫代碼,因為要保證mendia player 9.0要與.net框架通信,還必須注冊mendia player 9.0的pia,所謂pia是"Primary interop assemblies"的縮寫本人將它翻譯為"原始內部匯編集",之所以要先注冊它是因為com技術誕生在.net技術之前要讓com和.net通信就要一個中間層來連接這兩邊在mendia player 9.0中使用mendia player 9.0 sdk redist目錄下的wmppia.dll來注冊mendia player 9.0的pia,在命令窗口中輸入:[path]regasm c:WMSDKWMPSDK9 redistwmppia.dll(regasm是.net提供的pia注冊程序,path是它的路徑,你可以用搜索功能來找到它)。
各位別以為注冊了pia就可以編程了,你還得將它添加到全局緩存中。在命令窗口中輸入:[path]Gacutil /i C:WMSDKWMPSDK9redistwmppia.dll(Gacutil是.net提供的全局緩存添加程序,path是它的路徑,你可以用搜索功能來找到它)
完成上面的5個步驟后就可以開始編寫代碼了。為了讓.net使用pia,我們必須要在代碼的開頭添加下面一條語句: Imports Microsoft.MediaPlayer.Interop現在就可以開始我們的編程之旅了。
右擊vs.net ide的控件工具箱,在快捷菜單中單擊"自定義工具箱",在"自定義工具箱"中選中"windows media player"并單擊"確定"(圖1)
圖1
此時會在控件工具攔底部添加一個mendia的控件標志。雙擊此控件,將它放在窗體上。右擊它并點擊"屬性"在出現的屬性窗口(圖2)中將"選擇模式"設置為"none"并單擊"確定",這樣做的目的是去掉原來的播放控件。
圖2
然后在窗口中在添加如圖3的控件,在屬性窗口中將TrackBar1控件的和小值設定為100和0,因為media的音量范圍是0到100,我們用TrackBar1控件來調整播放音量。Timer1的interval設置為1000。
圖3
現在可以輸入以下代碼了:
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
'打開和關閉所有光驅倉門
Dim k = AxWindowsMediaPlayer1.cdromCollection.count()
If k > 1 Then
For i = 0 To k - 1
AxWindowsMediaPlayer1.cdromCollection.Item(i).eject()
Next
Else
AxWindowsMediaPlayer1.cdromCollection.Item(0).eject()
End If
End Sub
Private Sub Form1_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles MyBase.Load
'獲得計算機中有多少個光驅和它們的盤符
Dim i
Dim cdlabel As String
Dim k = AxWindowsMediaPlayer1.cdromCollection.count()
If k > 1 Then
For i = 0 To k - 1
cdlabel = cdlabel &
AxWindowsMediaPlayer1.cdromCollection.Item(i).driveSpecifier()
Label1.Text = "這臺計算機共有 " & k &
" 臺CD-ROM" & "分別是" & cdlabel & " "
Next
Else
cdlabel = cdlabel +
AxWindowsMediaPlayer1.cdromCollection.Item(0).driveSpecifier()
Label1.Text = "這臺計算機共有 " & k &
" 臺CD-ROM" & "分別是" & cdlabel & " "
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button2.Click
Dim strfilename As String
Dim OpenFileDialog1 As System.Windows.Forms.OpenFileDialog =
New System.Windows.Forms.OpenFileDialog()
OpenFileDialog1.ShowDialog()
strfilename = OpenFileDialog1.FileName
AxWindowsMediaPlayer1.URL = strfilename
End Sub
Private Sub Button3_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button3.Click
AxWindowsMediaPlayer1.controls.play()'播放
End Sub
Private Sub Button5_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button5.Click
AxWindowsMediaPlayer1.controls.stop()'停止
End Sub
Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As Object,
ByVal e As AxMicrosoft.MediaPlayer.Interop._WMPOCXEvents_PlayStateChangeEvent) Handles
AxWindowsMediaPlayer1.PlayStateChange
'表示播放媒體發生變化時觸發此事件
Label4.Text = "此文件播放總時間是" &
AxWindowsMediaPlayer1.currentMedia.durationString
Timer1.Enabled = True
Label5.Text = "標題" &
AxWindowsMediaPlayer1.currentMedia.getItemInfoBytype("Title", "", 0)
Label6.Text = "作者" &
AxWindowsMediaPlayer1.currentMedia.getItemInfoBytype("Author", "", 0)
End Sub
Private Sub Button4_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button4.Click
AxWindowsMediaPlayer1.controls.pause()'暫停
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Timer1.Tick
Label2.Text = "已經播放時間" &
CInt(AxWindowsMediaPlayer1.controls.currentPosition) & "秒"
End Sub
Private Sub TrackBar1_Scroll(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles TrackBar1.Scroll
AxWindowsMediaPlayer1.settings.volume = TrackBar1.Value'調整輸出音量
End Sub
程序說明:當你按下F5開始編譯時,系統會提示你有一個錯誤,這個錯誤就是在"Windows 窗體設計器生成的代碼"中的"Me.AxWindowsMediaPlayer1.enabled = True"這條語句引起的,其原因是media player 9.0的控件與.net的兼容問題,此問題已經得到微軟的證實,在下一版本中即vs2003.net將不會有此問題,在此版本中解決方法是將此代碼去掉即可。
文中使用的getItemInfoBytype屬性是用來讀取元數據的中的信息(對于元數據的定義見sdk),這些信息是在媒體建立時輸入進去的,但是這個屬性并不會在你編寫代碼時自動出現,有就是說不具備智能填充功能,其原因是media player 9.0控件的某些新功能是通過接口發布的,而未在com類型庫中發布,所以不具備智能填充功能。不過你可以按照sdk給出的語法書寫,編譯器不會識別不出來的。程序中對文件的播放時間的計算單位是秒,如果你感興趣可以將它轉換為mm:ss的格式。
運行如圖4
圖4