HLS協定-如何下載與播放m3u8串流影片

Samuel Chin
Samuelism
Published in
Feb 2, 2021

什麼是hls,簡單來說,就是將原影片分割成許多小影片檔(.ts),然後用播放清單(m3u8)的方式告訴電腦,這些ts檔的播放順序。

因此,如何完整下載hls(m3u8)的影片到本地端,具體思路如下:
1. 下載所有ts檔、m3u8檔及key檔
2. 下載ffmpeg.exe
3. 整理檔案及重新命名
4. 用ffmpeg解密且合併ts檔

有些網站會將ts檔加密,這時就需要另外下載key檔進行解密後才能合併,如是沒有加密則不需要另外下載,通常沒有key檔就是沒有加密,有key檔就是有加密。

備註:在此提醒,下面下載影片為示範作用,為尊重他人著作財產權,轉載圖片、影片、文章等,應特別注意有無涉及著作利用的問題,以免招致著作財產權人提起告訴主張權利。

一. 下載所有ts檔、m3u8檔及key檔

首先,用google開啟影片所在的網頁後,用F12叫出開發者工具,切換頁籤到Network後,按F5重新整理。

利用左上方的篩選功能(Filter)找出ts檔、m3u8檔及key檔,通常m3u8檔及key檔各只會有一個,而ts檔則會有很多個。

可以用左上方的Filter更快找到目標檔案

但假如key檔及m3u8檔有兩個的話也不用怕,通常這樣的情況有兩種,兩個檔案長的其實一模一樣,或是有一個是明顯錯誤的檔案,只要點擊確認一下內容下載正確的檔案就可以了。

正常的m3u8檔
內容過少明顯有問題的m3u8檔

至於ts檔通常有上百個,這部分通常需要藉助外掛或第三方工具來批次下載,這裡推薦IDM(Internet Download Manager)或貓抓(Google外掛)。

IDM中文試用版下載

二. 下載ffmpeg.exe

可以從官網或其網站提供的連結下載,基本上這並不像是一般的應用程式會有許多檔案,我們需要的就只有ffmpeg.exe這個檔案,並且也不需要點擊它去安裝什麼,只要下載後將它跟ts檔、m3u8檔及key檔放到同一個資料夾即可。

ffmpeg官網
ffmpeg下載連結

三. 整理檔案及重新命名

為了方便作業,不論下載下來的檔案原本叫什麼,將m3u8檔重新命名為index.m3u8,將key檔重新命名為key.key,其他維持原樣,但下載下來的所有檔案必須整理到同一個資料夾,包括m3u8、key、ts檔及ffmpeg.exe。

打開m3u8檔編輯,可以用記事本或Visual Studio等編輯工具,可以發現大概第五行前後,有這一行編碼:

#EXT-X-KEY:METHOD=AES-128,URI="需要修改的地方",IV=0xea7a12d305932aa9823af917ced8f7ab

將需要修改的地方替換成key.key,若是沒有這一行則代表ts檔沒有加密,不需要執行這個操作。

四. 用ffmpeg解密且合併ts檔

按下Win+R叫出執行,輸入cmd後按下確定。

用cd指令將路徑指定到你存放ts、m3u8及key的資料夾。

最後,執行下面這段程式碼

ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.mp4

看到資料夾裡面出現out.mp4就大功告成啦

最後附上幾個常見的錯誤提示:

[https @ 0x7fb419607d40] Protocol 'https' not on whitelist 'file,crypto'!
MIE.m3u8: Invalid argument

看到上面這個錯誤提示需要檢查以下幾點:
1. white後面的名單是否與上面提供的一致
2. white後面的名單是否有用雙引號圍住
3. white名單後面是否有加上"-i"

[crypto @ 000000000054de40] Unable to open resource
[hls,applehttp @ 0000000000532c40] Failed to open segment
[hls,applehttp @ 0000000000532c40] Error when loading first segment
D:\temp\vd000\index.m3u8: Invalid data found when processing input

上面這些錯誤提示需要檢查以下幾點:
1. 每個#EXT是否都自己獨立一行
2. 每個ts檔名稱是否都自己獨立一行
3. 每行#EXT是否都沒有無意義的空白
4. 檔案是否都有放到同一個資料夾,且cmd.exe有用cd指定到這個資料夾

延伸閱讀:
網路影音名詞解釋
HLS直播協議介紹

--

--