本文主要介紹了經過虛擬分片技術,把MP4文件,映射爲HLS協議中的一個個小的TS分片文件,實現了在不實際切分MP4文件的狀況下,經過HLS協議播放MP4文件,從而避免了對MP4進行點播,尤爲是大的MP4文件,須要長時間緩衝MP4頭部數據的問題,同時能夠解決對MP4文件進行切分,會在服務器製造出大量的文件碎片的不利狀況。並且本技術,幾乎能夠不須要對流媒體服務器(HTTP服務)作修改。html
對於你們常常見到和使用到的普通MP4來講,做爲電影、電視文件的存儲容器,是很好的,不過對於流媒體點播來講,最大的缺點就是它的媒體信息和關鍵幀索引都集中存放在moov box中,而致使越大的文件,moov box越大,對播放器來講,獲取不到moov box,根本無從解碼,因此就致使MP4文件點播,須要緩衝好久,加載頭部數據。固然常看法決方案,就是文件切分,把大的MP4文件,切爲小一點的MP4文件,這樣每塊的MP4的加載就會快不少,這個也是不少視頻網站的解決方式,這樣的切分也還好,分片數量不算不少。然而到了HLS時代,爲了支持HLS協議,就須要把大的MP4文件,都轉換爲了更小的HLS-TS分片文件,這就出現問題了,服務器太多碎片同樣的TS文件,難以管理,也影響性能。怎麼解決呢?那就是虛擬HLS分片技術。瀏覽器
一個常見的mp4文件結構以下圖所見。其中最重要的便是MoovBox,記錄了後續全部音頻幀和視頻幀的解碼信息、時間戳、位置等很是關鍵的數據,圖裏稱作索引數據,而在視頻幀中,關鍵幀是最重要的節點,播放器會在關鍵幀位置對整個圖像進行刷新,能夠認爲是圖像解碼的起點。服務器
虛擬HLS分片,顧名思義,就是不實際切片,只記錄實際MP4文件和須要切分的TS分片直接的數據對應關係,而後在播放器實際請求播放的時候,經過對應關係,把相應的音頻視頻數據,在內存中拼裝爲TS文件。好比,對上述MP4文件,請求0~2秒的數據,那麼就須要經過對應記錄,找到0~2秒的數據,組合成MPEG-TS格式,生成HLS分片文件。固然,切分的過程須要注意,就是分片起點必須是視頻關鍵幀的節點,不然生成文件就沒法正常解碼。性能
根據以前分析的描述分片邏輯,就能夠根據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點播流。htm
下圖的流程展現了從HLS播放器請求m3u8地址開始,到HLS播放器獲取到第一個TS分片文件爲止的邏輯過程。這裏面除了服務器端和播放器端,還有一個我定義的「適配端」,這個適配端主要作的工做就是根據index文件和m3u8文件,計算出真實數據位置,而後向服務器發送Range請求,並將服務器返回的數據,組成TS分片文件,再回傳給HLS播放器。這個適配端是整個流程的關鍵之處。blog
適配端能夠放在服務器上,也能夠放在客戶端上。若是放在客戶端,那服務器端就幾乎不須要任何改動,就能夠實現虛擬HLS分片技術。若是整合到服務器端,那客戶端也基本不須要什麼改動。索引
進行切片,並計算index文件中segment和ts對應關係的過程以下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
haibindev.cnblogs.com,合做請聯繫QQ。(轉載請註明做者和出處~)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++