流媒體開發之--HLS--M3U8解析(2): HLS草案

https://www.cnblogs.com/shakin/p/3870442.html

目錄
1 簡介 2
2 概述 2
3 播放列表文件 3
3.1 介紹 3
3.2新標籤 4
3.2.1 EXT-X-TARGETDURATION 4
3.2.2 EXT-X-MEDIA-SEQUENCE 4
3.2.3 EXT-X-KEY 4
3.2.4 EXT-X-PROGRAM-DATE-TIME 5
3.2.5 EXT-X-ALLOW-CATCH 5
3.2.6 EXT-X-ENDLIST 5
3.2.7 EXT-X-STREAM-INF 5
3.2.8 EXT-X-DISCONTINUITY 6
3.2.9 EXT-X-VERSION 6
4 多媒體文件 7
5 密鑰文件 7
5.1 介紹 7
5.2  IV FOR AES-128 7
6 客戶端/服務器行爲 8
6.1 介紹 8
6.2 服務器進程 8
6.2.1介紹 8
6.2.2 滑動窗口播放列表 9
6.2.3 加密媒體文件 9
6.2.4 提供變種數據流 10
6.3 客戶端進程 10
6.2.1 介紹 10
6.2.2 加載播放列表文件 11
6.2.3播放播放列表文件 11
6.2.4重新載入播放列表文件 11
6.2.5 確定下一個要加載的文件 12
6.2.6 解密經加密的媒體文件 12
7 協議版本的兼容性 12
8 例子 12
8.1 簡單的播放列表文件 12
8.2 滑動窗口播放列表,使用https 13
8.3 加密的媒體文件與播放列表文件 13
8.4 變種的播放列表文件 13


 

 

1簡介

本文檔介紹了通過HTTP傳輸極大的多媒體數據流的協議[RFC2616]。該協議支持媒體數據的加密,並提供流的備用版本(如比特率)。媒體數據可以在創建後被很快地傳輸,允許它在近實時被接收。

在第11章中列出了,如HTTP的,描述相關標準的外部引用。


 

2概述

多媒體演示文稿是由播放列表文件中的URI指定的,播放列表是一個由uri和信息標籤組成的有序列表。每一個URI都關聯了一個媒體文件,該媒體文件是一個連續數據流的一個分片。
爲了播放數據流,客戶端首先獲取播放列表文件,然後獲取並播放列表中的每一個媒體文件。正如本文檔所描述的那樣,它通過重載播放列表文件來發現其他新增的分片。
文檔中的關鍵詞“必須”“不準”,“需要”“應該”“不應該”“推薦”“可以”“可選”等見RFC2119。

 

3播放列表文件

3.1介紹

播放列表必須是擴展的M3U文件,該文檔通過定義新的標籤擴展了m3u文件的格式。M3U播放列表是一個文本文件,它包含了各自獨立的行,行以一個LF字符或者LF字符緊跟一個CR字符來結束。行可以是一個URI,空行,或者以字符#開頭。空行將會被忽略。空格只能作爲一行中不同元素間的分隔。

一個URI 表示一個媒體文件或是變種播放列表文件(見3.2.7)

    URI可以是相對的,一個相對的URI必須被包含該URI的播放列表文件中的URI所解析。

以註釋字符#開頭的行可能是註釋或者標籤,標籤以#EXT開頭,其他所有行都應該被忽略。播放列表文件的持續時間是他所指向的媒體文件的時長的總和。

以.M3U8作爲文件名後綴或者HTTPContent-Type(RFC2616)爲“Application/vnd.apple.mpegurl”的M3U播放列表文件使用UTF-8(RFC3629)編碼。以.M3U作爲文件名後綴或者HTTPContent-Type爲“audio/mpegurl”的M3U播放列表文件使用US-ASCII編碼。

播放列表文件名必須以.M3U8爲後綴、HTTPContent-Type爲“Application/vnd.apple.mpegurl”(如果使用http傳輸)或者以.M3U爲後綴、HTTPContent-Type爲“audio/mpegurl”。

擴展的M3U文件格式定義了兩種標籤:EXTM3U和EXTINF。區分擴展的M3U文件與普通M3U文件的關鍵在於前者的首行爲#EXTM3U。

EXTINF是一個記錄標記,該標記描述了後邊URI所指定的媒體文件。每個媒體文件URI前邊必須有EXTINF標籤。格式如下:

#EXTINF: <DURATION>,<TITLE>

DURATION是一個整數,它指定了媒體文件以秒爲單位的持續時間,時間應四捨五入到最接近的整數。行內逗號後邊的剩餘部分是媒體文件的名字,該名字是媒體分片的人眼可讀的信息標題。

該文檔定義瞭如下的新標籤:EXT-X-TARGETDURATION,EXT-X-MEDIA-SEQUENCE,EXT-X-KEY,EXT-X-PROGRAM-DATE-TIME,EXT-X-ALLOW-CATCH,EXT-X-ENDLIST,EXT-X-STREAM-INF,EXT-X-DISCONTINUITY,EXT-X-VERSION


 

3.2新標籤

3.2.1      EXT-X-TARGETDURATION

該標籤指定了媒體文件持續時間的最大值,播放文件列表中的媒體文件在EXTINF標籤中定義的持續時間必須小於或者等於該標籤指定的持續時間。該標籤在播放列表文件中必須出現一次,其格式爲:
# EXT-X-TARGETDURATION:<s>
S是一個以秒爲單位的整數。

3.2.2      EXT-X-MEDIA-SEQUENCE

播放列表文件中每個媒體文件的URI都有一個唯一的序列號。URI的序列號等於它之前那個RUI的序列號加一。EXT-X-MEDIA-SEQUENCE指明瞭出現在播放列表文件中的第一個URI的序列號。其格式如下:
#EXT-X-MEDIA-SEQUENCE:<Number>
播放列表文件中的EXT-X-MEDIA-SEQUENCE標籤不能多於一個。如果播放列表文件中沒有EXT-X-MEDIA-SEQUENCE標籤,那麼將會把播放列表中第一個URI的序列號當成0。
媒體文件的序列號碼不是必須出現在它的URI中的。見6.3.2和6.3.5。

3.2.3      EXT-X-KEY

媒體文件可能是被加密的,EXT-X-KEY提供瞭解密媒體文件的必要信息,它的格式如下:
#EXT-X-KEY:METHOD=<method> [,URI = “<uri>”] [,IV = <iv>]
Method屬性指定了加密方法,定義了兩種加密方法:NONE和AES-128。
加密方法NONE表示媒體文件不被加密,如果加密方法是NONE,那麼URI和IV屬性不允許存在。
加密方法AES-128表示媒體文件使用高級加密標準128位密鑰和PKCS7 padding加密。如果加密方法是AES-128,那麼對於URI屬性,如果存在,則指定獲取密鑰的方法;對於IV屬性,如果存在,則指定使用密鑰的初始化向量。
IV屬性出現在協議版本2中,新的EXT-X-KEY將會取代任何一個先前的EXT-X-KEY。
如果播放列表文件沒有包含EXT-X-KEY標籤,那麼媒體文件將不會被加密。
密鑰文件的格式見第五章,媒體文件加密信息見5.2、6.2.3、6.3.6。

3.2.4      EXT-X-PROGRAM-DATE-TIME

EXT-X-PROGRAM-DATE-TIME標籤將下一個媒體文件的開頭和絕對日期關聯起來。日期/時間的表示基於ISO/IEC,並且要指明時區。例如:
#EXT-X-PROGRAM-DATE-TIME:<YYYY–MM–DDThh:mm:ssZ>
詳見6.2.1和6.3.3

3.2.5      EXT-X-ALLOW-CATCH

EXT-X-ALLOW-CATCH標籤指定客戶端可以或者不準緩存下載的媒體文件用來重播。它可能會出現在播放列表文件的任何地方,但是不能出現兩次或以上。該標籤適用於播放列表中的所有分片。其格式如下:
#EXT-X-ALLOW-CACHE:<YES|NO>
詳見6.3.3

3.2.6      EXT-X-ENDLIST

    EXT-X-ENDLIST標籤標示沒有更多媒體文件將會加入到播放列表中,它可能會出現在播放列表文件的任何地方,但是不能出現兩次或以上。其格式如下:

#EXT-X-ENDLIST

3.2.7      EXT-X-STREAM-INF

     EXT-X-STREAM-INF標籤表示在播放列表中的下一個URI標識另一個播放列表文件。格式如下:

#EXT-X-STREAM-INF:[attribute=value][,attribute=value]* <URI>

在一個EXT-X-STREAM-INF標籤中attribute不能出現兩次或以上。其它屬性定義:
BANDWIDTH = <n>
n爲每秒比特數,它必須是每個媒體文件比特速率的上限,必須經過計算包含那些在播放列表中出現的或者將要出現的容器開銷。
PROGRAM-ID=<i>
i是一個數字,在播放列表文件的範圍內唯一的標識了一個特定的演示文稿。
    一個播放列表文件可能包含多個具有相同PROGRAM-ID 的EXT-X-STREAM-INF標籤來標識某個演示文稿的不同編碼。這些變種的的播放列表可能包含額外的EXT-X-STREAM-INF標籤。

 
CODECS="[format][,format]*"

 
每一種格式都指定了存在於媒體文件中的媒體類型。合法的格式標示符都是那些在ISO文件格式名稱空間被RFC4281定義的格式。
RESOLUTION=<N>x<M>

 
N是流中視頻水平編碼分辨率的近似,以像素數表示,M是編碼垂直分辨率的近似。

3.2.8      EXT-X-DISCONTINUITY

     EXT-X-DISCONTINUITY標籤表示該標籤後邊的媒體文件和之前的媒體文件之間的編碼間斷。特性可能改變的一組是:
file format
number and type of tracks
encoding parameters
encoding sequence
詳見第四章,6.2.1、6.3.3。

 

 

3.2.9      EXT-X-VERSION

EXT-X-VERSION標籤指出了播放列表版本的適應性。播放列表文件、其關聯的媒體和服務器必須遵守最新版本的所有規定。

 

 

4多媒體文件

每一個媒體文件資源定位符都必須標識一個媒體文件,該文件是整體數據的一個分片。每個媒體文件必須按照MPEG-2的傳輸流和MPEG-2音頻流的格式。[ISO13818]
傳輸流文件必須包含一個MPEG-2節目。在每個文件的開始應該有一個節目關聯表和一個節目映射表。包含視頻的文件應該有至少一個密鑰幀和足夠的信息來完全初始化一個視頻解碼器。
播放列表中的媒體文件必須是編碼流中媒體文件的末尾與先前的序列號的延續,除非它是播放列表中出現的第一個媒體文件,或者它前邊有EXT-X-DISCONTINUITY標籤。
客戶端應該準備好處理一個特定類型(音頻或視頻等)的多個軌道。一個沒有優先級的客戶端應該選擇它能播放的具有最小數字編號的音軌。
客戶端應該忽略那些傳輸流的內部不能識別的流。
媒體文件內樣本流和相應的多媒體流的編碼參數應保持一致。然而客戶端應該解決編碼的變化問題,例如縮放視頻內容以適應分辨率改變。

5密鑰文件

5.1介紹

    URI屬性中EXT-X-KEY標籤標識一個密鑰文件。密鑰文件包含解密播放列表中媒體文件的密鑰。AES-128加密算法使用16字節的密鑰。密鑰文件的格式爲16字節的二進制數數組。

5.2  IV FOR AES-128

128位AES在加密和解密的時候需要提供一個相同的16字節的初始化向量(IV),變換IV可以提高密鑰的健壯性。
如果EXT-X-KEY標籤有IV屬性,在使用密鑰加密或者解密的時候必須使用此屬性值作爲IV。這個值必須被解釋爲128位的16進制數,而且必須有前綴0x。
    如果EXT-X-KEY標籤沒有IV屬性,在加密或者解密媒體文件的時候必須使用序列號作爲IV值。大端二進制表示的序列號應該放置在16字節的緩衝區中且左邊補0。

6客戶端/服務器行爲

6.1介紹

本章介紹服務器怎樣產生播放列表和媒體文件以及客戶端怎樣下載並播放。

6.2服務器進程

6.2.1介紹

MPEG-2數據流的產生超過了本文檔的範圍,本文檔僅僅假設有一個數據流連續的源。
服務器必須將數據流分割成持續時間大致相等的媒體文件,服務器應該嘗試點分割流來支持對個別媒體文件的有效解碼,例如包和關鍵幀的邊界。
服務器必須爲媒體文件創建URI,允許它的客戶端能夠獲取到文件。
服務器必須創建播放列表。播放列表必須符合第三章描述的格式。服務器要提供的媒體文件的URI必須按順序出現在播放列表中。如果URI出現在了播放列表中,那麼這個媒體文件對於客戶端必須是可用的。
播放列表文件必須包含一個EXT-X-TARGRTDURATION標籤,它必須指明添加到播放列表中媒體文件的最大EXTINF值。整個演示文稿期間,這個值必須保持不變。典型持續時間爲10s。
播放列表文件應該包含EXT-X-VERSION標籤來說明流對於版本的兼容性。它的值應該是服務器、播放列表文件和其所關聯的媒體文件都能執行的最低協議版本。
如果播放列表文件通過HTTP傳輸,那麼服務器應該支持客戶端請求使用gzip內容編碼。
從客戶端的角度來看,播放列表文件的變更必須是自動的。
服務器不可以改變EXT-X-ALLOW-CATCH的值。
播放列表中每個媒體文件的URI必須以EXTINF作爲前綴來說明媒體文件的持續時間。
服務器可以將媒體文件和絕對的日期和時間關聯起來,只要在它的URI前綴上一個EXT-X-PROGRAM-DATE-TIME標籤。日期和時間的值提供了一個媒體時間表到掛鐘時間的信息映射,該掛鐘時間可以作爲搜索、顯示或其他目的的基準。
如果服務器提供了這個映射,那麼它應該在每個EXT-X-DISCONTINUITY標籤的後邊加一個EXT-X-PROGRAM-DATE-TIME標籤。
如果播放列表文件包含演示文稿的最後一個分片,那麼應該加一個EXT-X-ENDLIST標籤。
如果播放列表文件沒有包含EXT-X-ENDLIST標籤,那麼服務器應該使一個新版本的播放列表文件可用,並至少包含一個媒體文件的URI。新的播放列表文件必須與前一個播放列表文件在相對的時間內有效:從上一個播放列表文件開始有效的時間算起,不早於0.5倍持續時間,不晚於1.5倍持續時間。//不太清楚可用是什麼意思?
如果服務器期望移除演示文稿,它必須使播放列表文件對於客戶端不可用,在播放列表被清除時,它應該確保播放列表文件中的所有媒體文件對於客戶端來說至少在一個播放列表文件持續時間內是可用的。

6.2.2滑動窗口播放列表

服務器可以限制最近一段時間添加到播放列表文件中的媒體文件的可用性,爲了達到這個目的,播放列表文件必須包含準確的EXT-X-MEDIA-SEQUENCE標籤。標籤的值是按照從播放列表中移除的媒體文件的URI遞增的。
媒體文件的URI必須按照其加入的順序移除。當服務器從播放列表移除URI時,媒體文件在一段時間內必須保持可用,該時間等於媒體文件的時間加上包含該媒體文件的最長播放列表文件的時間。
當媒體文件通過http傳輸給客戶端後,如果服務器打算移除該文件,那麼它應該確保http響應頭包含反應生存時間的過期頭。
那些不包含EXT-X-ENDLIST標籤的播放列表文件的持續時間必須至少三倍於targrtdutration。//爲什麼是三倍?

6.2.3加密媒體文件

如果媒體文件需要被加密,那麼服務器必須定義一個URI來允許被授權的客戶端獲取包含解密密鑰的密鑰文件。密鑰文件必須符合第五章描述的格式。服務器可以在密鑰響應中設置超時頭來表名密鑰可以被緩存。
如果採用AES-128加密算法,那麼AES-128 CBC加密模式應該適應於每一個媒體文件。整個文件必須是加密的。密碼塊的連接不能用於跨媒體文件。用於解密的初始化向量必須是媒體文件的序列號或者EXT-X-KEY標籤的IV屬性的值。服務器必須使用這種加密算法和其他由緊隨在播放列表文件中URI後邊的EXT-X-KEY標籤所指定的屬性來加密播放列表文件中的每一個媒體文件。EXT-X-KEY標籤中方法爲none或者沒有EXT-X-KEY標籤的媒體文件不能被加密。
    如果播放列表文件包含了一個經過加密的媒體文件的URI,那麼服務器不可以將EXT-X-KEY標籤從播放列表文件中移除。

6.2.4提供變種數據流

服務器可以提供多個播放列表文件來支持對同一個演示文稿的不同編碼。提供變種播放列表文件列出每一個變種流,從而使得客戶端可以在不同編碼之間動態切換。
變種播放列表文件必須爲每一個變種流包含一個EXT-X-STREAM-INF標籤。同一演示文稿的每個EXT-X-STREAM-INF都必須有相同的programid。每個演示文稿的programid在變種播放列表內必須是唯一的。
如果EXT-X-STREAM-INF標籤包含CODECS屬性,則屬性值必須包含RFC4281定義的所有格式,

 
服務器在生成變種流的時候必須遵守以下規則:
1)每一個變種流必須呈現相同的內容,包括流的間斷性。
2)每個變種播放列表文件必須有相同的target duration。
3)只在個別變種播放列表文件中出現的內容必須放在列表文件的頭或者尾,且不能超過target duration。
4)變種流內匹配內容,必須有匹配時間戳。這可以使客戶端同步流。
5)基本音頻流文件必須在文件中第一個樣本的採樣信號的時間戳前預先準備一個ID3 PRIV標籤,標籤的所有者標示符爲“com.apple.streaming.transportStreamTimestamp”。二進制數據必須是33位的基本時間戳,用8字節的數字表示。

 
另外,所有的變種流都應該包含相同編碼的音頻二進制流。這使得客戶端在不同的流之間切換時沒有毛刺聲音。//什麼事毛刺聲音?

6.3客戶端進程

6.3.1介紹

客戶端怎樣獲取播放列表中的URI不在本文檔的範圍之內,我們假設已經獲取到了URI。

6.3.2加載播放列表文件

每一次加載或者重載播放列表文件時:
客戶端必須保證播放列表文件以EXTM3U標籤開頭,並且如果協議版本號存在,客戶端必須支持該版本。否則,客戶端不可以試圖使用該列表文件。
客戶端可以忽略它不能識別的標籤和屬性。
如果播放列表文件包含了EXT-X-MEDIA-SEQUENCE標籤,那麼客戶端會假設在播放列表被加載的時間內以及播放列表的持續時間內媒體文件將變得不可用。播放列表的持續時間等於其中包含的媒體文件時長的總和。//爲啥假設不可用?

6.3.3播放播放列表文件

當開始播放的時候,客戶端首先從播放列表中選擇要播放的媒體文件。如果不存在EXT-X-ENDLIST標籤,並且客戶端想正常播放媒體(按順序以標準速率播放),那麼客戶端就不應該從播放列表文件尾部選擇少於三個target duration的媒體文件。
爲了達到正常播放的目的,媒體文件必須按照他們在播放列表中的順序播放。客戶端還可以用其他任何方式播放,比如順序播放,隨機播放,特效播放等。
對於存在EXT-X-DISCONTINUITY標籤的媒體文件,在播放之前客戶端必須準備好重置分析和解碼器。
爲了不間斷播放,應該提前載入媒體文件,以補償延時和吞吐量的變化。
如果播放列表文件包含了EXT-X-ALLOW-CATCH標籤,並且它的值爲NO,那麼客戶端在播放以後不可以緩存媒體文件。否則允許緩存用來以後重播。
客戶端可以使用EXT-X-PROGRAM-DATE-TIME標籤來爲用戶顯示節目的起始時間。如果這個值包含了時區信息,那麼客戶端應該考慮到這點;如果不包含,那麼客戶端不可以推測時區。
客戶端不能依靠EXT-X-ALLOW-CATCH標籤值的正確性和一致性。

6.3.4重新載入播放列表文件

客戶端必須階段性的重新載入播放列表文件,除非文件包含了EXT-X-ENDLIST標籤。然而也不能過於頻繁的載入。
當客戶端第一次載入播放列表文件或者已經載入但是發現文件與上次載入的時候有了變化,客戶端都必須等待一段時間在可以再次載入。這段時間被稱爲原始最小重載延遲,它是從客戶端開始載入一個播放列表文件開始計算的。
原始最小重載延遲是播放列表文件中最後一個媒體文件的持續時間。媒體文件的持續時間由EXTINF標籤來指定。
如果客戶端重載了一個播放列表文件,但是發現文件並沒有變化,那麼它在重試之前必須等一段時間。最小延遲是target duration的倍數。第一次是0.5倍,第二次1.5倍,3倍。。。

6.3.5確定下一個要加載的文件

當播放列表文件被載入或者重載以後,客戶端必須檢查播放列表來確定要載入的媒體文件。要載入的第一個文件必須是客戶端要播放的第一個文件,見6.3.3。
    如果要播放的文件已經被載入,並且播放列表文件不包含EXT-X-MEDIA-SEQUENCE標籤,那麼客戶端必須確認播放列表文件包含了最後一個被載入的媒體文件的URI,如果不包含,則暫停播放。要載入的下一個媒體文件必須是上一次載入的媒體文件URI之後的第一個媒體文件的URI。
    如果要播放的文件已經被載入,並且播放列表文件包含EXT-X-MEDIA-SEQUENCE標籤,那麼要載入的下一個媒體文件就是比上一次載入的文件的序列號大的媒體文件中的序列號最小者。

6.3.6解密經加密的媒體文件

如果播放列表文件包含了一個指定密鑰文件URI的EXT-X-KEY標籤,客戶端必須獲取密鑰文件,並使用其中的密鑰來解密KEY標籤之後的所有媒體文件,直到遇到另一個EXT-X-KEY標籤爲止。

7協議版本的兼容性

客戶端和服務器必須使用版本2以及更高版本。

 

 

8例子

8.1簡單的播放列表文件

#EXTM3U

#EXT-X-TARGETDURATION:5220

#EXTINF:5220,

http://media.example.com/entire.ts

#EXT-X-ENDLIST

 

8.2滑動窗口播放列表,使用https

#EXTM3U

#EXT-X-TARGETDURATION:8

#EXT-X-MEDIA-SEQUENCE:2680

#EXTINF:8,

https://priv.example.com/fileSequence2680.ts

#EXTINF:8,

https://priv.example.com/fileSequence2681.ts

#EXTINF:8,

https://priv.example.com/fileSequence2682.ts

 

8.3加密的媒體文件與播放列表文件

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:7794

#EXT-X-TARGETDURATION:15

#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"

#EXTINF:15,

http://media.example.com/fileSequence52-1.ts

#EXTINF:15,

http://media.example.com/fileSequence52-2.ts

#EXTINF:15,

http://media.example.com/fileSequence52-3.ts

#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"

#EXTINF:15,

http://media.example.com/fileSequence53-1.ts

變種的播放列表文件

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000

http://example.com/low.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000

http://example.com/mid.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000

http://example.com/hi.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"

http://example.com/audio-only.m3u8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章