接下來咱們要來介紹 HLS 協議。
HLS 協議
本篇文章將會分成幾個章節來理解 HLS 協議:
讓 client 與 server 可以透過 Http 來進行流媒體的傳輸
HLS ( HTTP Live Streaming ) 是由高大尚的蘋果公司所開發,再 HLS 還沒誕生之前,這世界大部份的流媒體傳輸都是被 RTMP 所佔據,最主要的原因在於當時,大部份的電腦都有裝 Flash Player。
而蘋果開發出 HLS 主要有兩個原因:
它將聲音切成一小個一小個檔案,然後 client 就一個一個發 http 去下載。
基本上 http 本身不能說它有支援傳輸串流媒體機制,但它的確有提供一個叫做http chunk
的東西,可以將要傳輸的數據分成多個來傳輸。但是如果要用這個方法來傳輸串流媒體,它的確可以傳輸流容器過去,但是問題要如何進行解析,那又需要在自幹一些標準,不然接受端如何知道要播放,這也是為啥說純 http 本身不提供串流媒體的功能。
因此蘋果就基於 HTTP 協議來開發出另一個應用層的協議 HLS,為了可以使用 HTTP 來進行串流媒體傳輸。
它的基本概念如下圖,首先它會將一段聲音或影像編碼,轉換成兩種檔案。
然後這個為實際上 .m3u8 檔案內所放的東西,其中比較重要的 EXTINF 代表這個 .ts 共有 4 秒長度,這也代表這一段聲音總共有 4 x 6 = 24 秒的長度。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#ID3-EQUIV-TDTG:2016-11-26T02:40:23
#EXT-X-MEDIA-SEQUENCE:376
#EXT-X-TWITCH-ELAPSED-SYSTEM-SECS:1511.137
#EXT-X-TWITCH-ELAPSED-SECS:1508.980
#EXT-X-TWITCH-TOTAL-SECS:1535.137
#EXTINF:4.000,
index-0000000377-6zCW.ts
#EXTINF:4.000,
index-0000000378-vHZS.ts
#EXTINF:4.000,
index-0000000379-Gkgv.ts
#EXTINF:4.000,
index-0000000380-PNoG.ts
#EXTINF:4.000,
index-0000000381-h58g.ts
#EXTINF:4.000,
index-0000000382-W88t.ts
接下來 client 如果要聽這一段聲音時,它會先用 http 發送一段請求,就如同下面的範例。
https://127.0.0.1/test.m3u8
然後它的過程如下,Server 會回傳個 .m3u8 檔案回來,然後它的內容就是說明這聲音檔被分割成那些 .ts 檔案,然後因為 Client 是遵循 HLS 協議,因此會在去取得這些 .ts 檔案來播放。
HLS 如果是要用在那種點播 (就是線上點選看影片那樣) 類型的應用,那是沒有什麼太大的問題,但是如果是在互動直動這種應用,那它就有很大的問題。
因為基本它 HLS 延遲大約 10 秒左右。
也就是說直播主話說以後,要大約 10 秒後才會到聽眾端。
咱們以下面的 .m3u8 為說明,下面的每一個 .ts 檔都為 4 秒,這也代表這一段聲音總共為 4 x 6 = 24 秒的長度,如果這是在直播的情況下,那不就代表這個直播主事實上已經說完了 24 秒的話了,對吧 ?
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#ID3-EQUIV-TDTG:2016-11-26T02:40:23
#EXT-X-MEDIA-SEQUENCE:376
#EXT-X-TWITCH-ELAPSED-SYSTEM-SECS:1511.137
#EXT-X-TWITCH-ELAPSED-SECS:1508.980
#EXT-X-TWITCH-TOTAL-SECS:1535.137
#EXTINF:4.000,
index-0000000377-6zCW.ts
#EXTINF:4.000,
index-0000000378-vHZS.ts
#EXTINF:4.000,
index-0000000379-Gkgv.ts
#EXTINF:4.000,
index-0000000380-PNoG.ts
#EXTINF:4.000,
index-0000000381-h58g.ts
#EXTINF:4.000,
index-0000000382-W88t.ts
以上面的例子,我們可以稱這一段聲音有 5 個片段,然後每個片段為 4 秒鐘,那我想問個問題。
當然可以 !
但是問題就在於要調整的如何 ?
首先來看看官網推薦:
官網建議 3 個片段,每個片段為 10 秒
但是如果使用這種建議,那就代表至少會延遲 30 秒,不過相對的看影片時就不會卡頓。
那如果縮小呢 ? 例如每個片段為 1 秒呢 ? 這樣的確可以降低延遲,但是相對的 Server 負擔會非常的龐大,非常的不建議這樣做。基本上如果真的要做那種很在意延遲性的應用,例如直播互動,請直接放棄掉 HLS。
請問文中提到
咱們以下面的 .m3u8 為說明,下面的每一個 .ts 檔都為 4 秒,這也代表這一段聲音總共為 4 x 6 = 24 秒的長度
是表示 HLS 會等一個 m3u8 所記載的全部 ts 下載完才能播放嗎?可以當時間較前面的 ts 抓到就先播放了嗎
答案是根據當前需求去預先下載部分需求內容後就撥放,根據進度不斷往前去下載更後面的內容。基本上可以透過開發者工具去觀察。