C# Winform使用Windows Media Player播放多媒體整理

一、簡單使用示例步驟

1.添加Windows Media Player 組件當前是系統的 Com組件

工具箱》右鍵“選擇項”》選擇Com組件

2.控件拖拽到桌面,使用

private void button1_Click(object sender, EventArgs e)
{//播放開始聲音axWindowsMediaPlayer2.URL = "start.mp3"; //指定音頻文件axWindowsMediaPlayer2.settings.volume = 100;//指定音量axWindowsMediaPlayer2.Ctlcontrols.play();//開始播放
}

播放狀態監聽

    //播放狀態監聽axWindowsMediaPlayer1.PlayStateChange += (eSender, eState) =>{if (WMPLib.WMPPlayState.wmppsMediaEnded.GetHashCode() == eState.newState){axWindowsMediaPlayer1.close(); //結束播放,釋放文件
        }};

二、更多使用說明

Media player控件基本使用步驟如下:

屬性/方法名說明:

[基本屬性]
 
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的實例。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快學Scala習題解答—第一章 基礎

原文鏈接:http://blog.csdn.net/ivan_pig/article/details/8249768 --------------------------------------------------------- 1 簡介 近期對Scala比較感興趣,買了本《快學scala》,感覺不錯。比《Programming Scala:Tackle Multi-Core Complexity on…

java swing rectangle_Java SwingUtilities.convertRectangle方法代碼示例

本文整理匯總了Java中javax.swing.SwingUtilities.convertRectangle方法的典型用法代碼示例。如果您正苦於以下問題:Java SwingUtilities.convertRectangle方法的具體用法?Java SwingUtilities.convertRectangle怎麼用?Java SwingUtilities.c…

python 查詢包_查找Python包的依賴包(語句)

Window 10家庭中文版,Python 3.6.4,今天看完了urllib3的官文(官方文檔),因為沒有具體使用過,所以,仍然是一知半解,但是,突然想知道 urllib3以及前面學習過的requests模塊都依賴了什么其它模塊。…

618選購手機正當時,好評率高達99%的手機了解一下!

一年一度的京東618年中購物狂歡節如火如荼的進行中,手機廠商們都使出了渾身解數,對消費者進行爭奪。對于用戶來說,618絕對是更換手機的好時機。不過,小伙伴們面對市場上的眾多機型,也有可能挑花了眼,不知道…

IntelliJ IDEA 2017.2 x64 安裝Scala

從官網下載好IntelliJ IDEA 和scala IntelliJ IDEA 安裝scala插件 新建scala項目 建好后,發現src右鍵--新建---沒有 .scala選項 解決方法

Django-ORM數據庫操作

背景 Django框架功能齊全自帶數據庫操作功能,由于工作中設計巨量的api接口,需要一個很好的web后端服務框架,Django給了莫大的幫助。本文主要介紹Django的ORM框架我們一般對數據庫的使用的認識是: 創建數據庫,設計表結構…

python查詢缺失值所在位置_Python Pandas找到缺失值的位置方法

問題描述:python pandas判斷缺失值一般采用 isnull(),然而生成的卻是所有數據的true/false矩陣,對于龐大的數據dataframe,很難一眼看出來哪個數據缺失,一共有多少個缺失數據,缺失數據的位置。首…

快學Scala習題解答—第二章 控制結構和函數

原文地址:http://blog.csdn.net/ivan_pig/article/details/8253068 ---------------------------------------------------------------------------------- 3 控制結構和函數 3.1 一個數字如果為正數,則它的signum為1;如果是負數,則signum為-1;如果為0…

java barrier_Java - Latch和Barrier的區別

之所以把Latch與Barrier放在一起比較是因為他們給人一種相似的感覺。他們都是阻塞一些行為直至某個事件發生,但Latch是等待某個事件發生,而Barrier是等待線程。先比較一下JCIP中對二者的描述:LatchA latch is a synchronizer that can delay …

Kingback小組沖刺博客

一、6月13日 1、今日完成的任務 李可欣 項目首頁的框架設計 項目首頁的導航欄部分 對于項目的配色進行了改進,并且設計了logo 楊帆 今天進行了數據庫的設計,完成了數據庫的增刪改查,并建立了兩個jsp頁面,還學習了一些數據庫設計的…

用python前端html后端django_淺談Django前端后端值傳遞問題

前端后端傳值問題總結前端傳給后端通過表單傳值1、通過表單get請求傳值在前端當通過get的方式傳值時,表單中的標簽的name值將會被當做action的地址的參數此時,在后端可以通過get請求相應的name值拿到對應的value值例子:html中:{% csrf_token %}類別{% fo…

使用Git上傳本地項目到oschina

原文地址:https://my.oschina.net/158/blog/530112 --------------------------------------------- 1.首先看一下自己是否有公鑰, 在 我的資料-->SSH公鑰 查看,如果沒有,添加自己的SSH 公鑰: SSH key 可以讓你在…

手動創建git忽略push清單,node_module以及自身

1.文件夾內右鍵git bash,輸 touch .gitignore,注意中間有空格 2.編輯器打開生成的 .gitignore 文件,加入 .gitignore node_modules12 3.保存 4.以后再push到倉庫的就會過濾這倆了,想加啥自己加

整數數組按絕對值排序

2019獨角獸企業重金招聘Python工程師標準>>> 題目: 給出一組整數數組,要求按照絕對值從小到大進行排序后輸出。 可以用經典的冒泡排序法來計算此問題,計算過程: 1、比較相鄰兩個元素絕對值,如果第一個比第二…

python定時任務是異步的嗎_定時任務、異步任務

------------定時任務、異步任務--------pip install celery --targetD:\Users\ex-ouyangl003\PycharmProjects\data_new\dg_meta_system\metadata_system\venv\Lib\site-packages# coding:utf-8from apscheduler.schedulers.blocking import BlockingSchedulerimport datetime…

java excel自動保存_java讀取excel的內容(可保存到數據庫中)

//**poi jar包//public classReadExcel {SuppressWarnings("static-access")private staticString getValue(HSSFCell hssfCell) {if (hssfCell.getCellType() hssfCell.CELL_TYPE_BOOLEAN) {//返回布爾類型的值returnString.valueOf(hssfCell.getBooleanCellValue()…

《快學Scala》勘誤

原文鏈接:http://www.blogjava.net/sean/archive/2012/11/15/391386.html ---------------- 第11頁(練習): 在Scala REPL中鍵入3,然后按Tab鍵 應為 在Scala REPL中鍵入3.,然后按Tab鍵 第19頁&#xff0…

二分排序java實現

1.什么是二分排序: 二分排序是指利用二分法的思想對插入排序進行改進的一種插入排序算法,不同于二叉排序,可以利用數組的特點快速定位指定索引的元素; 算法思想:二分法插入排序是在插入第i個元素時,對前面的…

pearson相關系數_pearson相關系數與典型相關性分析(CCA)

本文主要介紹相關系數的概念,以及簡單相關系數中的pearson相關系數及其局限性。隨后介紹pearson相關系數無法解決的問題(兩個變量組之間的相關性問題)的解決方案。1、pearson相關系數在日常中,我們經常會遇到一些關于相關性的分析,例如&#…

快學Scala習題解答—第三章 數組相關操作

原文鏈接:http://blog.csdn.net/ivan_pig/article/details/8257365 -------------------------------------------------- 4 數組相關操作 4.1 編寫一段代碼,將a設置為一個n個隨機整數的數組,要求隨機數介于0(包含)和n(不包含)之間 random和…