論如何下載一個在線的m3u8文件到本地成為一個mp4!
一、前言
現(xiàn)在比較常見的視頻流媒體,大部分都是 m3u8 格式的,而對于 m3u8 格式的視頻而言,如果你下載過,你會發(fā)現(xiàn)它就是一個文本文件,大概也就只有幾十 kb,從磁盤大小來看,應(yīng)該也知道它并不是一個直接的視頻文件。
而假如我們想要下載對應(yīng)的視頻文件,直接下載 m3u8,當(dāng)然是達不到目的的,那么本文就來說說,如何直接下載一個網(wǎng)上的 m3u8 文件,保存成一個比較常規(guī)的 mp4 文件。
這個在 Windows 下,應(yīng)該是有現(xiàn)成的工具可以完成,但是 Mac 就沒有了,我也沒試過 Windows 的工具,有需要自行搜索。
二、下載一個 m3u8
2.1 什么是 m3u8
說到 m3u8 就要先說說 HLS(HTTP Live Streaming)。HLS 是 Apple 公司針對 iPhone、iPod、iTouch 等移動設(shè)備,而研發(fā)的基于 HTTP 協(xié)議的流媒體解決方案。在 HLS 技術(shù)中,Web 服務(wù)器可以向客戶端提供接近實時的音視頻流,但是它又是使用的標(biāo)準的 HTTP 協(xié)議。所以基本上,比較大型的點播直播類服務(wù),都是基于 HLS 的。
而該技術(shù)的原理,就是將視頻文件或者視頻流,進行切片(ts文件),并建立索引文件(m3u8),它支持的視頻流編碼為 H.264,音頻流編碼為 AAC。
簡單來說,基于 HLS 的視頻流,會將完整的視頻,切割成一個個比較小的視頻片段(ts 文件),然后根據(jù)協(xié)議組合成一個 m3u8 文件。這些比較小的 ts 文件,是可以單獨播放的。而視頻播放器,拿到 m3u8 文件之后,根據(jù)對其內(nèi) ts 片段的索引,連續(xù)播放不同的視頻片段,來達到流暢的播放效果。
2.2 下載的 m3u8 文件
說這些概念都沒用,我們來看兩個真實的被下載的 m3u8 文件。
這種 m3u8 文件就還是比較清晰的,能看到它一個個的片段。但是需要注意的是,這里的片段,全部是基于域名的相對地址,也就是說,這樣一個 m3u8 文件,你丟到播放器里,是無法播放的,但是如果你記錄了原始下載這個 m3u8 的鏈接,它在播放器里是可以正常播放的。
當(dāng)然,如果你修改這個 m3u8 文件,將它相對路徑拼接上域名地址,也是可以達到播放的效果的。
再來看看另外一種 m3u8 文件,它其內(nèi)的 ts 片段,都是完整地址。
像這種具有完整地址的 ts 片段,哪怕你將它保存成一個本地的文件,播放器依然是可以直接播放的,不過這里本質(zhì)上依然是在在線播放。
這兩中 m3u8 文件,雖然有細微的差別,但是它們都是基于標(biāo)準的協(xié)議。
簡單總結(jié)一下:
- m3u8 不是視頻內(nèi)容的文件,它占用的磁盤空間非常的小。
- m3u8 文件,如果其內(nèi)的 ts 片段,是完整地址,則可以保存后播放,否者只能在線播放。
- 播放器播放 m3u8 文件的時候,實際上,還是在線從線上獲取的視頻流進行播放,所以是存在失效的情況的。
暫時知道這三點就可以了,接下來我們再看如何將一個 m3u8 文件,下載成一個 mp4 視頻文件。
三、ffmpeg
好了,不賣關(guān)子了,這里下載 m3u8 會需要使用 ffmpeg。
ffmpeg 是一套可以用來記錄、轉(zhuǎn)換音視頻,并將其轉(zhuǎn)化為流的開源程序,采用 LGPL 或 GPL 協(xié)議許可證書,很多大型的音視頻軟件,內(nèi)部都是基于 ffmpeg 的。不了解不要緊,總之知道它對操作 ffmpeg 非常的方便。
如果本機上沒有,就需要安裝了。在 Mac 下,使用 homebrew 下載 ffmpeg 非常的方便。
- brew install ffmpeg
等待安裝成功的提示就好了。
如果已經(jīng)安裝的,***也使用 brew 命令確認一下,有以下輸出,表示沒問題。
工具配置沒什么好說的,沒安裝的可以借助搜索引擎。
配置好 ffmpeg 的環(huán)境之后,只需要一行命令,就可以自動下載一個遠端的 m3u8 文件,并且以一個 mp4 格式保存。
- ffmpeg -i "m3u8_file_uri" "save_video.mp4"
到此,如果 m3u8 的鏈接正確可播放,就會開始下載,等待下載完成就可以了,最終會在指定目錄下,保存 save_video.mp4 文件,它就是最終我們下載的離線視頻文件。
四、you-get
大部分情況下,我們沒辦法直接獲取到 m3u8 的鏈接,一般通過瀏覽器的調(diào)試工具,或者抓包的方式來獲取。
而如果我們只是需要下載一些常見的視頻網(wǎng)站的視頻的話,Github 上,還有一個開源庫,soimort/you-get ,就可以解決你的需求。
它只需要傳遞一個視頻的地址,就會全自動下載。它的原理是去解析視頻網(wǎng)站,拿到真實的播放地址,進行下載。而且例如 YouTube 等視頻網(wǎng)站,如果有帶有字母,能識別的話也會自動識別一同下載,最終以 SubRip 格式保存字母。
而 you-get 依賴 Python 和 ffmpeg 的,所以要提前安裝它們。
如果你已經(jīng)配置好 Pyhone3 的環(huán)境,安裝 you-get 非常的簡單。
- pip3 install you-get
安裝之后,就可以通過 you-get 命令進行下載了。
顯示的信息還是很完整的,而且有標(biāo)準的下載進度。跟多細節(jié),可以直接看 Github 上的文檔。
- you-get:
- https://github.com/soimort/you-get
如果是比較知名的視頻網(wǎng)站,還是推薦使用 you-get ,它本身支持的網(wǎng)站也很多(文檔上有支持的標(biāo)識),基本上做到了一鍵下載,支持的網(wǎng)站太多了,這里就不一一截圖了,基本上國內(nèi)外的大點的視頻網(wǎng)站都有,不過具體哪些能下載,就要具體問題具體分析了。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】