HTTP Live Streaming 是 Apple 實現(xiàn)的基于 HTTP 的自適應(yīng)比特率流通信協(xié)議猛拴,使用 HLS 可以直播(live)和點播(on-demand)音把敞、視頻。由于 HLS 采用了 HTTP 協(xié)議档插,使用普通 web 服務(wù)器和內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network乙濒,簡寫 CDN)即可毁嗦。HLS 專為可靠性而設(shè)計,可以根據(jù)網(wǎng)絡(luò)狀況動態(tài)播放當(dāng)前可播放最佳質(zhì)量音視頻娘纷。
目前嫁审,iOS、macOS赖晶、tvOS律适、PC、Android 等均支持 HLS 協(xié)議遏插,HLS 是應(yīng)用最為廣泛的流協(xié)議捂贿。
HLS 支持以下功能:
- 直播(Live broadcasts)和點播(video on demand,簡寫 VOD涩堤,即預(yù)錄內(nèi)容)眷蜓。
- 具有不同比特率的多個備用流。
- 根據(jù)網(wǎng)絡(luò)變化對流進行智能切換胎围。
- 數(shù)據(jù)加密和用戶身份驗證吁系。
下圖顯示了 HTTP Live Stream 的組成部分:
Apple 提供了幾個支持 HTTP Live Streaming 的框架,包括AVKit
白魂、AVFoundation
汽纤、WebKit
。
1. 術(shù)語
在學(xué)習(xí) HLS 之前福荸,需要先了解幾個相關(guān)概念蕴坪。
1.1 MPEG
動態(tài)圖像專家組(Moving Picture Experts Group,簡稱 MPEG)原本是一個研究視頻、音頻編碼標(biāo)準(zhǔn)的組織背传,成立于1988年呆瞻,致力于開發(fā)視頻、音頻壓縮編碼技術(shù)【毒粒現(xiàn)在我們所說的MPEG泛指該小組制定的一系列視頻編碼標(biāo)準(zhǔn)正式審核程序痴脾。至今已制定了MPEG-1、MPEG-2梳星、MPEG-3赞赖、MPEG-4、MPEG-7冤灾、MPEG-21前域、MPEG-H、MEPG-DASH等標(biāo)準(zhǔn)韵吨。
1.2 MPEG-2
MPEG-2 由 ITU 定義匿垄,也稱為 H.222 / H.262,是運動圖像和相關(guān)音頻信息的通用編碼標(biāo)準(zhǔn)归粉,它描述了視頻年堆、音頻有損壓縮的組合方法,該方法允許使用當(dāng)前可用的存儲媒體和傳輸寬帶來存儲盏浇、傳輸電影变丧。常用在數(shù)字衛(wèi)星電視、數(shù)字有線電視绢掰,以及 DVD 視頻光盤中痒蓬。
MPEG-2 標(biāo)準(zhǔn)作為 ISO / IEC 12818 的一部分發(fā)布。MPEG-2 包含多個標(biāo)準(zhǔn)滴劲,每個部分涵蓋整個規(guī)范的某個方面攻晒。例如,Part 1 系統(tǒng)描述音視頻同步和多路復(fù)用班挖;Part 7 部分描述了有損數(shù)字音頻壓縮的音頻編碼標(biāo)準(zhǔn)鲁捏,稱為高級音頻編碼(Advanced Audio Coding,簡稱 AAC)萧芙。AAC 被設(shè)計為 MP3 格式的后繼產(chǎn)品给梅,在相同的比特率下,其聲音質(zhì)量通常比 MP3 更好双揪。
1.3 MPEG-4
MPEG-4 定義了音視頻數(shù)字數(shù)據(jù)的壓縮方法动羽。于1998年推出,并指定了一組音頻渔期、視頻編碼格式的標(biāo)準(zhǔn)和相關(guān)技術(shù)运吓。MPEG-4 由 ISO/IEC MEPG 組織在 ISO / IEC 14496 標(biāo)準(zhǔn)發(fā)布渴邦。MPEG-4 標(biāo)準(zhǔn)壓縮的數(shù)據(jù)可用于網(wǎng)絡(luò)流媒體、CD 分發(fā)拘哨、電話谋梭、可視電話和廣播電視。
與 MPEG-2 類似倦青,MPEG-4 也包含多個部分章蚣,每個部分涵蓋整個規(guī)范的某個方面。例如姨夹,Part 2 描述了視覺數(shù)據(jù)的壓縮格式;Part 10 描述了視頻信號的壓縮格式矾策,在技術(shù)上與 ITU-T H.264 標(biāo)準(zhǔn)相同磷账。
1.4 H.264
H.264 被稱為高級視頻編碼(Advanced Video Coding,簡稱 AVC贾虽,也稱為 H.264逃糟、MPEG-4 Part 10、MPEG-4 AVC)蓬豁,是一種面向塊绰咽、基于運動補償?shù)囊曨l編碼標(biāo)準(zhǔn)。在2004年時 H.264 已成為高精度視頻錄制地粪、壓縮取募、發(fā)布最常用格式之一。第一版標(biāo)準(zhǔn)的最終草案于2003年5月完成蟆技。
H.264 / MPEG-4 AVC 項目的目的是為了創(chuàng)建一個更佳的視頻壓縮標(biāo)準(zhǔn)玩敏,在更低的比特率下依然能提供良好視頻質(zhì)量,同時不會大幅度增加設(shè)計的復(fù)雜性质礼。廣泛用于網(wǎng)絡(luò)流媒體旺聚、各種高清晰度電和衛(wèi)星。
1.5 H.265
H.265 被稱為高效率視頻編碼(High Efficiency Video Coding眶蕉,簡稱 HEVC)砰粹,是 MPEG-H 規(guī)范的第二部分。H.265 是一種視頻壓縮標(biāo)準(zhǔn)造挽,被視為 H.264 標(biāo)準(zhǔn)的繼任者碱璃。與AVC相比,HEVC 在相同視頻質(zhì)量下數(shù)據(jù)可以壓縮 25% 至 50%饭入,或相同比特率下可顯著提高視頻質(zhì)量厘贼。HEVC 支持高達 8192*4320 的分辨率,HEVC 的高保真 Main10 配置文件已經(jīng)集成到幾乎所有支持的硬件中圣拄。HEVC 正在與 IETF 的 AV1 編碼格式競爭嘴秸。
1.6 AC-3
AC-3 是音頻編碼(Audio Coding)的縮寫,是杜比數(shù)字音頻編碼器(Dolby Digital audio codec)的同義詞。除 Dolby TrueHD 外岳掐,音頻均為有損壓縮凭疮。通常,AC-3 幾乎只用于視頻串述,并且通常需要特殊許可的軟件或硬件才能進行編碼执解、解碼。除非用于電影纲酗、DVD和藍光項目衰腌,否則沒有理由使用AC-3。
1.7 AAC
AAC 被稱為高級音頻編碼(Advanced Audio Coding)觅赊,用于有損數(shù)字音頻壓縮的音頻編碼標(biāo)準(zhǔn)右蕊,被設(shè)計為 MP3 格式的繼任者。在相同比特率下吮螺,AAC 通常比 MP3 可以獲得更好的聲音質(zhì)量饶囚。AAC 是 iOS、Android 等系統(tǒng)的默認或標(biāo)準(zhǔn)音頻格式鸠补。
2. HLS 架構(gòu)
這一部分介紹 HLS 主要組件如何協(xié)同工作以傳遞流媒體萝风。從概念上講,HTTP Live Streaming 包含三部分:服務(wù)器組件紫岩、分發(fā)組件和客戶端軟件规惰。
在常見配置中,硬件編碼器接受輸入的音視頻泉蝌,將其編碼為 HEVC 視頻卿拴、AC-3 音頻,輸出片段化(fragmented)MPEG-4 文件或 MPEG-2 傳輸流梨与,分段器(segmenter)軟件將 stream 分割成系列短媒體文件堕花,然后將短媒體文件放在 web 服務(wù)器上。segmenter 還會創(chuàng)建并維護一個包含媒體文件列表的索引文件(index file)粥鞋。索引文件的 URL 在 web 服務(wù)器上發(fā)布缘挽,客戶端讀取索引文件,按順序讀取列出的媒體文件并播放呻粹,各片段間沒有任何暫秃韭或間隔。
2.1 服務(wù)器組件
服務(wù)器組件負責(zé)獲取媒體輸入流并對其進行數(shù)字編碼等浊,將其封裝成適合傳輸?shù)母袷饺迹榉职l(fā)做準(zhǔn)備。
對于直播筹燕,服務(wù)器需要媒體編碼器(可以是現(xiàn)有的硬件)轧飞,以及一種將編碼的媒體分割成片段并保存為文件的方法衅鹿,該方法可以是由 Apple 提供的 media stream segmented,也可以是第三方解決方案过咬。
2.2 分發(fā)組件
分發(fā)系統(tǒng)是 web 服務(wù)器或 web 緩存系統(tǒng)大渤,通過 HTTP 將媒體文件和索引文件傳輸?shù)娇蛻舳恕TTP Live Streaming 協(xié)議不需要對服務(wù)器模塊進行任何自定義即可用于傳輸內(nèi)容掸绞,且 web 服務(wù)器只需要很少的配置泵三。要實際使用 HTTP Live Streaming,需要將 HTML 頁面或 app 作為接收器衔掸,還需要使用 web 服務(wù)器烫幕,以及將實時流編碼為 HEVC 或 H.264視頻、 ACC 或 AC-3 音頻的分段 MPEG-4 媒體文件敞映。
2.3 客戶端軟件
客戶端軟件負責(zé)確定所請求媒體資源類型较曼、下載所需資源、重新組合資源驱显,最后將媒體連續(xù)的呈現(xiàn)給用戶。目前瞳抓,Windows 10埃疫、macOS 10.6+、iOS 3.0+孩哑、Android 4.1+ 等均原生支持 HLS栓霜,大部分瀏覽器也支持HLS。點擊這里可以查看各瀏覽器起始支持 HLS 版本横蜒。
客戶端軟件使用標(biāo)志流媒體位置的 URL 獲取 index file胳蛮,index file 指定可用媒體文件位置、解密密鑰和可選流丛晌。選定流后仅炊,客戶端按順序下載可用媒體文件,每個文件包含一段連續(xù)的 stream澎蛛。當(dāng)擁有足夠數(shù)據(jù)后抚垄,客戶端播放重組的 stream。
客戶端負責(zé)獲取解密密鑰谋逻、身份認證呆馁,根據(jù)需要解密媒體文件。
這些過程會一直持續(xù)毁兆,直到在 index file 遇到 EXT-X-ENDLIST tag浙滤。如果沒有 EXT-X-ENDLIST tag,則 index file 是直播的一部分气堕。在直播期間纺腊,客戶端會定期拉去 index file 的新版本畔咧,并在新版本的 index file 中查找新的媒體文件和加密密鑰,并將這些 URL 添加到隊列摹菠。
3. 部署基礎(chǔ)的 HTTP Live Stream
部署 HTTP Live Stream 需要滿足以下三點:
- HTML 網(wǎng)頁或客戶端作為接收者盒卸。
- Web 服務(wù)器或 CDN 作為主機。
- 一種將媒體文件或直播流編碼為包含 HEVC 或 H.264 視頻次氨、 AAC 或 AC-3 音頻的 MPEG-4 片段文件的方式蔽介。盡管也可以將 MP3 音頻或 MPEG-2 用于傳輸 H.264 視頻,但通常不推薦使用這些格式煮寡。
3.1 創(chuàng)建 HLS 媒體接收器
分發(fā) HTTP Live Streaming 媒體最簡單的方法是使用 M3U8 播放列表文件作為視頻源虹蓄,創(chuàng)建包含 HTML5 <video> 標(biāo)簽的網(wǎng)頁,對于不支持 HTML5 視頻元素的瀏覽器幸撕,或不支持 HTTP Live Streaming 的瀏覽器薇组,可以在 <video> 和</video> 標(biāo)簽之間添加降級代碼。例如坐儿,可以使用 QuickTime 插件回退到漸進式下載或 RTSP 流律胀。以下示例顯示了常見 HTML 網(wǎng)頁代碼:
<html>
<head>
<title>HTTP Live Streaming Example</title>
</head>
<body>
<video controls="controls" autoplay="" src="https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8" type="video/x-m4v">
</video>
</body
></html>
如果你在開發(fā) iOS app,則可以使用AVKit
框架直接播放:
func playHLSVideo() {
guard let videoURL = URL(string: "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8") else {
return
}
let player = AVPlayer(url: videoURL )
let playerViewController = AVPlayerViewController()
playerViewController.player = player
present(playerViewController,
animated: true) {
playerViewController.player?.play()
}
}
3.2 配置服務(wù)器
普通的 web 服務(wù)器即可提供 HTTP Live Streaming貌矿。對服務(wù)器進行常規(guī)配置炭菌,然后將要提供文件的 MIME 類型與文件擴展名相關(guān)聯(lián)。下表顯示了 HTTP Live Streaming 的 MIME 類型:
擴展名 | MIME 類型 |
---|---|
.m3u8 | vnd.apple.mpegURL |
.ts | video/MP2T |
.mp4 | video/mp4 |
如果 web 服務(wù)器需要遵守 MIME 類型約束逛漫,則可以提供以 .m3u 結(jié)尾 MIME 類型為 audio/mpegURL 的文件黑低,以實現(xiàn)兼容性。
索引文件通常很長酌毡,經(jīng)常被重新下載克握,但由于他們是文本文件,因此可以非常高效地進行壓縮枷踏。通過啟用 M3U8 索引文件的實時 gzip 壓縮來減少服務(wù)器開銷菩暗。HTTP Live Streaming 客戶端會自動進行解壓縮。
對于點播類型視頻旭蠕,索引文件格式如下:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://example.com/movie1/fileSequenceA.ts
#EXTINF:10.0,
http://example.com/movie1/fileSequenceB.ts
#EXTINF:10.0,
http://example.com/movie1/fileSequenceC.ts
#EXTINF:9.0,
http://example.com/movie1/fileSequenceD.ts
#EXT-X-ENDLIST
各標(biāo)記用途如下:
EXTM3U:表示此播放列表是擴展為 M3U 的文件列表勋眯。通過將第一行標(biāo)記改為 EXTM3U,可以將這種類型的文件與基本的 M3U 文件區(qū)分開下梢。所有 HLS 播放列表都必須以此標(biāo)簽開頭客蹋。
EXT-X-PLAYLIST-TYPE:提供使用于整個播放列表的文件是否可變信息。此標(biāo)簽內(nèi)容為 EVENT 或 VOD孽江。如果標(biāo)簽為 EVENT讶坯,則服務(wù)器不能改變、刪除索引文件的任何部分岗屏,但可以向尾部拼接辆琅。如果標(biāo)記為 VOD漱办,則播放列表不可更改。
EXT-X-TARGETDURATION:指定媒體文件最大時長婉烟。
EXT-X-VERSION:表示播放列表文件的兼容版本娩井。播放列表媒體和服務(wù)器必須符合該版本協(xié)議的 IETF Internet-Draft 最新規(guī)定。
EXT-X-MEDIA-SEQUENCE:要播放的第一個媒體文件序列號似袁。播放列表中的每個媒體文件 URL 都有一個唯一的整數(shù)序列號洞辣,URL 的序列號是其前面的 URL 序列號加一,序列號與文件名無關(guān)昙衅。
EXTINF:記錄標(biāo)記扬霜,描述緊隨其后的 URL 所標(biāo)識媒體文件。每個媒體文件 URL 之前都必須有一個 EXTINF 標(biāo)記而涉。該標(biāo)記包含一個 duration 屬性著瓶。duration 屬性是一個整數(shù)或浮點數(shù),指定媒體段的持續(xù)時間(以秒為單位)啼县,該值必須小于等于目標(biāo)持續(xù)時間材原。
始終使用浮點 EXTINF 時長(協(xié)議版本 3 中增加的),這將使客戶端在流中搜素時減少出現(xiàn)錯誤季眷。
EXT-X-ENDLIST:標(biāo)記媒體文件結(jié)束余蟹,不會再添加新的媒體文件到播放列表。
上面的 VOD 播放列表使用完整路徑描述媒體文件瘟裸。盡管可以使用絕對路徑客叉,但更推薦使用相對路徑诵竭。相對路徑是相對于播放列表文件的位置话告,使用絕對路徑會導(dǎo)致更多文本,且相對路徑比絕對路徑更可移植卵慰。下面是使用相對路徑的同一播放列表:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
fileSequenceA.ts
#EXTINF:10.0,
fileSequenceB.ts
#EXTINF:10.0,
fileSequenceC.ts
#EXTINF:9.0,
fileSequenceD.ts
#EXT-X-ENDLIST
直播和 event session 播放列表會有所不同沙郭,具體可以查看:Live Playlist (Sliding Window) Construction 和 Event Playlist Construction。
對于點播來說裳朋,整個媒體文件已經(jīng)存在病线。因此,索引文件是靜態(tài)的鲤嫡,只會被下載一次送挑。對于直播來說,索引文件不斷更新暖眼,當(dāng)新媒體資源可用時惕耕,會替換掉原來媒體資源。對于 event session 來說诫肠,新媒體文件可用時會拼接到索引文件結(jié)尾司澎,與點播不同的是欺缘,不能移除索引文件任何內(nèi)容,只能向文件尾部拼接新的媒體片段挤安,event session 允許用戶跳轉(zhuǎn)到已經(jīng)播放過片段任一時刻谚殊,即等效于點播+直播,常用于演唱會蛤铜、運動會嫩絮。
3.3 驗證流
Apple 提供的 HTTP Live Streaming Tools 包含 Media Stream Segmenter、Media File Segmenter昂羡、Media Subtitle Segmenter絮记、Variant Playlist Creator、Media Stream Validator虐先、 HLS Report怨愤、ID3 Tag Generator 幾種工具。
Media Stream Validator 工具模擬 HTTP Live Streaming 會話蛹批,并驗證索引文件和媒體片段是否符合 HTTP Live Streaming 規(guī)范撰洗。其會執(zhí)行多次檢查以確保流傳輸可靠,如果發(fā)現(xiàn)錯誤腐芍、問題差导,會在診斷報告中列出。在提供流服務(wù)前猪勇,請始終運行驗證程序设褐。
mediastreamvalidator 命令如下:
$ mediastreamvalidator https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8
上述命令執(zhí)行完畢后,會產(chǎn)生一個 validation_data.json 的診斷報告泣刹,但其內(nèi)容并不方便閱讀助析,可以使用下面的 python script 將其轉(zhuǎn)換為 html 格式:
$ hlsreport.py validation_data.json
生成的 validation_data.html 如下圖所示:
mediastreamvalidator 命令即可以驗證 HTTP URLs 的資源,也可以驗證本地資源椅您。
使用 mediastreamvalidator 命令時如需幫助外冀,輸入
mediastreamvalidator -h
命令即可查看文檔。
此前掀泳,HLS 缺點一直是高延遲雪隧。但 Apple 在 WWDC 2019 發(fā)布了新的解決方案,可以將延遲從8秒降低到1至2秒员舵。具體可以查看Introducing Low-Latency HLS脑沿。
參考資料:
- HTTP Live Streaming
- Validating HTTP Live Streams
- How is AAC better than AC3?
- What is the difference between AAC and AC3 in quality? How can it be determined?
本文地址:https://github.com/pro648/tips/wiki/HTTP-Live-Streaming-詳解
歡迎更多指正:https://github.com/pro648/tips/wiki