基於vlc的unity3d vr視頻播放器開發,簡述


需求:

項目需要在vr設備(htc vive、pico、小π等vr設備)中顯示在線視頻和播放本地視頻的功能。


茶話:

當前做的比較好有htc vive的ViveCinema,場景做比較漂亮。他使用的是FFmpeg+SDL+GLEW。FFmpeg作爲視頻解析的庫在業內是非常有名,視頻的解析是從頭實現的,大部分其他開源項目都是基於它來實現解複用、解析等操作。SDL是一套開放源代碼的跨平臺多媒體開發庫,另外在遊戲方面使用的人是比較多的。GLEW不用說,opengl wrapper。但是ViveCinema僅支持本地視頻,那麼在線視頻呢?


unity3d是比較輕量級的遊戲引擎,在手機3d遊戲市場可謂如日中天。其燈光渲染效果可能沒有ue4等pc遊戲引擎好,但是其操作的簡易性,開發效率高等特點,得到了大量vr設備廠商和開發人員的青睞。對於C++程序來說,pc端ue4是最好的選擇,C#的內存方面的操作實在蹩腳,p/invoke也是非常蛋疼的。無奈vr設備廠商提供unity3d的包,項目採用unity3d開發。

確定使用unity3d開發,那麼問題來了,怎麼加載視頻呢?


首先需要了解vlc的結構,在此花了大量的時間......


思路是:

1、去vlc官網下載vlc庫(http://www.videolan.org/vlc/download-windows.html),當前是vlc-2.2.4-win64.zip;

2、解壓,分別將axvlc.dll、libvlc.dll、libvlccore.dll、npvlc.dll四個dll和plugins文件夾拷貝至unity3d項目Assert文件夾;

3、使用p/invoke 實現以上dll的接口,獲取vlc視頻流、視頻相關信息和控制事件;

4、在unity3d中新建一個sprite對象,並添加視頻控制的cs代碼,進行播放視頻功能控制;

5、根據3中的接口控制播放,並取得視頻流的回調,新建一個視頻流的cache數組,將回調函數中的視頻流數據放入cache數組中;

6、開始時在ui線程中,起一個定時器獲取視頻流數據,我這裏設置的是每個20ms執行一次,如果正常播放的話,每秒執行50次,就是50幀,應該夠了;

6、定時器中處理,在5中得到cache數組中取一幀數據。使用Texture2D類,新建Texture2D對象,關鍵函數爲LoadRawTextureData,即將二進制流數據轉換爲texture2d材質。然後使用Sprite.Create()使用轉換好的Texture2d變爲sprite精靈對象。這樣就顯示在4中新建的sprite對象中了。

7、還有些亂七八糟的參數和事件,後續慢慢解決...


碰到的問題:

unity3d中如何使用unsafe代碼?

a、不知道爲什麼我的vr機器上VS不能打開unity3d項目的屬性,在筆記本上可以打開,打開方法,右鍵項目屬性-Build-General-Allow Unsafe Code打上勾;

b、在unity3d項目的Assert下面新建一個名爲:smcs.rsp的文件,文件內容爲:-unsafe;

c、修改項目的player setting中Other Settings的Optimization中Api Compatibility Level改爲.Net 2.0 Subset。(關鍵)


簡單實現 重播,開始/暫停,下一個等功能。4k視頻,這個視頻播放時間顯示不正確....



歡迎來交流羣交流:323929978


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章