MP4大文件虛擬HLS分片技術,避免服務器大量文件碎片


MP4大文件虛擬HLS分片技術,避免點播服務器的文件碎片

本文主要介紹了通過虛擬分片技術,把MP4文件,映射為HLS協議中的一個個小的TS分片文件,實現了在不實際切分MP4文件的情況下,通過HLS協議播放MP4文件,從而避免了對MP4進行點播,尤其是大的MP4文件,需要長時間緩沖MP4頭部數據的問題,同時可以解決對MP4文件進行切分,會在服務器制造出大量的文件碎片的不利情況。而且本技術,幾乎可以不需要對流媒體服務器(HTTP服務)做修改。

背景

  • HLS全稱Http Live Streaming是當前廣泛使用的直播和點播技術,最早是蘋果公司實現的,跟MPEG-DASH一樣是基於HTTP協議傳輸,可嵌入HTML5標簽中播放,現在已經被移動平台的瀏覽器廣泛支持,在pc上也可以通過js和MSE(Media Source Extensions)來實現。HLS的特點是分片文件小,加載很快,使用TS容器,格式簡單,通過HTTP傳輸,基本不需要考慮防火牆問題,所以很快就被推廣開了。
  • MP4大家就更熟悉了,就是由一個個box組成的媒體文件容器,就不多說了。需要指出的一點是,MP4基本上是可以分為普通MP4和FragmentMP4來,后者主要特征包含許多moof box把mp4文件分割為許多可以單獨解碼的單元,更適合與流媒體場景下的數據傳輸,我最早見到它的應用,是在微軟早年推出的“SilverLight + Smooth Streaming”技術中(微軟已棄坑?)。FMP4的應用也在逐漸發展中,不過比TS有一點不太好的地方是它格式有點復雜了,關於FMP4相關的技術我之后寫文章介紹。

對於大家經常見到和使用到的普通MP4來說,作為電影、電視文件的存儲容器,是很好的,不過對於流媒體點播來說,最大的缺點就是它的媒體信息和關鍵幀索引都集中存放在moov box中,而導致越大的文件,moov box越大,對播放器來說,獲取不到moov box,根本無從解碼,所以就導致MP4文件點播,需要緩沖很久,加載頭部數據。當然常見解決方案,就是文件切分,把大的MP4文件,切為小一點的MP4文件,這樣每塊的MP4的加載就會快很多,這個也是很多視頻網站的解決方式,這樣的切分也還好,分片數量不算很多。然而到了HLS時代,為了支持HLS協議,就需要把大的MP4文件,都轉換為了更小的HLS-TS分片文件,這就出現問題了,服務器太多碎片一樣的TS文件,難以管理,也影響性能。怎么解決呢?那就是虛擬HLS分片技術。

技術分析

1. 虛擬分片邏輯

一個常見的mp4文件結構如下圖所見。其中最重要的即是MoovBox,記錄了后續所有音頻幀和視頻幀的解碼信息、時間戳、位置等非常關鍵的數據,圖里稱做索引數據,而在視頻幀中,關鍵幀是最重要的節點,播放器會在關鍵幀位置對整個圖像進行刷新,可以認為是圖像解碼的起點。

虛擬HLS分片,顧名思義,就是不實際切片,只記錄實際MP4文件和需要切分的TS分片直接的數據對應關系,然后在播放器實際請求播放的時候,通過對應關系,把相應的音頻視頻數據,在內存中拼裝為TS文件。比如,對上述MP4文件,請求02秒的數據,那么就需要通過對應記錄,找到02秒的數據,組合成MPEG-TS格式,生成HLS分片文件。當然,切分的過程需要注意,就是分片起點必須是視頻關鍵幀的節點,否則生成文件就無法正常解碼。

2. 設計方案

根據之前分析的描述分片邏輯,就可以根據moov box中羅列的音頻和視頻幀索引,把整個mp4文件,根據關鍵幀為界限,進行虛擬分片的划分,每個分段就對應一個ts文件,並把這種對應關系寫入到索引文件(我這里定義為xxx.index文件)。整個方案的示意圖如下,圖里描述的很清楚了

上圖中Sample1 Sample2 ... 指代的是音頻和視頻幀,這里沒有做區分,不影響理解。

簡單說明一下:

xxx.mp4是要點播的原始文件,xxx.m3u8是給HLS播放器使用的播放地址文件,里面羅列了所有的ts分片地址,(對m3u8和HLS更具體介紹可以看我另一片文章“HTTP Live Streaming直播(iOS直播)技術分析與實現”)。xxx.index是根據虛擬分片的情況,生成的描述文件,或者說索引文件,內部記錄每個TS分片(索引文件里被記錄為segment)在真實MP4文件中的分布地址。這樣,xxx.mp4,xxx.m3u8和xxx.index,共同組成了本方案的全部相關文件。實際應用過程中,客戶端或者服務器端根據m3u8文件和index文件的內容,很容易就計算出HLS播放器請求的TS分片所對應的實際數據位置,從而拼裝數據,實現HLS點播流。

3. 流程

下圖的流程展示了從HLS播放器請求m3u8地址開始,到HLS播放器獲取到第一個TS分片文件為止的邏輯過程。這里面除了服務器端和播放器端,還有一個我定義的“適配端”,這個適配端主要做的工作就是根據index文件和m3u8文件,計算出真實數據位置,然后向服務器發送Range請求,並將服務器返回的數據,組成TS分片文件,再回傳給HLS播放器。這個適配端是整個流程的關鍵之處。

適配端可以放在服務器上,也可以放在客戶端上。如果放在客戶端,那服務器端就幾乎不需要任何改動,就可以實現虛擬HLS分片技術。如果整合到服務器端,那客戶端也基本不需要什么改動。

實現

  1. 首先是對mp4文件進行處理,生成對應的index文件和m3u8文件

進行切片,並計算index文件中segment和ts對應關系的過程如下:

  1. 然后是編寫適配端,為請求的TS分片組合數據

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

haibindev.cnblogs.com,合作請聯系QQ。(轉載請注明作者和出處~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM