




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Windows Media Player控件研究 我的那個定時提醒程序中要用到它,初步使用問題已解決?;臼褂貌襟E如下:一、往控件箱中添加此控件:wmp.dll二、往窗體上拖控件三、wmp.URL=XXXX;wmp.play(即可。平常應(yīng)用就這三步就OK了。但是,我想寫個播放器的話,就遇到了一些問題。在dotnet中使用非基于dotnet的控件,需要做一些額外的事,不過這些事vs已經(jīng)幫我們做好了,當我們拖了此控件進窗體時,vs會自動調(diào)用 AxImp.exe,用它根據(jù)原有的dll或ocx生成一個用AxHost類包裝的新的一組程序集(更為精確的描述見msdn,于是根據(jù) WMPLib.dll生成兩個
2、文件:AxInterop.WMPLib.dll、Interop.WMPLib.dll。這兩個文件中包含了轉(zhuǎn)化后的類。 包裝后的控件繼承自System.Windows.Forms.AxHost。這是第一個問題,控件怎么使用呢?如果是拖控件,很簡單,無論如何都能有效的使用。但是,如果手工new創(chuàng)建控件的實例呢?那就不一定了。我做過種種實驗,獲得如下的結(jié)論:在非可視化類中無法創(chuàng)建有UI的控件的實例,或者是在沒有把實例加入到一個可視化的容器中時。我實驗了下面的代碼:AxWMPLib.AxWindowsMediaPlayer wmp = new AxWMPLib.AxWindowsMediaPlayer
3、(;this.Controls.Add(wmp;wmp.URL = "約定.mp3"wmp.Ctlcontrols.play(;這幾行代碼不一定能運行。發(fā)現(xiàn),如果這幾行代碼寫在窗體的構(gòu)造函數(shù)中,哪怕show出來都不能運行,只有寫在Load或Load之后的事件中,并且把窗 體show出來才有運行,否則會拋出一個錯誤:引發(fā)類型為 “System.Windows.Forms.AxHost+InvalidActiveXStateException”的異常。網(wǎng)上有些人也遇到這個 問題,其實都沒有談到點子上。甚為遺憾。是不是不show就一定不能運行呢?我拖了個播放器控件放窗體上,在In
4、itializeComponent后面寫了行play的代碼,能運行??梢姡@中間有蹊蹺啊。我比較了上面的代碼跟拖上去生成的代碼,有兩點不同:一、拖控件生成的代碼為多一對(System.ComponentModel.ISupportInitialize(this.wmp1.BeginInit(/EndInit(二、拖的控件多了一行:this.wmp1.OcxState = (System.Windows.Forms.AxHost.State (resources.GetObject("wmp1.OcxState"我查了MSDN,ocxstate是控件狀態(tài)。用于持久化控件的狀態(tài)
5、 的。com組件的狀態(tài)信息被寫在對應(yīng)窗體的資源文件中,用記事本打開窗體資源文件就可以看到。在手工創(chuàng)建中,這個ocxstate是沒法賦值的。我試了加入BeginInit、EndInit,沒用,可見問題是出在控件狀態(tài)問題上。沒有辦法了。取當前播放媒體的信息,這個很簡單,currentMedia就可以取得。怎樣創(chuàng)建播放列表呢?讓播放器依次播放指定的媒體呢?有辦法,我自己摸索出來的:wmp1.currentPlaylist.appendItem(wmp1.newMedia("約定.mp3"我看到網(wǎng)上的兄弟不曉得用currentPlaylist,在自己實現(xiàn)播放列表,我覺得沒必要。郁悶
6、無比,用wmp播放rmvb等非默認支持文件時,會彈出錯誤消息框,盡可以用一個屬性 wmp.settings.enableErrorDialogs=false控制它不顯示,但是,還是有一個后遺癥,就是調(diào)用 wmp.Ctlcontrols.play(時,它并不會播放,但是單擊一下自帶播放控制欄中的三角行按鈕就能播放了。郁悶啊。我又去的了暴風(fēng)3的mps.dll。果然,它用的是酷熱影音的內(nèi)核。不過,酷熱提供的這個控件實在太差勁了。沒什么高級功能。郁悶。還是wmp好啊。繼續(xù)研究wmp。我現(xiàn)在裝的是wmp11?,F(xiàn)在又找到一些更全的關(guān)于wmp API的資料,如下:屬性/方法名說明:詳盡的API文檔(比MSD
7、N更透徹:基本屬性 URL:String; 指定媒體位置,本機或網(wǎng)絡(luò)地址uiMode:String; 播放器界面模式,可為Full, Mini, None, Invisible(不計大小寫playState:integer; 播放狀態(tài)。這個屬性改變時同時引發(fā)PlayStateChange事件與StateChange事件。取值范圍為枚舉型:WMPLib.WMPPlayState,它的成員如下:wmppsUndefined = 0;/未知狀態(tài)wmppsStopped = 1;/播放停止wmppsPaused = 2;/播放暫停wmppsPlaying = 3;/正在播放wmppsScanForwa
8、rd = 4;/向前搜索wmppsScanReverse = 5;/向后搜索wmppsBuffering = 6;/正在緩沖wmppsWaiting = 7;/正在等待流開始wmppsMediaEnded = 8;/播放流已結(jié)束wmppsTransitioning = 9;/準備新的媒體文件wmppsReady = 10;/播放準備就緒wmppsReconnecting = 11;/嘗試重新連接流媒體數(shù)據(jù)wmppsLast = 12;/上一次狀態(tài),狀態(tài)沒有改變在PlayStateChange中寫代碼可以防止播放rmvb等非默認類型的問題(用wmppsReady。enableContextMen
9、u:Boolean; 啟用/禁用右鍵菜單fullScreen:boolean; 是否全屏顯示/播放器基本控制Ctlcontrols.play; 播放Ctlcontrols.pause; 暫停Ctlcontrols.stop; 停止Ctlcontrols.currentPosition:double; 當前進度Ctlcontrols.currentPositionString:string; 當前進度,字符串格式。如“00:23”Ctlcontrols.fastForward; 快進Ctlcontrols.fastReverse; 快退Ctlcontrols.next; 下一曲Ctlcontro
10、ls.previous; 上一曲settings wmp.settings /播放器基本設(shè)置settings.volume:integer; 音量,0-100settings.autoStart:Boolean; 是否自動播放settings.mute:Boolean; 是否靜音settings.playCount:integer; 播放次數(shù)/順序播放wmp.settings.setMode("shuffle", False/隨機播放wmp.settings.setMode("shuffle", True/循環(huán)播放wmp.settings.setMode
11、("loop", TruecurrentMedia wmp.currentMedia /當前媒體屬性currentMedia.duration:double; 媒體總長度currentMedia.durationString:string; 媒體總長度,字符串格式。如“03:24”currentMedia.getItemInfo(const string; 獲取當前媒體信息"Title"=媒體標題,"Author"=藝術(shù)家,"Copyright"=版權(quán)信息,"Description"=媒體內(nèi)容描
12、 述,"Duration"=持續(xù)時間(秒),"FileSize"=文件大小,"FileType"=文件類型,"sourceURL"=原始地址currentMedia.setItemInfo(const string; 通過屬性名設(shè)置媒體信息currentM:string; 同 currentMedia.getItemInfo("Title"currentPlaylist wmp.currentPlaylist /當前播放列表屬性currentPlaylist.count:int
13、eger; 當前播放列表所包含媒體數(shù)currentPlaylist.Iteminteger; 獲取或設(shè)置指定項目媒體信息,其子屬性同wmp.currentMediaaxWindowsMediaPlayer1.currentMedia.sourceURL; /獲取正在播放的媒體文件的路徑axWindowsMediaPlayer1.currentM; /獲取正在播放的媒體文件的名稱axWindowsMediaPlayer1.Ctlcontrols.Play播放 axWindowsMediaPlayer1.Ctlcontrols.Stop停止 axWindowsMediaPlaye
14、r1.Ctlcontrols.Pause 暫停 axWindowsMediaPlayer1.Ctlcontrols.PlayCount 文件播放次數(shù) axWindowsMediaPlayer1.Ctlcontrols.AutoRewind是否循環(huán)播放 (無效axWindowsMediaPlayer1.Ctlcontrols.Balance 聲道 axWindowsMediaPlayer1.Ctlcontrols.Volume音量 axWindowsMediaPlayer1.Ctlcontrols.Mute靜音 axWindowsMediaPlayer1.EnableContextMenu 是否
15、允許在控件上點擊鼠標右鍵時彈出快捷菜單 axWindowsMediaPlayer1.Ctlcontrols.AnimationAtStart 是否在播放前先播放動畫(無效axWindowsMediaPlayer1.Ctlcontrols.ShowControls 是否顯示控件工具欄(無效axWindowsMediaPlayer1.Ctlcontrols.ShowAudioControls 是否顯示聲音控制按鈕(無效 axWindowsMediaPlayer1.Ctlcontrols.ShowDisplay 是否顯示數(shù)據(jù)文件的相關(guān)信息(無效 axWindowsMediaPlayer1.Ctlco
16、ntrols.ShowGotoBar 是否顯示Goto欄(無效axWindowsMediaPlayer1.Ctlcontrols.ShowPositionControls 是否顯示位置調(diào)節(jié)按鈕(無效axWindowsMediaPlayer1.Ctlcontrols.ShowStatusBar是否顯示狀態(tài)欄(無效axWindowsMediaPlayer1.Ctlcontrols.ShowTracker是否顯示進度條(無效axWindowsMediaPlayer1.Ctlcontrols.FastForward 快進 axWindowsMediaPlayer1.Ctlcontrols.FastRe
17、verse 快退 axWindowsMediaPlayer1.Ctlcontrols.Rate 快進快退速率 axWindowsMediaPlayer1.AllowChangeDisplaySize 是否允許自由設(shè)置播放圖象大小(無效axWindowsMediaPlayer1.DisplaySize設(shè)置播放圖象大小(無效1-MpDefaultSize原始大小 2-MpHalfSize 原始大小的一半 3-MpDoubleSize原始大小的兩倍 4-MpFullScreen 全屏 5-MpOneSixteenthScreen 屏幕大小的1/16 6-MpOneFourthScreen 屏幕大小的
18、1/4 7-MpOneHalfScreen 屏幕大小的1/2 axWindowsMediaPlayer1.ClickToPlay是否允許單擊播放窗口啟動Media Player 在視頻播放之后,可以通過如下方式讀取源視頻的寬度和高度,然后設(shè)置其還原為原始的大小.private void ResizeOriginal(int intWidth = axWindowsMediaPlayer1.currentMedia.imageSourceWidth;int intHeight = axWindowsMediaPlayer1.currentMedia.imageSourceHeight;axWin
19、dowsMediaPlayer1.Width = intWidth + 2;axWindowsMediaPlayer1.Height = intHeight + 2;打開媒體文件并播放:Dim filePath As StringWith Me.OpenFileDialog1.Title = "打開語音文件".CheckPathExists = True.CheckFileExists = True.Multiselect = False.Filter = "mp3文件(*.mp3|*.mp3|所有文件(*.*|*.*"If .ShowDialog =
20、DialogResult.Cancel ThenExit SubEnd IffilePath = .FileNameEnd WithMe.Text = "PC復(fù)讀機-文件 " & filePathAxWindowsMediaPlayer1.URL = filePathTryMe.AxWindowsMediaPlayer1.Ctlcontrols.play(Catch ex As ExceptionMsgBox("對不起,不能播放此格式語音文件", MsgBoxStyle.OKOnly, "PC復(fù)讀機"Exit SubEnd T
21、ry注意:AxWindowsMediaPlayer1.URL 中URL是表示要播放的文件名,取消了原來的Name屬性.AxWindowsMediaPlayer1.Ctlcontrols.play(播放,同樣還有Pause,Stop等其他屬性.AxWindowsMediaPlayer1.settings.balance表示媒體播放的聲道設(shè)置,0表示均衡,-1和1表示左右聲道.AxWindowsMediaPlayer1.currentMedia.duration 表示要播放的文件的時間長度.可用它獲取文件長度.AxWindowsMediaPlayer1.Ctlcontrols.currentPos
22、ition表示正在播放的文件的當前播放位置,可用這個屬性來對媒體文件進行前進后退等設(shè)置.如AxWindowsMediaPlayer1.Ctlcontrols.currentPosition+1 表示前進1個時間單位.AxWindowsMediaPlayer1.settings.rate播放速率,一般乘以16后再顯示kbps單位.注意:在上面程序中,如果在后面加上一個:msgbox(AxWindowsMediaPlayer1.currentMedia.duration.ToString 則顯示結(jié)果很可能為0,因此,這時候很可能獲取不到文件的播放時間長度,容易出錯。所以在利用的時候可以加一個tim
23、er控件:Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs Handles Timer1.TickEndPoint = AxWindowsMediaPlayer1.currentMedia.durationIf EndPoint = 0 Then Exit Sub '可能因為媒體文件的打開需要一定時間,這里等待媒體文件的打開msgbox(AxWindowsMediaPlayer1.currentMedia.duration.ToString End Sub此時msgbox便會顯示文件播
24、放長度。2. Ctlcontrols屬性Ctlcontrols屬性是AxWindowsMediaPlayer的一個重要屬性, 此控件中有許多常用成員。(1 方法play用于播放多媒體文件,其格式為:窗體名.控件名.Ctlcontrols.play(如: AxWindowsMediaPlayer1.Ctlcontrols.play( 此處缺省窗體名是Me(2 方法pause用于暫停正在播放的多媒體文件,其格式為:窗體名.控件名.Ctlcontrols.pause(如: AxWindowsMediaPlayer1.Ctlcontrols.pause(3 方法stop用于停止正在播放的多媒體文件,其
25、格式為:窗體名.控件名.Ctlcontrols.stop(如: AxWindowsMediaPlayer1.Ctlcontrols.stop(4 方法fastforward用于將正在播放的多媒體文件快進,其格式為:窗體名.控件名.Ctlcontrols.fastforward(如: AxWindowsMediaPlayer1.Ctlcontrols.forward(5 方法fastreverse窗體名.控件名.Ctlcontrols.fastreverse(如: AxWindowsMediaPlayer1.Ctlcontrols.fastreverse(6. 屬性CurrentPosition
26、用于獲取多媒體文件當前的播放進度,其值是數(shù)值類型,使用格式為:窗體名.控件名.Ctlcontrols.currentPositiond1 =AxWindowsMediaPlayer1.Ctlcontrols.currentPosition其中d1 是一個整型變量。7. 屬性Duration用于獲取當前多媒體文件的播放的總時間,其值為數(shù)值類型,其使用格式為:窗體名.控件名.currentMedia.duration如:d2 =AxWindowsMediaPlayer1.currentMedia.duration其中d2是一個整型變量。對WMP的感嘆感嘆一這是我找到的關(guān)于WMP的最全的中文資料了。
27、剛才又查了一下,查到了MSDN有更全的API文檔,終于找到它了。上面的資料基本上夠用了,但是,如果要寫一個更為精致的播放器,這些還不夠啊??碝SDN去也。WMP11在MSDN中的位置如下:win32和COM開發(fā)-Griphics And MultiMedia-Audio And Vedio-Windows Media Player 11 SDK看了一個晚上的MSDN與資料。發(fā)現(xiàn)MSDN上關(guān)于WMP SDK的文檔也很不扎實。沒有實例。我要找的答案都不在上面。唯一的收獲是曉得了wpl。wmp有自己的播放列表文件,但是,我查遍msdn,發(fā)現(xiàn)sdk 并不提供手動保存播放列表的任何方法。所以,現(xiàn)在的問題
28、是,我們創(chuàng)建了一個IWMPPlayList,但是,這個接口不提供任何保存的方法,結(jié)果。 newPlayList(name,path只提供打開一個已有列表。郁悶。查了英文資料。老外建議用:StreamWrite/StreamRead 的辦法來讀寫wpl,我也看了。事實上wpl是一個xml文件。我們可以用System.Xml中的API來讀寫。不過,sdk中的這個漏子我始終無法釋 懷。感嘆二從WMP8開始就不支持mms/rtsp協(xié)議了,所用wmp.URL="mms:/xxxx"是不行的了。點此處見詳情,而mms這個協(xié)議現(xiàn)在還在廣泛使用。郁悶。因此,我們不能使用wmp來看網(wǎng)絡(luò)電視了
29、。使用WMP的常見問題:一、升級wmp后,再拖windows media player控件至窗體出錯的問題(至今沒解決,應(yīng)當是修改工程序文件,用文本編輯器二、播放rmvb/rm等非官方格式文件要先雙擊文件再點播放按鈕,而不能直接播放的問題,并彈出消息框:Windows Media Player下載文件遇到問題。有關(guān)幫助信息請單擊“Web幫助”。消息下面兩個按鈕:關(guān)閉、Web幫助。我沒有找到出現(xiàn)這個問題的官方說明。我個人意 見,這是因為wmp默認只播能播放官方指定的幾種類型的媒體。如果不是,wmp會試圖下載對應(yīng)的解碼器來播放。而這個下載過程失敗了,所以彈出這個消息 框。wmp好像沒有去判斷這個解碼器是否已經(jīng)存在。但是,如果你再點播放的話,又能播放,這是什么原因呢?應(yīng)當是wmp在這次會試圖搜索本機上的解碼器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地埂黃花施工方案
- 吉林大型溫室工程施工方案
- 疫情期間保障工程施工方案
- 云南石雕八角亭施工方案
- 甘肅移動式u型渠施工方案
- 都勻換熱器機組施工方案
- 鶴壁硅pu籃球場施工方案
- 同花順:2024年年度財務(wù)報告
- 2025年銅及銅合金材合作協(xié)議書
- 通風(fēng)管道改造施工方案
- 人民醫(yī)院診斷證明書
- 超聲刀操作標準
- 小學(xué)羽毛球特色教學(xué)教案羽毛球
- 蘇教版科學(xué)2023四年級下冊全冊教案教學(xué)設(shè)計及反思
- 普通高中課程標準2020修訂版
- 五年級道德與法治下冊全冊教案
- 高中英語公開課點評【6篇】
- 統(tǒng)編版《道德與法治》四年級下冊第9課《生活離不開他們》優(yōu)質(zhì)課件
- 2023年02月浙江金華事業(yè)單位公開招聘浦江縣編外專職統(tǒng)計人員10人參考題庫+答案詳解
- 畢業(yè)設(shè)計粘土心墻土石壩設(shè)計含計算書cad圖
- 電除顫課件完整版
評論
0/150
提交評論