在不借助流媒體播放器的前提下,直接播放 m3u8 格式的視頻文件
更多精彩
- 更多技術博客,請移步 IT人才終生實訓與職業(yè)進階平臺 - 實訓在線
寫在前面的話
為什么要播放 m3u8 格式的視頻
- 對于一個小視頻來說,理論上直接播放 mp4 的本地文件即可
- 但如果將網站部署到云上,其他用戶通過網址訪問時,想要看到這個視頻,就需要先完整的下載格式為 mp4 的視頻文件
- 當視頻文件下載完成后,網站才可以播放該視頻,這就對于用戶體驗是極大的下降
正規(guī)項目一般如何處理
- 對于一個大型項目來說,一般會視頻會使用流媒體播放器來播放視頻
- 例如阿里云的流媒體播放器,則是將所有視頻存儲到阿里云的流媒體服務器
- 網頁端通過阿里云為每個視頻提供的 VID 來訪問視頻
- 這首先需要在網頁端繼承一個流媒體播放器,同時還需要后端對接阿里云服務端,來獲取視頻的鑒權地址
- 帶來的好處是可以保證視頻資源相對安全,降低被人直接盜取的可能性
- 缺點則是對接起來過于繁瑣,在小項目上顯得得不償失
- 具體對接步驟可參考 Java + jQuery 實現阿里云點播
小項目可以如何快速操作
參考網址
實現步驟
下載視頻轉碼工具 FFmpeg
- 前往 FFmpeg Download 下載對應版本的工具
- 該工具不需要安裝,是通過命令行運行的
-
需要注意的一點:如果是 Mac 用戶,可能會嘗試使用 Homebrew 安裝,這里需要說的是 “可以,但是沒必要”
- 因為如果通過 Homebrew 安裝,會自動安裝一堆依賴文件,而且最后工具可能還安裝失敗
- 關鍵是該工具的使用不需要做任何系統(tǒng)配置,直接前往執(zhí)行文件目錄執(zhí)行對應命令即可
- 所以完全沒必要通過 Homebrew 安裝到系統(tǒng)中
使用 FFmpeg 對視頻進行轉碼
- 下載成功并解壓后的目錄入下圖
-
ffmpeg 就是執(zhí)行命令
image
-
-
打開終端,進入到上圖文件中的目錄
image - 為了操作簡單,將待轉碼的視頻直接復制到該目錄下
- 可以看到下圖中多了一個 video.mp4 文件
image
- 可以看到下圖中多了一個 video.mp4 文件
- 在終端執(zhí)行如下命令
./ffmpeg -i ./video.mp4 -c:v libx264 -hls_time 60 -hls_list_size 0 -c:a aac -strict -2 -f hls ./video.m3u8
- 執(zhí)行完成之后會在當前目錄多出 video.m3u8 和 video0.ts 文件,如下圖
image - 這個時候視頻轉換就完成了
- 需要注意的是上述生成的兩個文件需要保存在一起
將轉碼后的視頻文件放置到服務器中
- 需要注意的是,m3u8 格式的文件無法像 mp4 一樣通過 相對/絕對 路徑進行訪問
- 必須將其放置在某個服務器中,然后通過鏈接進行訪問
- 而且需要再次強調的是,video.m3u8 和 video0.ts 兩個文件必須放置在同一個目錄中
- 具體是放置在 Nginx ,還是 Tomcat 這個隨意,畢竟我們的靜態(tài)網站要部署,實際上也需要依托服務器
- 可以將視頻文件放置于網站相同的服務器中,只需要指定 網址 + 目錄 即可
下載視頻播放器 Video.js
- 前往 Getting Started with Video.js 可獲取視頻插件的 CDN 地址,或下載地址
- 推薦使用 CDN 地址,因為方便快捷
在項目中引入 Video.js 的 CSS/JS 文件
- 以下代碼引入的是在線文件
...
<link rel="stylesheet">
...
<script src='https://vjs.zencdn.net/7.4.1/video.js'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script>
...
在項目中引入 Video 標簽
- 可以看到以下代碼中的視頻文件是一個網址為前綴的鏈接
- 如果是本地調試的話,也可能是
http://127.0.0.1:8090/video/video.m3u8
- 如果是本地調試的話,也可能是
<video id="welcomeVideo" class="video-js vjs-default-skin">
<source id="source" src="http://www.asing1elife.com/video/video.m3u8" type="application/x-mpegURL" />
</video>
初始化 Video.js
- 具體參數如何使用,可以參考 Tutorial: options | Video.js Documentation
<script>
var myVideo = videojs('welcomeVideo', {
loop: true,
controls: false,
preload: 'auto',
autoplay: true
})
</script>



