什么是HLS(HTTP Live Streaming)?
點(diǎn)擊上方“LiveVideoStack”關(guān)注我們
翻譯 | Alex
技術(shù)審校 | 趙軍
本文來(lái)自O(shè)TTVerse,作者為Krishna Rao Vijayanagar。
HLS
Easy Tech
#013#
2009年,Apple推出了HLS(HTTP Live Streaming)——基于HTTP的自適應(yīng)碼率流媒體傳輸協(xié)議。HLS描述了一組通過(guò)互聯(lián)網(wǎng)提供音視頻服務(wù)的工具和程序。一個(gè)視頻可以被分割成多個(gè)視頻切片,這些切片的傳送位置和順序在一組被稱為播放列表的XML文件中,該文件以文件擴(kuò)展名m3u8結(jié)尾。人們可以使用兼容了HLS的播放器播放視頻。
審校者注:原文說(shuō)HLS使用了XML文件,是一個(gè)錯(cuò)誤的說(shuō)法,為了保留和原文一致,翻譯并未去糾正這個(gè)錯(cuò)誤,實(shí)際上,HLS 使用的是M3U8 文件,它是基于M3U擴(kuò)展的UTF-8文本文件。
在本篇文章中,我們將深入了解實(shí)現(xiàn)HLS視頻流的程序和工具。如果你對(duì)這一領(lǐng)域不太了解,可以先閱讀什么是視頻點(diǎn)播(VOD)?和理解ABR及其工作原理這兩篇文章。
?HLS的歷史
2009年,Apple在推出iPhone 3時(shí),同時(shí)推出了HLS。目的是提升iPhone用戶的媒體傳輸體驗(yàn),并且使用戶不再遇到帶寬波動(dòng)和傳輸受到干擾等問(wèn)題。從那時(shí)起,Apple便一直定期改進(jìn)HLS,使它成為可靠、被廣泛支持的視頻傳輸協(xié)議。
Apple的網(wǎng)站上有大量相關(guān)文檔,包括創(chuàng)作指南、HLS簡(jiǎn)介、HTTP實(shí)時(shí)流媒體等。你也可以參考相關(guān)規(guī)范,查看HLS的更多細(xì)節(jié)并對(duì)它有更多了解(其中有對(duì)各種標(biāo)簽的清晰解釋,以及ABR視頻流的詳盡介紹)。
?HLS的架構(gòu)
HLS并不需要高級(jí)的硬件來(lái)傳輸視頻,它是一個(gè)簡(jiǎn)單高效的協(xié)議。通過(guò)HLS,你可以使用常規(guī)的Web服務(wù)器存儲(chǔ)和分發(fā)內(nèi)容。但是它需要將數(shù)據(jù)存儲(chǔ)在適當(dāng)?shù)母袷街?#xff0c;且客戶端軟件能夠獲取并處理HLS視頻內(nèi)容。讓我們一起來(lái)看看HLS視頻傳輸服務(wù)的架構(gòu)是什么樣子。?
HLS架構(gòu) (圖片來(lái)自Apple)
編碼器:該編碼器可以生成H.264/AVC或者HEVC內(nèi)容,并遵守Apple創(chuàng)作規(guī)范中指定的標(biāo)準(zhǔn)。這些指南非常全面且具體。比如,它們?yōu)槊總€(gè)所支持的編解碼器指定容器格式。對(duì)于H.264來(lái)說(shuō),你必須使用fMP4或者TS(Transport Stream)。當(dāng)你在創(chuàng)建自己的HLS流媒體服務(wù)器時(shí),請(qǐng)務(wù)必閱讀指南內(nèi)容。
打包器(Packager):打包器獲取視頻后,將其切割成短的視頻切片(如10秒長(zhǎng))。比如,一個(gè)小時(shí)的電影會(huì)被切割成360個(gè)10秒長(zhǎng)的視頻切片,然后創(chuàng)建一個(gè)被稱為播放列表的文件,其中包含視頻名字、位置以及切片播放序列(和描述編解碼器、分辨率和碼率等的元數(shù)據(jù)一起)。創(chuàng)建這些視頻切片的過(guò)程被稱為視頻分片,或者更為人所熟知的打包。
Web服務(wù)器:是指被請(qǐng)求時(shí)任何能夠提供文件的Web服務(wù)器。當(dāng)客戶端發(fā)起請(qǐng)求時(shí),HLS服務(wù)器需要提供的文件是播放列表(m3u8文件),以及實(shí)際的A/V內(nèi)容(TS切片或者 fMP4)。
播放器/客戶端:任何理解HLS協(xié)議和能夠播放HLS流媒體(音頻和視頻)的播放器。播放從下載播放列表開(kāi)始,然后使用播放列表連續(xù)下載視頻切片,再渲染到屏幕。
?HLS播放列表示例
HLS播放列表有兩種類型:主清單(master manifest)和子清單(child / media manifest)。讓我們通過(guò)一個(gè)例子來(lái)理解它們是如何聯(lián)系起來(lái)的。假設(shè)你已將一部電影以3個(gè)不同的分辨率進(jìn)行編碼:1080p、720p和480(也指表征,rendition)。在使用HLS協(xié)議封裝后,你會(huì)得到1個(gè)主清單和3個(gè)子清單。
審校者注:最新的HLS RFC https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-10 已經(jīng)使用Multivariant Playlist 和 Media Playlist,原因是master/slave 被認(rèn)為有負(fù)面的文化影響。2020年夏天,計(jì)算機(jī)行業(yè)對(duì)master/slave 這兩個(gè)詞的使用引起了人們的注意,在大量抗議活動(dòng)和日益加劇的社會(huì)動(dòng)蕩中,這兩個(gè)詞被認(rèn)為是不合時(shí)宜且過(guò)時(shí)的,這最終導(dǎo)致了這兩個(gè)詞出現(xiàn)各種中性的替代詞。
主清單將描述視頻不同部分的表征及其規(guī)范(包括音頻和視頻編解碼器、語(yǔ)言和碼率)。子清單將列出各個(gè)表征的所有視頻切片(位置、名字和序列)。所以在這種情況下,你將得到3個(gè)子清單——分別是1080p、720p和480p。
下面是一個(gè)主清單示例,給出了構(gòu)成編碼和視頻流階梯(streaming ladder)的三種不同的表征信息。
#EXTM3U #EXT-X-MEDIA:URI="subtitle/lang_en/subtitle_index.m3u8",TYPE=SUBTITLES,GROUP-ID="subtitles",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES #EXT-X-STREAM-INF:BANDWIDTH=893752,AVERAGE-BANDWIDTH=560289,RESOLUTION=854x480,CODECS="avc1.4D401F,mp4a.40.2",SUBTITLES="subtitles" media-4/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1494976,AVERAGE-BANDWIDTH=891779,RESOLUTION=1280x720,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles" media-5/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3262928,AVERAGE-BANDWIDTH=1894009,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles" media-6/index.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=161304,RESOLUTION=854x480,CODECS="avc1.4D401F",URI="media-4/iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=241392,RESOLUTION=1280x720,CODECS="avc1.640028",URI="media-5/iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=532416,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="media-6/iframes.m3u8"下面給出了用于主清單的標(biāo)簽解釋:
EXT-X-STREAM-INF: 表示可用于電影播放的替代表征(alternative rendition)。
EXT-X-I-FRAME-STREAM-INF: 表示僅I幀表征,用于快速搜索/快進(jìn)快退模式,并在搜索時(shí)顯示縮略圖(至少包括流行用例中的兩個(gè))。
下面是子清單的一小段,屬于主清單所指向的表征之一。
#EXTM3U #EXT-X-VERSION:4 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-TARGETDURATION:4 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:4.000000, segment-0.ts #EXTINF:4.000000, segment-1.ts #EXTINF:4.000000, segment-2.ts #EXTINF:4.000000, segment-3.ts #EXTINF:4.000000, segment-4.tsHLS標(biāo)簽解釋
下面是一些在m3u8文件中常見(jiàn)標(biāo)簽的解釋:
EXTM3U: 表示該文件是一個(gè)擴(kuò)展的m3u文件。每個(gè)HLS播放列表必須以此標(biāo)簽開(kāi)始。
EXT-X-PLAYLIST-TYPE: 該標(biāo)簽取兩個(gè)值(VOD或EVENT)中的任意一個(gè)。如果是VOD播放列表,那么服務(wù)器自始至終不能改變這個(gè)列表。如果是EVENT,服務(wù)器也不能改變或者刪除該列表中已有內(nèi)容,但是可以在后面追加內(nèi)容。
EXT-X-INDEPENDENT-SEGMENTS:該標(biāo)簽表示每個(gè)視頻切片中的每一個(gè)媒體示例無(wú)需其他切片的信息就可以被解碼。并適用于播放列表中的所有切片。
EXT-X-TARGETDURATION: 指定媒體文件的最長(zhǎng)持續(xù)時(shí)間(以秒為單位)。
EXTINF:該標(biāo)簽指定媒體切片的持續(xù)時(shí)長(zhǎng)。后面應(yīng)該接續(xù)相關(guān)媒體切片的URI(必須如此)。你應(yīng)該確保EXTINF的值小于或者等于它所指的媒體文件的實(shí)際時(shí)長(zhǎng)。
? HLS的最小切片時(shí)長(zhǎng)是多少?
早些時(shí)候,Apple會(huì)推薦使用10秒切片時(shí)長(zhǎng)(EXTINF)值來(lái)打包視頻,但現(xiàn)在已經(jīng)越來(lái)越少見(jiàn)。內(nèi)容提供商越來(lái)越多地將切片時(shí)長(zhǎng)減少到4秒和6秒,主要原因如下所示:
減少首屏延遲、加入時(shí)間、延遲:Apple在播放器端要求,播放開(kāi)始前,必須緩沖3個(gè)視頻切片。這么做又意味著什么呢?如果你以5 mbps的速度編碼,那么每秒視頻的“花費(fèi)”5 Mbit。如果你已經(jīng)打包的切片時(shí)長(zhǎng)是10秒的視頻,然后需要緩沖3個(gè)切片,這樣即使在視頻還沒(méi)開(kāi)始播放的情況下,你就需要去下載150 Mbit(5 mbps * 10 seconds * 3個(gè)視頻切片)或者18.75MB的視頻。
減少重新緩沖的影響:如果下載一個(gè)片段需要10秒,那么在這10秒內(nèi),網(wǎng)絡(luò)條件可能發(fā)生很多變化。網(wǎng)絡(luò)速度可能下降,這將導(dǎo)致播放器的緩沖區(qū)在下載視頻時(shí)被耗盡,造成緩沖問(wèn)題。使用較短的HLS片段在這種情況下更有意義,因?yàn)榭梢栽诟痰臅r(shí)間內(nèi)獲得得分片,讓播放器有機(jī)會(huì)對(duì)網(wǎng)絡(luò)條件做出更好的反應(yīng)。
? 如何將TS視頻打包進(jìn)HLS格式?
商業(yè)打包器:在開(kāi)源和商業(yè)領(lǐng)域中,HLS受到了廣泛的打包支持。USP(Unified Streaming)和Wowza是我馬上想到的支持HLS的兩家公司,他們支持開(kāi)箱即用的HLS的打包。
在開(kāi)源方面,你可以使用Shaka packager和FFmpeg來(lái)將視頻打包成HLS格式。
? HLS的播放支持
播放器支持:作為廣為流行的格式,HLS被大部分頭部播放器公司和瀏覽器默認(rèn)支持。我能想到的支持HLS的播放器公司包括CastLabs、Bitmovin、THEOPlayer、NexPlayer、Kaltura和JWPlayer等。支持HLS的開(kāi)源播放器包括HLS.js和帶有HLS.js插件的VideoJS。
以上提到的公司也為iOS/tvOS、Android等提供支持HLS播放的App。谷歌的Exoplayer也可以原生支持HLS播放。
瀏覽器支持:HLS播放在Safari中也獲得了原生支持(這意味著你可以將HLS播放列表放到瀏覽器中,按下Enter鍵后,就可以直接播放視頻,而不需要外部播放器)。但通常情況下,公司使用開(kāi)源或者商業(yè)播放器(上文列出的那些)來(lái)播放HLS視頻。
? 測(cè)試你的HLS播放列表?
要測(cè)試你的視頻流,你可以使用參考 HLS.js播放器(https://hls-js.netlify.com/demo/)。你可以粘貼自己的URL上去,并檢查是否符合參考的 HLS 播放器。確保你的視頻流來(lái)自Https 鏈接,否則播放器會(huì)崩掉。或者,你可以關(guān)閉安全檢測(cè)或使用 CORS 插件強(qiáng)制播放。下面是所呈現(xiàn)的頁(yè)面:
你還可以使用Demo頁(yè)底部的工具來(lái)分析視頻流性能。
? 小? ?結(jié)
Hi,伙計(jì)們,今天就告一段落了。希望你們能夠理解HLS協(xié)議的工作原理以及使用HLS傳輸視頻時(shí)都需要什么。在后續(xù)的文章中,我會(huì)告訴你如何使用FFmpeg創(chuàng)建HLS視頻流,并將其傳輸?shù)饺澜?#xff01;
致謝
本文已獲得作者Krishna Rao Vijayanagar授權(quán)翻譯和發(fā)布,特此感謝。
原文鏈接:
https://ottverse.com/hls-http-live-streaming-how-does-it-work/
掃描圖中二維碼或點(diǎn)擊閱讀原文
了解大會(huì)更多信息
喜歡我們的內(nèi)容就點(diǎn)個(gè)“在看”吧!
總結(jié)
以上是生活随笔為你收集整理的什么是HLS(HTTP Live Streaming)?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 短视频内容理解与生成技术在美团的创新实践
- 下一篇: MPEG-LA发布VVC专利池