??大家好,我是阿趙。今天來學習一下Unity引擎怎樣播放自適應碼率視頻的方法。
一、 HLS是什么
??HLS是什么,各位可以自己百度一下。簡單的概括,HLS是一種自適應碼率流媒體傳輸協議,實現的是分片下載和動態碼率切換。
它的原理是把一段視頻切分開很多段,然后分段加載,如果遇到網速不好或者其他適應性問題,可以動態的切換到不同的碼率去播放。
二、 視頻怎樣轉換HLS
??如果需要本地把mp4之類的文件轉換成HLS協議播放,需要用到ffmpeg。
可以去官網下載:https://ffmpeg.org/
下載的時候,比如是Windows系統,可以選擇下面的Windows,然后選擇一個別人build好的exe版本:
??當下載完成之后,解壓縮,會是這樣:
??其中bin文件夾里面會有exe可執行文件:
??接下來使用ffmpeg來轉換視頻試試:
比如我拿了一個這樣的mp4文件:
??然后用cmd控制臺找到ffmpeg.exe存放的路徑,然后:
ffmpeg.exe -i d:/video/orig/Cones.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls d:/video/hls/Cones.m3u8
??這個命令的意思是,我的原始mp4文件放在d:/video/orig/Cones.mp4,然后想要轉換后的文件放在d:/video/hls/Cones.m3u8,然后是打算把視頻切片成10秒一段。
轉換后的文件是這樣的,包括一個m3u8文件,然后還有一個或者多個ts文件。
??這里只有一個ts文件,是因為我選擇的這個mp4文件本身就比較短,不到10秒,所以只能剪出一段。于是我改一下,改成3秒一段:
ffmpeg.exe -i d:/video/orig/Cones.mp4 -codec: copy -start_number 0 -hls_time 3 -hls_list_size 0 -f hls d:/video/hls/Cones.m3u8
??這時候就剪出3個ts文件了:
??打開m3u8文件看看:
??里面只是幾率了這個視頻的一些情況和ts文件的分布。
所以實際播放的視頻是在ts文件里面的。
三、 Unity引擎怎樣播放HLS
??Unity自帶的VideoPlayer用于播放mp4視頻是非常好用的,我們可以試試它是否能播放HLS的m3u8文件:
??很可惜,VideoPlayer是不能播放m3u8文件的:
??于是這里要用到一個視頻播放插件,叫做AVPro Video:
??具體的AVPro用法不是這次的重點,所以請自行下載和查詢。
設置一下AVPro的MediaPlayer,MediaSource設置成Path,然后類型改成Absolute PathOrUrl,把剛才不能播放的m3u8文件填入MediaPlayer里面:
??可以看到,這次在Unity引擎里面已經順利的播放出HLS協議的m3u8文件了:
四、 WebGL怎樣播放HLS
??下面試試把Unity項目導出成WebGL還保持播放視頻。先把剛才的項目試試導出WebGL:
??由于WebGL的特殊性,所以在MediaPlayer上面要選擇一下平臺特性,找到WebGL,設置External Library為Hls js。
??這里的意思是,需要通過Hls Js文件來播放WebGL下的視頻。
??這里主要需要hls.min.js
可以去這里下載:https://gitee.com/mirrors/hls-js/
下載下來之后會找到它:
??這時候用Unity打包WebGL,打包完是這樣的:
??然后打開TemplateData文件夾,把hls.min.js文件放到里面:
??再用編輯器打開Index.html:
??在head標簽里面加上一句調用:
<script src="TemplateData/hls.min.js"></script>
??由于WebGL是不能直接在本地播放的,所以把剛才生成的文件全部放到服務器去,比如本地搭一個阿帕奇服務器,這時候可以通過ip地址去訪問剛才的index.html。這個時候,網頁打開了,會看到視頻并沒有播放,而是停留在了第一幀:
??這里有個WebGL本身的問題,就是視頻和音頻不能自己播放,要在用戶操作后才能播放。為了測試,我簡單的加了個播放按鈕,點擊之后,視頻就正常開始播放了: