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:\WMSDK\WMPSDK9\ redist\wmppia.dll(regasm是.net提供的pia註冊程式,path是它的路徑,你可以用搜尋功能來找到它)。
各位別以為註冊了pia就可以編程了,你還得將它添加到全域緩衝中。在命令視窗中輸入:[path]Gacutil /i C:\WMSDK\WMPSDK9\redist\wmppia.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控制項來調整播放音量。T imer1的interval設定為1000。
圖3
現在可以輸入以下代碼了:
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
'開啟和關閉所有光碟機倉門
Dim i
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