目錄
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 變種的播放列表文件 13php
本文檔介紹了經過HTTP傳輸極大的多媒體數據流的協議[RFC2616]。該協議支持媒體數據的加密,並提供流的備用版本(如比特率)。媒體數據能夠在建立後被很快地傳輸,容許它在近實時被接收。算法
在第11章中列出了,如HTTP的,描述相關標準的外部引用。數組
多媒體演示文稿是由播放列表文件中的URI指定的,播放列表是一個由uri和信息標籤組成的有序列表。每個URI都關聯了一個媒體文件,該媒體文件是一個連續數據流的一個分片。
爲了播放數據流,客戶端首先獲取播放列表文件,而後獲取並播放列表中的每個媒體文件。正如本文檔所描述的那樣,它經過重載播放列表文件來發現其餘新增的分片。
文檔中的關鍵詞「必須」「不許」,「須要」「應該」「不該該」「推薦」「能夠」「可選」等見RFC2119。
播放列表必須是擴展的M3U文件,該文檔經過定義新的標籤擴展了m3u文件的格式。M3U播放列表是一個文本文件,它包含了各自獨立的行,行以一個LF字符或者LF字符緊跟一個CR字符來結束。行能夠是一個URI,空行,或者以字符#開頭。空行將會被忽略。空格只能做爲一行中不一樣元素間的分隔。緩存
一個URI 表示一個媒體文件或是變種播放列表文件(見3.2.7)服務器
URI能夠是相對的,一個相對的URI必須被包含該URI的播放列表文件中的URI所解析。app
以註釋字符#開頭的行多是註釋或者標籤,標籤以#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」。url
擴展的M3U文件格式定義了兩種標籤:EXTM3U和EXTINF。區分擴展的M3U文件與普通M3U文件的關鍵在於前者的首行爲#EXTM3U。spa
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
該標籤指定了媒體文件持續時間的最大值,播放文件列表中的媒體文件在EXTINF標籤中定義的持續時間必須小於或者等於該標籤指定的持續時間。該標籤在播放列表文件中必須出現一次,其格式爲:
# EXT-X-TARGETDURATION:<s>
S是一個以秒爲單位的整數。
播放列表文件中每一個媒體文件的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。
媒體文件多是被加密的,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.二、6.2.三、6.3.6。
EXT-X-PROGRAM-DATE-TIME標籤將下一個媒體文件的開頭和絕對日期關聯起來。日期/時間的表示基於ISO/IEC,而且要指明時區。例如:
#EXT-X-PROGRAM-DATE-TIME:<YYYY–MM–DDThh:mm:ssZ>
詳見6.2.1和6.3.3
EXT-X-ALLOW-CATCH標籤指定客戶端能夠或者不許緩存下載的媒體文件用來重播。它可能會出如今播放列表文件的任何地方,可是不能出現兩次或以上。該標籤適用於播放列表中的全部分片。其格式以下:
#EXT-X-ALLOW-CACHE:<YES|NO>
詳見6.3.3
EXT-X-ENDLIST標籤標示沒有更多媒體文件將會加入到播放列表中,它可能會出如今播放列表文件的任何地方,可是不能出現兩次或以上。其格式以下:
#EXT-X-ENDLIST
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是編碼垂直分辨率的近似。
EXT-X-DISCONTINUITY標籤表示該標籤後邊的媒體文件和以前的媒體文件之間的編碼間斷。特性可能改變的一組是:
file format
number and type of tracks
encoding parameters
encoding sequence
詳見第四章,6.2.一、6.3.3。
EXT-X-VERSION標籤指出了播放列表版本的適應性。播放列表文件、其關聯的媒體和服務器必須遵照最新版本的全部規定。
每個媒體文件資源定位符都必須標識一個媒體文件,該文件是總體數據的一個分片。每一個媒體文件必須按照MPEG-2的傳輸流和MPEG-2音頻流的格式。[ISO13818]
傳輸流文件必須包含一個MPEG-2節目。在每一個文件的開始應該有一個節目關聯表和一個節目映射表。包含視頻的文件應該有至少一個密鑰幀和足夠的信息來徹底初始化一個視頻解碼器。
播放列表中的媒體文件必須是編碼流中媒體文件的末尾與先前的序列號的延續,除非它是播放列表中出現的第一個媒體文件,或者它前邊有EXT-X-DISCONTINUITY標籤。
客戶端應該準備好處理一個特定類型(音頻或視頻等)的多個軌道。一個沒有優先級的客戶端應該選擇它能播放的具備最小數字編號的音軌。
客戶端應該忽略那些傳輸流的內部不能識別的流。
媒體文件內樣本流和相應的多媒體流的編碼參數應保持一致。然而客戶端應該解決編碼的變化問題,例如縮放視頻內容以適應分辨率改變。
URI屬性中EXT-X-KEY標籤標識一個密鑰文件。密鑰文件包含解密播放列表中媒體文件的密鑰。AES-128加密算法使用16字節的密鑰。密鑰文件的格式爲16字節的二進制數數組。
128位AES在加密和解密的時候須要提供一個相同的16字節的初始化向量(IV),變換IV能夠提升密鑰的健壯性。
若是EXT-X-KEY標籤有IV屬性,在使用密鑰加密或者解密的時候必須使用此屬性值做爲IV。這個值必須被解釋爲128位的16進制數,並且必須有前綴0x。
若是EXT-X-KEY標籤沒有IV屬性,在加密或者解密媒體文件的時候必須使用序列號做爲IV值。大端二進制表示的序列號應該放置在16字節的緩衝區中且左邊補0。
本章介紹服務器怎樣產生播放列表和媒體文件以及客戶端怎樣下載並播放。
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倍持續時間。//不太清楚可用是什麼意思?
若是服務器指望移除演示文稿,它必須使播放列表文件對於客戶端不可用,在播放列表被清除時,它應該確保播放列表文件中的全部媒體文件對於客戶端來講至少在一個播放列表文件持續時間內是可用的。
服務器能夠限制最近一段時間添加到播放列表文件中的媒體文件的可用性,爲了達到這個目的,播放列表文件必須包含準確的EXT-X-MEDIA-SEQUENCE標籤。標籤的值是按照從播放列表中移除的媒體文件的URI遞增的。
媒體文件的URI必須按照其加入的順序移除。當服務器從播放列表移除URI時,媒體文件在一段時間內必須保持可用,該時間等於媒體文件的時間加上包含該媒體文件的最長播放列表文件的時間。
當媒體文件經過http傳輸給客戶端後,若是服務器打算移除該文件,那麼它應該確保http響應頭包含反應生存時間的過時頭。
那些不包含EXT-X-ENDLIST標籤的播放列表文件的持續時間必須至少三倍於targrtdutration。//爲何是三倍?
若是媒體文件須要被加密,那麼服務器必須定義一個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標籤從播放列表文件中移除。
服務器能夠提供多個播放列表文件來支持對同一個演示文稿的不一樣編碼。提供變種播放列表文件列出每個變種流,從而使得客戶端能夠在不一樣編碼之間動態切換。
變種播放列表文件必須爲每個變種流包含一個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字節的數字表示。
另外,全部的變種流都應該包含相同編碼的音頻二進制流。這使得客戶端在不一樣的流之間切換時沒有毛刺聲音。//什麼事毛刺聲音?
客戶端怎樣獲取播放列表中的URI不在本文檔的範圍以內,咱們假設已經獲取到了URI。
每一次加載或者重載播放列表文件時:
客戶端必須保證播放列表文件以EXTM3U標籤開頭,而且若是協議版本號存在,客戶端必須支持該版本。不然,客戶端不能夠試圖使用該列表文件。
客戶端能夠忽略它不能識別的標籤和屬性。
若是播放列表文件包含了EXT-X-MEDIA-SEQUENCE標籤,那麼客戶端會假設在播放列表被加載的時間內以及播放列表的持續時間內媒體文件將變得不可用。播放列表的持續時間等於其中包含的媒體文件時長的總和。//爲啥假設不可用?
當開始播放的時候,客戶端首先從播放列表中選擇要播放的媒體文件。若是不存在EXT-X-ENDLIST標籤,而且客戶端想正常播放媒體(按順序以標準速率播放),那麼客戶端就不該該從播放列表文件尾部選擇少於三個target duration的媒體文件。
爲了達到正常播放的目的,媒體文件必須按照他們在播放列表中的順序播放。客戶端還能夠用其餘任何方式播放,好比順序播放,隨機播放,特效播放等。
對於存在EXT-X-DISCONTINUITY標籤的媒體文件,在播放以前客戶端必須準備好重置分析和解碼器。
爲了避免間斷播放,應該提早載入媒體文件,以補償延時和吞吐量的變化。
若是播放列表文件包含了EXT-X-ALLOW-CATCH標籤,而且它的值爲NO,那麼客戶端在播放之後不能夠緩存媒體文件。不然容許緩存用來之後重播。
客戶端可使用EXT-X-PROGRAM-DATE-TIME標籤來爲用戶顯示節目的起始時間。若是這個值包含了時區信息,那麼客戶端應該考慮到這點;若是不包含,那麼客戶端不能夠推測時區。
客戶端不能依靠EXT-X-ALLOW-CATCH標籤值的正確性和一致性。
客戶端必須階段性的從新載入播放列表文件,除非文件包含了EXT-X-ENDLIST標籤。然而也不能過於頻繁的載入。
當客戶端第一次載入播放列表文件或者已經載入可是發現文件與上次載入的時候有了變化,客戶端都必須等待一段時間在能夠再次載入。這段時間被稱爲原始最小重載延遲,它是從客戶端開始載入一個播放列表文件開始計算的。
原始最小重載延遲是播放列表文件中最後一個媒體文件的持續時間。媒體文件的持續時間由EXTINF標籤來指定。
若是客戶端重載了一個播放列表文件,可是發現文件並無變化,那麼它在重試以前必須等一段時間。最小延遲是target duration的倍數。第一次是0.5倍,第二次1.5倍,3倍。。。
當播放列表文件被載入或者重載之後,客戶端必須檢查播放列表來肯定要載入的媒體文件。要載入的第一個文件必須是客戶端要播放的第一個文件,見6.3.3。
若是要播放的文件已經被載入,而且播放列表文件不包含EXT-X-MEDIA-SEQUENCE標籤,那麼客戶端必須確認播放列表文件包含了最後一個被載入的媒體文件的URI,若是不包含,則暫停播放。要載入的下一個媒體文件必須是上一次載入的媒體文件URI以後的第一個媒體文件的URI。
若是要播放的文件已經被載入,而且播放列表文件包含EXT-X-MEDIA-SEQUENCE標籤,那麼要載入的下一個媒體文件就是比上一次載入的文件的序列號大的媒體文件中的序列號最小者。
若是播放列表文件包含了一個指定密鑰文件URI的EXT-X-KEY標籤,客戶端必須獲取密鑰文件,並使用其中的密鑰來解密KEY標籤以後的全部媒體文件,直到遇到另外一個EXT-X-KEY標籤爲止。
客戶端和服務器必須使用版本2以及更高版本。
#EXTM3U
#EXT-X-TARGETDURATION:5220
#EXTINF:5220,
http://media.example.com/entire.ts
#EXT-X-ENDLIST
#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
#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