[Winform]Media Player com組件應用中遇到的問題


摘要

最近一個項目中,需要用到在客戶端全屏循環播放視頻,當時考慮使用開源的播放器,但控制起來不方便,然后考慮既然都是windows系統,那么可以考慮使用微軟自帶的Media Player播放器。所以在開發中,就在winform中嵌入了Media Player組件。下面就將開發中遇到的問題,做一個總結。

問題與解決辦法

首先要搞清楚Media Player到底是x86的還是x86的。我電腦系統是x64的,可以嘗試打開Media Player,在任務管理器中查看是不是x64的。

所以media player 是x86還是x86的。在開發中,最好以Any CPU 或者x86的方式運行或者生產項目,不然有可能出現渲染com組件失敗的情況。這個項目因為引入了cefSharp組件,需要指定運行平台,我這里設置為x86。

如果在添加com組件的時候報錯,可以嘗試關閉vs,將包含vshost的文件刪除,然后重啟vs,重新生成嘗試。

 如圖所示

 

這樣算是設置正常了,然后我們可以對它的屬性進行設置,在播放器上面右鍵屬性,如圖所示

選擇模式,可以對播放器下面的播放控制按鈕進行設置,是全顯示,還是不顯示,這個項目中是作為屏保的,所以這里讓其隱藏,所以設置為None,全屏設置為true。

關於全屏設置,也可以通過代碼進行控制,可以參考這篇文章:

[Winform]Media Player組件全屏播放的設置

這里可以通過屬性進行設置,比較方便,最好還是通過屬性來設置。一是方便,二是讓控制全屏的邏輯交給組件來進行。

勾選按比例拉伸,可以讓視頻平鋪。並且設置播放器的屬性Dock=Fill。

  this.windowsMediaPlay.Dock = System.Windows.Forms.DockStyle.Fill;

讓其填充窗口。

在項目中,因為設置的是x64的方式運行,以及沒有設置填充的方式。導致播放視頻出現白邊的bug。

循環播放的設置

 windowsMediaPlay.settings.setMode("loop", true);

在初始化完成Media Player時,最好加上初始化結束的標記

windowsMediaPlay.EndInit();

添加播放列表,默認播放目錄,如果包含mp4,wmv文件,加入播放列表

  windowsMediaPlay.settings.setMode("loop", true);
                    string[] filePaths = Directory.GetFiles(_videoDirPath).Where(x => x.EndsWith(".mp4") || x.EndsWith(".wmv")).ToArray();
                    //清空播放列表
                    windowsMediaPlay.currentPlaylist.clear();
                    //添加循環播放列表
                    foreach (var item in filePaths)
                    {
                        windowsMediaPlay.currentPlaylist.appendItem(windowsMediaPlay.newMedia(item));
                    }

播放

windowsMediaPlay.Ctlcontrols.play();

停止

windowsMediaPlay.Ctlcontrols.stop();

暫停

windowsMediaPlay.Ctlcontrols.pause();

屬性介紹

enableContextMenu:Boolean 顯示/不顯示播放位置的右鍵菜單
fullScreen:boolean 全屏顯示
stretchToFit:boolean 非全屏狀態時是否伸展到最佳大小
uMode:string 播放器的模式,full:有下面的控制條; none:只有播放部份沒有控制條
playState:integer 當前控件狀態,下面是三種基本狀態:
3:正在播放
2:暫停
1:已停止
狀態變化時會觸發OnStatusChange事件
[controls]
可通過WindowsMediaPlayer.controls對播放器進行控制並取得相關的一些信息:
controls.play; 播放
controls.stop; 停止
controls.pause; 暫停
controls.currentPosition:Double 當前播放進度
controls.currentPositionString:string 時間格式的字符串 "0:32"
[currentMedia]
可以通過WindowsMediaPlayer.currentMedia取得當前媒體的信息
currentMedia.duration Double 總長度
currentMedia.durationString 時間格式的字符串 "4:34"
[settings]
可以通過WindowsMediaPlayer.settings對播放器進行設置,包括音量和聲道等。
settings.volume:integer 音量 (0-100)
settings.balance:integer 聲道,通過它應該可以進行立體聲、左聲道、右聲道的控制。
=================
版本2:
屬性/方法名: 說明:
[基本屬性]  
url:string指定媒體位置,本機或網絡地址
uiMode:String; 播放器界面模式,可為Full, Mini, None, Invisible
playState:integer; 播放狀態,1=停止,2=暫停,3=播放,6=正在緩沖,9=正在連接,10=准備就緒
enableContextMenu:Boolean; 啟用/禁用右鍵菜單
fullScreen:boolean; 是否全屏顯示
[controls] wmp.controls //播放器基本控制
controls.play; 播放
controls.pause; 暫停
controls.stop; 停止
controls.currentPosition:double; 當前進度
controls.currentPositionString:string; 當前進度,字符串格式。如“00:23”
controls.fastForward; 快進
controls.fastReverse; 快退
controls.next; 下一曲
controls.previous; 上一曲
[settings] wmp.settings //播放器基本設置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自動播放
settings.mute:Boolean; 是否靜音
settings.playCount:integer; 播放次數
[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

Media Player事件屬性可參考MSDN

https://msdn.microsoft.com/en-us/library/windows/desktop/dd562419(v=vs.85).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM