1. 程式人生 > 其它 >C# windows media player詳細用法(最全面)

C# windows media player詳細用法(最全面)

C# windows media player詳細用法(最全面)

友情說明:以下示範程式碼為VB.net,語法思路上與C#類似可以參考。

Media player控制元件基本使用步驟如下:
1、屬性/方法名說明:
[基本屬性]
URL:String; 指定媒體位置,本機或網路地址
uiMode:String; 播放器介面模式,可為Full, Mini, None, Invisible(不計大小寫)
playState:integer; 播放狀態。這個屬性改變時同時引發PlayStateChange事件與StateChange事件。

取值範圍為列舉型:WMPLib.WMPPlayState,它的成員如下:
  wmppsUndefined = 0;   //未知狀態
  wmppsStopped = 1;    //播放停止
  wmppsPaused = 2;     //播放暫停
  wmppsPlaying = 3;     //正在播放
  wmppsScanForward = 4;   //向前搜尋
  wmppsScanReverse = 5;   //向後搜尋
  wmppsBuffering = 6;     //正在緩衝
  wmppsWaiting = 7;      //正在等待流開始
  wmppsMediaEnded = 8;    //播放流已結束
  wmppsTransitioning = 9;    //準備新的媒體檔案
  wmppsReady = 10;      //播放準備就緒
  wmppsReconnecting = 11;   //嘗試重新連線流媒體資料
  wmppsLast = 12;       //上一次狀態,狀態沒有改變
  在PlayStateChange中寫程式碼可以防止播放rmvb等非預設型別的問題(用wmppsReady)。
  enableContextMenu:Boolean;    啟用/禁用右鍵選單
  fullScreen:boolean;         是否全屏顯示


  //播放器基本控制
  Ctlcontrols.play; 播放
  Ctlcontrols.pause; 暫停
  Ctlcontrols.stop; 停止
  Ctlcontrols.currentPosition:double; 當前進度
  Ctlcontrols.currentPositionString:string; 當前進度,字串格式。如“00:23”
  Ctlcontrols.fastForward; 快進
  Ctlcontrols.fastReverse; 快退
  Ctlcontrols.next; 下一曲
  Ctlcontrols.previous; 上一曲
  [settings] wmp.settings //播放器基本設定
  settings.volume:integer; 音量,0-100
  settings.autoStart:Boolean; 是否自動播放
  settings.mute:Boolean; 是否靜音
  settings.playCount:integer; 播放次數
  //順序播放
  wmp.settings.setMode("shuffle", False)
  //隨機播放
  wmp.settings.setMode("shuffle", True)
  //迴圈播放
  wmp.settings.setMode("loop", True)


[currentMedia] wmp.currentMedia //當前媒體屬性
currentMedia.duration:double; 媒體總長度
currentMedia.durationString:string; 媒體總長度,字串格式。如“03:24”
currentMedia.getItemInfo(const string); 獲取當前媒體資訊"Title"=媒體標題,"Author"=藝術家,"Copyright"=版權資訊,"Description"=媒體內容描述, "Duration"=持續時間(秒),"FileSize"=檔案大小,"FileType"=檔案型別,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通過屬性名設定媒體資訊
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //當前播放列表屬性
currentPlaylist.count:integer; 當前播放列表所包含媒體數
currentPlaylist.Item[integer]; 獲取或設定指定專案媒體資訊,其子屬性同wmp.currentMedia
axWindowsMediaPlayer1.currentMedia.sourceURL; //獲取正在播放的媒體檔案的路徑
axWindowsMediaPlayer1.currentMedia.name; //獲取正在播放的媒體檔案的名稱
axWindowsMediaPlayer1.Ctlcontrols.Play          播放
axWindowsMediaPlayer1.Ctlcontrols.Stop          停止
axWindowsMediaPlayer1.Ctlcontrols.Pause          暫停
axWindowsMediaPlayer1.Ctlcontrols.PlayCount        檔案播放次數
axWindowsMediaPlayer1.Ctlcontrols.AutoRewind       是否迴圈播放 (無效)
axWindowsMediaPlayer1.Ctlcontrols.Balance         聲道
axWindowsMediaPlayer1.Ctlcontrols.Volume         音量
axWindowsMediaPlayer1.Ctlcontrols.Mute          靜音
axWindowsMediaPlayer1.EnableContextMenu    是否允許在控制元件上點選滑鼠右鍵時彈出快捷選單
axWindowsMediaPlayer1.Ctlcontrols.AnimationAtStart     是否在播放前先播放動畫(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowControls       是否顯示控制元件工具欄(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowAudioControls    是否顯示聲音控制按鈕(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowDisplay       是否顯示資料檔案的相關資訊(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowGotoBar       是否顯示Goto欄(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowPositionControls   是否顯示位置調節按鈕(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowStatusBar      是否顯示狀態列(無效)
axWindowsMediaPlayer1.Ctlcontrols.ShowTracker       是否顯示進度條(無效)
axWindowsMediaPlayer1.Ctlcontrols.FastForward        快進
axWindowsMediaPlayer1.Ctlcontrols.FastReverse        快退
axWindowsMediaPlayer1.Ctlcontrols.Rate           快進/快退速率
axWindowsMediaPlayer1.AllowChangeDisplaySize  是否允許自由設定播放圖象大小(無效)
axWindowsMediaPlayer1.DisplaySize       設定播放圖象大小(無效)
1-MpDefaultSize         原始大小
2-MpHalfSize           原始大小的一半
3-MpDoubleSize         原始大小的兩倍
4-MpFullScreen          全屏
5-MpOneSixteenthScreen      螢幕大小的1/16
6-MpOneFourthScreen       螢幕大小的1/4
7-MpOneHalfScreen        螢幕大小的1/2
axWindowsMediaPlayer1.ClickToPlay    是否允許單擊播放視窗啟動Media Player

在視訊播放之後,可以通過如下方式讀取源視訊的寬度和高度,然後設定其還原為原始的大小.
private void ResizeOriginal()
{
int intWidth = axWindowsMediaPlayer1.currentMedia.imageSourceWidth;
int intHeight = axWindowsMediaPlayer1.currentMedia.imageSourceHeight;
axWindowsMediaPlayer1.Width = intWidth + 2;
axWindowsMediaPlayer1.Height = intHeight + 2;
}

開啟媒體檔案並播放:
Dim filePath As String
With Me.OpenFileDialog1
.Title = "開啟語音檔案"
.CheckPathExists = True
.CheckFileExists = True
.Multiselect = False
.Filter = "mp3檔案(*.mp3)|*.mp3|所有檔案(*.*)|*.*"
If .ShowDialog = DialogResult.Cancel Then
Exit Sub
End If
filePath = .FileName
End With
Me.Text = "PC復讀機-檔案 " & filePath
AxWindowsMediaPlayer1.URL = filePath
Try
Me.AxWindowsMediaPlayer1.Ctlcontrols.play()
Catch ex As Exception
MsgBox("對不起,不能播放此格式語音檔案", MsgBoxStyle.OKOnly, "PC復讀機")
Exit Sub
End Try
注意:
AxWindowsMediaPlayer1.URL 中URL是表示要播放的檔名,取消了原來的Name屬性.
AxWindowsMediaPlayer1.Ctlcontrols.play()播放,同樣還有Pause,Stop等其他屬性.
AxWindowsMediaPlayer1.settings.balance表示媒體播放的聲道設定,0表示均衡,-1和1表示左右聲道.
AxWindowsMediaPlayer1.currentMedia.duration 表示要播放的檔案的時間長度.可用它獲取檔案長度.
AxWindowsMediaPlayer1.Ctlcontrols.currentPosition表示正在播放的檔案的當前播放位置,可用這個屬性來對媒體檔案進行前進後退等設定.如
AxWindowsMediaPlayer1.Ctlcontrols.currentPosition+1 表示前進1個時間單位.
AxWindowsMediaPlayer1.settings.rate播放速率,一般乘以16後再顯示kbps單位.

注意:在上面程式中,如果在後面加上一個:
msgbox(AxWindowsMediaPlayer1.currentMedia.duration.ToString )
則顯示結果很可能為0,因此,這時候很可能獲取不到檔案的播放時間長度,容易出錯。所以在利用的時候可以加一個timer控制元件:

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
EndPoint = AxWindowsMediaPlayer1.currentMedia.duration
If EndPoint = 0 Then Exit Sub '可能因為媒體檔案的開啟需要一定時間,這裡等待媒體檔案的開啟
msgbox(AxWindowsMediaPlayer1.currentMedia.duration.ToString )
End Sub

此時msgbox便會顯示檔案播放長度。

2. Ctlcontrols屬性


Ctlcontrols屬性是AxWindowsMediaPlayer的一個重要屬性, 此控制元件中有許多常用成員。
(1) 方法play
用於播放多媒體檔案,其格式為:
窗體名.控制元件名.Ctlcontrols.play()
如: AxWindowsMediaPlayer1.Ctlcontrols.play() ‘此處預設窗體名是Me
(2) 方法pause
用於暫停正在播放的多媒體檔案,其格式為:
窗體名.控制元件名.Ctlcontrols.pause()
如: AxWindowsMediaPlayer1.Ctlcontrols.pause()
(3) 方法stop
用於停止正在播放的多媒體檔案,其格式為:
窗體名.控制元件名.Ctlcontrols.stop()
如: AxWindowsMediaPlayer1.Ctlcontrols.stop()
(4) 方法fastforward
用於將正在播放的多媒體檔案快進,其格式為:
窗體名.控制元件名.Ctlcontrols.fastforward()
如: AxWindowsMediaPlayer1.Ctlcontrols.forward()
(5) 方法fastreverse
窗體名.控制元件名.Ctlcontrols.fastreverse()
如: AxWindowsMediaPlayer1.Ctlcontrols.fastreverse()
6. 屬性CurrentPosition
用於獲取多媒體檔案當前的播放進度,其值是數值型別,使用格式為:
窗體名.控制元件名.Ctlcontrols.currentPosition
d1 =AxWindowsMediaPlayer1.Ctlcontrols.currentPosition
其中d1 是一個整型變數。
7. 屬性Duration
用於獲取當前多媒體檔案的播放的總時間,其值為數值型別,其使用格式為:
窗體名.控制元件名.currentMedia.duration
如:d2 =AxWindowsMediaPlayer1.currentMedia.duration
其中d2是一個整型變數。


對WMP的感嘆
感嘆一
這是我找到的關於WMP的最全的中文資料了。剛才又查了一下,查到了MSDN有更全的API文件,終於找到它了。上面的資料基本上夠用了,但是,如果要寫一個更為精緻的播放器,這些還不夠啊。看MSDN去也。WMP11在MSDN中的位置如下:
win32和COM開發-Griphics And MultiMedia-Audio And Vedio-Windows Media Player 11 SDK
看了一個晚上的MSDN與資料。發現MSDN上關於WMP SDK的文件也很不紮實。沒有例項。我要找的答案都不在上面。唯一的收穫是曉得了wpl。wmp有自己的播放列表檔案,但是,我查遍msdn,發現sdk 並不提供手動儲存播放列表的任何方法。所以,現在的問題是,我們建立了一個IWMPPlayList,但是,這個介面不提供任何儲存的方法,結果。 newPlayList(name,path)只提供開啟一個已有列表。鬱悶。查了英文資料。老外建議用:StreamWrite/StreamRead 的辦法來讀寫wpl,我也看了。事實上wpl是一個xml檔案。我們可以用System.Xml中的API來讀寫。不過,sdk中的這個漏子我始終無法釋 懷。
感嘆二
從WMP8開始就不支援mms/rtsp協議了,所用wmp.URL="mms://xxxx";是不行的了。點此處見詳情,而mms這個協議現在還在廣泛使用。鬱悶。因此,我們不能使用wmp來看網路電視了。

使用WMP的常見問題:
一、升級wmp後,再拖windows media player控制元件至窗體出錯的問題(至今沒解決,應當是修改工程式檔案,用文字編輯器)
二、播放rmvb/rm等非官方格式檔案要先雙擊檔案再點播放按鈕,而不能直接播放的問題,並彈出訊息框:Windows Media Player下載檔案遇到問題。有關幫助資訊請單擊“Web幫助”。訊息下面兩個按鈕:關閉、Web幫助。我沒有找到出現這個問題的官方說明。我個人意 見,這是因為wmp預設只播能播放官方指定的幾種型別的媒體。如果不是,wmp會試圖下載對應的解碼器來播放。而這個下載過程失敗了,所以彈出這個訊息 框。wmp好像沒有去判斷這個解碼器是否已經存在。但是,如果你再點播放的話,又能播放,這是什麼原因呢?應當是wmp在這次會試圖搜尋本機上的解碼器以 圖播放媒體。怎樣解決這個點兩次滑鼠的問題呢?如下:
先設定屬性:wmp.settings.enableErrorDialogs = false;事實上這個屬性預設就是false。不用設定。

private void wmp_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
//如果已播放完畢就播放下一個檔案
if ((WMPLib.WMPPlayState)e.newState == WMPLib.WMPPlayState.wmppsReady) wmp.Ctlcontrols.play();
}  
唉,我費了九牛二虎之力總算找到了這個辦法解決。

三、怎樣獲得一個媒體檔案中的資訊,並且修改媒體的一些資訊?
  有辦法:AxWindowsMediaPlayer.newMedia(filename),它會建立一個IWMPMedia的例項。用它的setItemInfo就成了。至於有哪些資訊可供設定,可去msdn中查,裡面列舉了所有相關資訊。

四、IWMPPlayList是不是雞肋????????
確實是好大的一塊雞肋!!!!!!!!!!!

五、播放器控制元件有幾個組成部分,可有隱藏其中相關部分的方法?
媒體播放器包括如下元素:
Video Display Panel:視訊顯示面板;
Video Border:視訊邊框;
Closed Captioning Display Panel;字幕顯示面板;
Track Bar;搜尋欄;
Control Bar with Audio and Position Controls:帶有聲音和位置控制的控制欄;
Go To Bar:轉到欄;
Display Panel:顯示面板;
Status Bar:狀態列;
就是這麼幾個部分,網上有資料說控制元件提供方法控制它們顯示與否,但是我在sdk中並沒有找到它們。唯一可以粗略控制它們的就是uiMode屬性。它的取值前面有。


六、控制元件的網路設定,如設定代理、緩衝次數、緩衝時間等資訊在哪設定?
  AxWindowsMediaPlayer.netWork。它是IWMPNetWork的例項。

七、像暴風有字幕相關資訊的設定,wmp控制元件有這個功能嗎?

當然有。就是AxWindowsMediaPlayer.closedCaption。它是IWMPClosedCaption的例項。