視頻文件M3U8和TS格式切片,討論一下?

寫這篇文章以前,被本身否定了三連,由於只是出於對.ts格式視頻文件的好奇才記錄下來的一些筆記,作了個簡單整理而已,既然最終決定了發出來,仍是想同各位大佬學習下更多關於視頻編碼解碼、流媒體、大文件上傳時斷點續傳的實現、以及如B站和直播行業實現視頻傳輸時所涉及的一些技術點等,歡迎各位大佬參與討論。瀏覽器

什麼是TS切片

先來簡要介紹一下什麼是MPEG2-TS吧,先獻上一段來自百度百科的科普。MPEG2格式你們都經過對DVD的接觸而多多少少了解了一些,DVD節目中的MPEG2格式,確切地說是MPEG2-PS,全稱是Program Stream,而TS的全稱則是Transport Stream。MPEG2-PS主要應用於存儲的具備固定時長的節目,如DVD電影,而MPEG-TS則主要應用於實時傳送的節目,好比實時廣播的電視節目。這兩種格式的主要區別是什麼呢?簡單地打個比喻說,你將DVD上的VOB文件的前面一截cut掉(或者乾脆就是數據損壞),那麼就會致使整個文件沒法解碼了,而電視節目是你任什麼時候候打開電視機都能解碼(收看)的,因此,MPEG2-TS格式的特色就是要求從視頻流的任一片斷開始都是能夠獨立解碼的。更多請參考百度百科性能優化

一些我的認知

大多數視頻網站都採用漸進式下載,這意味着視頻會下載到個人設備上。視頻通常採用流式傳輸,這意味着咱們不僅是下載了1個文件,而是下載了不少小包(本文指的是.ts傳輸流切片文件)。好比我最近在極客幫學習視頻課程時,看到他們對視頻進行了分流加載,並且仍是一個個的.ts格式傳輸流文件,給視頻文件進行加密的同時又是一種性能優化手段,打開瀏覽器的開發者工具就能夠清楚地看到它們在異步加載,此處先貼上2張截圖: 服務器

圖一就是一個幾十兆的視頻文件分流加載的效果,圖二能夠看到這些ts文件的http響應頭的content-type的值爲application/octet-stream,是個二進制傳輸的流文件格式,不妨再看看accept-ranges的值爲bytes。從中還能夠看到,他們採用的服務器是Tengine,經查閱資料可知,Tengine是由淘寶網發起的Web服務器項目,已經是個開源項目,此前對Tengine一無所知,還請自行查閱資料😂。網絡

補充Accept-Range

服務器使用 HTTP 響應頭 Accept-Range 標識自身支持範圍請求(partial requests)。字段的具體值用於定義範圍請求的單位。當瀏覽器發現 Accept-Range 頭時,能夠嘗試繼續中斷了的下載,而不是從新開始。Accept-Ranges的值能夠爲bytesnoneapp

  • bytes 範圍請求的單位是bytes(字節)。
  • none 其中none表示不支持任何範圍請求單位,因爲其等同於沒有返回此頭部,所以不多使用。不過一些瀏覽器,好比IE9,會依據該頭部去禁用或者移除下載管理器的暫停按鈕。

淺談m3u8文件格式

M3U8是Unicode版本的M3U,用UTF-8編碼。"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協議格式的基礎,這種協議格式能夠在 iPhone 和 Macbook 等設備播放。m3u8文件實際上是 HTTP Live Streaming(縮寫爲 HLS) 協議的部份內容,而 HLS 是一個由蘋果公司提出的基於 HTTP 的流媒體網絡傳輸協議。異步

HLS 的工做原理是把整個流分紅一個個小的基於 HTTP 的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端能夠選擇從許多不一樣的備用源中以不一樣的速率下載一樣的資源,容許流媒體會話適應不一樣的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的 extended M3U (m3u8) playlist文件,用於尋找可用的媒體流。 HLS 只請求基本的 HTTP 報文,與實時傳輸協議(RTP)不一樣,HLS 能夠穿過任何容許 HTTP 數據經過的防火牆或者代理服務器。它也很容易使用內容分發網絡CDN來傳輸媒體流。更詳細介紹請參考m3u8文件格式詳解工具

m3u8文件簡介

m3u8文件實質是一個播放列表(playlist),其多是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。但不管是哪一種播放列表,其內部文字使用的都是 utf-8 編碼。 當 m3u8 文件做爲媒體播放列表(Meida Playlist)時,其內部信息記錄的是一系列媒體片斷資源,順序播放該片斷資源,便可完整展現多媒體資源,由此可知,整個視頻的總時長就是各個.ts切片資源的時長之和。其格式以下圖所示:性能

繼續探究ts文件

既然.ts文件只是一種視頻切片文件,那麼它支持直接播放嗎?把它下載到本地後,果真能夠播放,真是漲姿式了~~可自行下載此ts文件連接試試,此截圖是極客幫最新推出的視頻課程《玩轉Webpack》其中一小節(這麼帥氣的大佬固然要曬下~😀):學習

請求m3u8播放列表的方法

  • 一是經過m3u8的URI進行請求,則該文件必須以.m3u8或.m3u結尾;
  • 二是經過 HTTP 進行請求,則請求頭 Content-Type 必須設置爲 "application/vnd.apple.mpegurl" 或者 "audio/mpegurl";

寫在最後

本文參考瞭如下文章,若是認爲本文還不錯,歡迎點贊+關注❤️;若是感受個人文章有問題,歡迎在評論區提出,我會第一時間修改……謝謝😊優化

相關文章
相關標籤/搜索