前言(蛋疼的背景故事)html
前段時間,接了一個小項目,有個需求是要在系統待機一段時間之後,循環播放 MV(相似於 Windows 系統的屏幕保護)。git
聽到這個需求,我首先想到的是 MediaPlayer 和 Flash,由於這兩個組件幾乎全部 Windows 平臺的電腦都會安裝。但客戶說不能用 Flash,緣由是之前使用過,太不穩定,因此我決定使用 MediaPlayer。github
MediaPlayer 作爲一個 COM 組件能夠很方便的加載到 VS 工具箱中,使用的時候直接拖放到 Form 上,用起來超級簡單。並且,網上隨便搜一下都有大把的示例。因此,進展很順利。。。app
後來,上線幾天之後,問題來了。客戶反應有一次下午下班,系統運行之後忘關了,次日早上就只顯示系統桌面,不肯定何時「閃退」了。因此他們次日就專門測試了待機問題,而後發現待機的時候很頻繁的會出現閃退問題。。我當時直覺就是:一堆SB啊,別 TM 網上下載 GHO 鏡象安裝帶着一堆病毒和插件的系統,別 TM 裝個殺毒軟件把老子進程給殺掉(由於我測試的時候程序裏的某段操做代碼被360當成病毒殺了,我覺得也是殺毒軟件的問題)。函數
我抱着對 Microsoft 無比信任的情懷,一邊默默罵着SB,一邊讓他們用官方的 ISO 重裝系統。而且要求不要安裝殺毒軟件或者在殺毒軟件裏把個人程序設爲信任。同時,我從新檢查了一下系統裏的全部方法,確保全部的操做都都異常處理,而且,增長了 Application 級的異常處理。。然而,沒什麼卵用。工具
無奈,去現場調查。。他們果真沒有忽悠我,正當我舒服的靠在椅子上欣賞我喜歡的那首MV的時候,程序沒了,就那樣直接沒了,連一個錯誤消息都沒有。作 .NET 這麼久,一直信賴的異常處理機制居然沒起做用。。那感受,就好像冬天的大早上忽然被人掀了被子那樣的渴求溫暖,就好像脫光了正和妹子纏綿的時候妹子忽然消失了的那種空洞。。。post
後來,和他們仔細的確認了一下問題出現的頻率。他們說這個問題出現的時間不定,有時候三四個小時,有時候六七個小時。有時候報錯「***.exe 已中止運行」,有時候啥都沒有,直接程序界面就消失了,彷彿歷來沒有啓動過似的。。他們曾經換了一臺電腦測試,問題更甚,有時候半個小時就會崩潰一次。測試
程序直接消失,異常捕獲的代碼確定是沒有執行,事實上也是,Log 都是忽然中斷,沒有任何異常和關閉邏輯的日誌。深刻調查時,發現更奇葩的狀況是這個錯誤連繫統日誌都不必定記錄。。聽他們反應這兩天系統閃退過七八次,可是系統裏關於這個應用的日誌只有三條,並且沒有剛纔我看到的那次閃退的任何日誌記錄。。只是在其中一個錯誤記錄裏,查到的錯誤代碼說是「組件異常」。。組件,那只有 MediaPlayer 了。。。網站
百度、Google、Bing、360搜索,然而並無什麼卵用。。網上大可能是對 MediaPlayer 組件的介紹和易用性、便捷性的讚美,就是那種能教會小白們寫一個簡單的播放窗體的那種滿滿的成就感,一點深刻的線索都沒找到。。spa
無奈,決定放棄 MediaPlayer。
後來,找到了一個博客中介紹的 VLC Player(不過我忘了具體是哪位前輩的文章了)。
按博客裏的介紹,下載了組件,寫了一個簡單的Demo,而後加入系統,運行起來貌似好多了。只是後來他們反應有一個 MV 播放到某個時間點的時候,會報錯,又查資料,終於在一個EN文網站上查到緣由說是版本問題,下載最新的 VLC Player ,拿到最新的庫使用就好了。
而後,下載了 VLC Player ,安裝,在安裝目錄裏找到最新的 DLL 和插件包,覆蓋到項目裏,果真再沒出現閃退的問題。
又能夠懶洋洋的靠在椅背上喝着客戶公司漂亮妹子作好的咖啡裝逼了,順便欣賞着咖啡上心形的拉花,YY着妹子豐滿的身材。。。
正文開始
VLC Player 是一個功能很是很是強大的播放器,界面低調簡潔,徹底不像其它播放器那樣有一個風騷又混亂的外觀。
再看它支持播放的媒體文件格式,完甩 MediaPlayer 幾十條街:
在 GitHub 上有一個關於 VLC Player 的開源項目,叫 Vlc.DotNet,貌似也是基於播放器裏的 DLL 封裝的類庫,地址是:https://github.com/ZeBobo5/Vlc.DotNet 。這個類庫功能很強大,可是功能強大也意味着比較複雜。我沒有使用這個程序包,而是網上找了一個簡單的直接映射 DLL 庫函數的方式實現的播放功能。
第一步:獲取 VLC 類庫。
獲取 VLC 類庫有兩種方式:
1,從上面那個開源項目 Vlc.DotNet 裏,能夠下載到整個項目的源碼和所用到的 VLC 庫文件,咱們這裏只使用 VLC 的庫文件,如圖:
(爲了以防客戶32位和64位系統一塊兒使用,因此這裏使用了32位的庫x86)
2,下載一個 VLC 播放器,安裝,而後在安裝目錄裏能找到須要的類庫,如圖:
咱們只須要 libvlc.dll、libvlccore.dll 和 plugins 目錄,因此能夠忽略其它文件。
libvlc.dll、libvlccore.dll 文件中是 VLC 的庫函數,plugins 目錄裏是 VLC 對各類不一樣媒體文件提供支持的插件。
第二步:映射、封裝 dll 庫函數。
libvlc.dll、libvlccore.dll 這兩個不是.NET 類庫,因此沒辦法直接引用到咱們的項目裏,這裏我參考其餘前輩們的示例,對其進行封裝,方便使用。
由於代碼較長,因此這裏不直接貼出來了,須要的朋友能夠在這裏下載 http://files.cnblogs.com/files/zhhh/VlcPlayerBase.zip
代碼裏封裝了 播放、暫停、中止、音量控制、進度控制等一些經常使用功能,以便後面使用。
第三步:使用
封裝完之後就能夠直接調用了,設計一個簡單的界面。如圖:
添加相應的功能,就OK了。
項目代碼能夠從下面連接下載:http://files.cnblogs.com/files/zhhh/VlcPlayer.zip
第四步:裝逼
最後,項目運行以前,必定要將前面咱們準備好的庫文件(libvlc.dll、libvlccore.dll 和 plugins 目錄) Copy 到程序運行根目錄,好比 Debug 目錄,如圖:
Copy 完,就能夠裝逼了。
運行 -> 打開 -> 播放,很是完美,Pen Pineapple Apple Pen:
最後
DLL 其實是使用 VLC 的參數對播放器進行的配置和操做,對於這些參數的介紹,能夠參考 VLC Player 安裝目錄下的 幫助文件 vlc-help.txt,如圖: