HLS Profile

Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/myvest/article/details/90900135

1. Introduction Agreement

HLS called the HTTP Live Streaming, HTTP-based streaming media network transmission protocol proposed by Apple. It works the entire media stream is divided into a small HTTP-based media segment download, a time to download some fragments. At the beginning of a streaming media session, the client will download the index file comprising a media segment, i.e. extended M3U playlist file (M3U8), for finding available media fragmentation.

HLS, the index file can be nested, generally only an index and a secondary index; fragments sealing package media stream format only supports MPEG-2 transport stream (ts), WebVTT [WebVTT] Packed Audio file or files.

Below shows the relationship between the index file (m3u8) and the media segment (ts): an m3u8 m3u8 two nested, two ts m3u8 described slice.

Here Insert Picture Description

2. Works

2.1 The overall architecture

Here Insert Picture Description
1, the server will convert media files to m3u8 ts and fragmentation; source for live, real-time dynamic server needs to be updated.
2, the client requests m3u8 documents, access ts fragment according to the index; on-demand and live server is a different place, live m3u8 file will be constantly updated, and demand m3u8 file will not change, only the client at the beginning request once.

Clients interact with the server through the HTTP protocol to two nested m3u8 an example, the first client to a m3u8 GET request, which contains a m3u8 server can be used or a plurality of different bandwidths propagating URL this URL may be acquired two m3u8; two m3u8 contains a plurality of duration ts and slices URL, the URL to download over the last band ts fragments. Interactively as follows:
Here Insert Picture Description

2.2 Advantages and disadvantages

Advantage:

  1. Client supports simple, only needs to support HTTP requests to, stateless HTTP protocol, simply according to the order to download media segment.
  2. 使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器。
  3. 当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。

劣势:

  1. 因其自身的实现方式,HLS存在延迟(最少有一个分片),对于直播等实时敏感的场景,体验不好。

2.3 M3U8简介

HLS协议很大一部分内容即是对M3U8文本协议的描述。M3U8即播放索引文件,也称为Playlist,是由多个独立行组成的文本文件,必须通过 URI(.m3u8 或 .m3u) 或者 HTTP Content-Type 来识别(application/vnd.apple.mpegurl 或 audio/mpegurl)。

每行由用 \n 或者 \r\n来标识换行。每一行可以是一个URI、空白行或是一个 以# 号开头的字符串。

以 # 开头的是 tag 或者注释,以 #EXT 开头的是 tag, 其余的为注释, 在解析时应该忽略。URI 表示一个ts分片地址或是Playlist地址。URI 可以用绝对地址或者相对地址,如果使用相对地址,那么是相对于当前Playlist的地址。
有些tag带有属性值,多个属性用逗号分隔。
常见的m3u8文件如下所示:
一级m3u8:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=bstvod&Contentid=4007432528&authCode=08210410332183529120&stbId=009903FF0002288018189C62AB5407DB&usergroup=g10000000001&userToken=ded7cd85837b64937de618db3e10553310vv
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1300000
http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=bstvod&Contentid=4007432527&authCode=08210410332183529120&stbId=009903FF0002288018189C62AB5407DB&usergroup=g10000000001&userToken=ded7cd85837b64937de618db3e10553310vv
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2300000
http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=bstvod&Contentid=4007432526&authCode=08210410332183529120&stbId=009903FF0002288018189C62AB5407DB&usergroup=g10000000001&userToken=ded7cd85837b64937de618db3e10553310vv

二级m3u8:

#EXTM3U
#EXT-X-VERSION:1
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:19674922
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:40Z
#EXTINF:10,
19674922.ts?
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:50Z
#EXTINF:10,
19674923.ts?
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:34:00Z
#EXTINF:10,
19674924.ts?

音视频分离m3u8示例1:

#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="English", \
DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="en", \
URI="main/english-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Deutsch", \
DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="de", \
URI="main/german-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Commentary", \
DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="en", \
URI="commentary/audio-only.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac"
low/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac"
mid/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac"
hi/video-only.m3u8

音视频分离m3u8示例2:

#EXTM3U
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Main", \
DEFAULT=YES,URI="low/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Centerfield", \
DEFAULT=NO,URI="low/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Dugout", \
DEFAULT=NO,URI="low/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",VIDEO="low"
low/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Main", \
DEFAULT=YES,URI="mid/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Centerfield", \
DEFAULT=NO,URI="mid/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Dugout", \
DEFAULT=NO,URI="mid/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",VIDEO="mid"
mid/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Main", \
DEFAULT=YES,URI="hi/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Centerfield", \
DEFAULT=NO,URI="hi/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Dugout", \
DEFAULT=NO,URI="hi/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",VIDEO="hi"
hi/main/audio-video.m3u8

2.3.1 tag说明

名词说明:
1、 Media Playlist:携带ts分片url的m3u8;
2、 Master Playlist:一级m3u8;
3、 Media Segment:ts分片
4、 Attribute Lists:属性列表

 Attribute Lists :

• 有的 tags 的值带有 Attribute Lists。
• 一个 Attribute List是一个用逗号分隔的 attribute/value 对列表。
• 格式为: AttributeName=AttributeValue。

tag以#EXT开头,主要分为以下几类:

1) Basic Tags

Basic Tags 可以用在 Media Playlist 和 Master Playlist 里面。

• EXTM3U: 必须在文件的第一行, 标识是一个 Extended M3U Playlist 文件。
• EXT-X-VERSION: 表示 Playlist 兼容的版本。

2) Media Segment Tags
每一个 Media Segment 通过一系列的 Media Segment tags 跟一个 URI 来指定。有的 Media Segment tags 只应用于下一个 segment, 有的则是应用所有下面的 segments。
一个 Media Segment tag 只能出现在 Media Playlist 里面。

• EXTINF: 用于指定 Media Segment 的 duration。
• EXT-X-BYTERANGE: 用于指定 URI 的 sub-range。
• EXT-X-DISCONTINUITY: 表示后续分片属性发生变化,如文件格式/编码/序号。
• EXT-X-KEY: 表示Media Segment 已加密,该值用于解密。
• EXT-X-MAP: 表示Media Segment的头部信息,比如PAT/PMT 或者WebVTT头。
• EXT-X-PROGRAM-DATE-TIME: 和 Media Segment 的第一个sample一起来确定时间戳。

3)Media Playlist Tags
Media Playlist tags 描述 Media Playlist 的全局参数。 同样地, Media Playlist tags 只能出现在 Media Playlist 里面。

• EXT-X-TARGETDURATION: 用于指定最大的 Media Segment duration。
• EXT-X-MEDIA-SEQUENCE: 用于指定第一个 Media Segment 的序号。
• EXT-X-DISCONTINUITY-SEQUENCE: 用于不同 Variant Stream 之间同步。
• EXT-X-ENDLIST: 表示Media Playlist结束。
• EXT-X-PLAYLIST-TYPE: 可选, 指定整个 Playlist 的类型。
• EXT-X-I-FRAMES-ONLY: 表示每个 Media Segment 均为I-frame。

. 4) Tags Playlist Master
Master Playlist Tags defined Variant Streams, Renditions, and other global parameters displayed. Master Playlist tags can only appear in the Master Playlist.

Multiple translations for associating with a content of more Media Playlist: • EXT-X-MEDIA.
• EXT-X-STREAM-INF : used to specify the lower-level Media Playlist related properties.
• EXT-XI-FRAME-STREAM -INF: and EXT-X-STREAM-INF similar, but pointed to the lower Media Segment Media Playlist contains both I-frame.
• EXT-X-SESSION-DATA : free to store some of the data session.

5) Media or Master Playlist Tags
Tags can appear here in Media Playlist or the Master Playlist. But if at the same time appear in the same Master Playlist and Media Playlist must be the same value.

• EXT-X-INDEPENDENT-SEGMENTS : Media Segment represents each can be independently decoded.
• EXT-X-START: identify a preferred spot to play the Playlist.

2.3.2 Common tag Comments

A more detailed description, please refer to the HLS official documents.

#EXTM3U	每个M3U文件第一行必须是这个tag。
#EXTINF	
格式:#EXTINF:<duration>,<title>
<URI>指定每个ts分片的时长,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开。
<duration>表示时长(秒)必须是整数,如果版本在3以上可以是浮点数。
<URI>表示该ts分片下载地址
#EXT-X-TARGETDURATION	
格式:#EXT-X-TARGETDURATION:<s>
<s>指定最大的媒体段时间长(秒)。#EXTINF中指定的时间长度必须小于或是等于这个最大值。
这个tag在整个PlayList文件中只能出现一次(在嵌套的情况下,一般有真正ts url的m3u8才会出现该tag)。
#EXT-X-MEDIA-SEQUENCE	
格式:#EXT-X-MEDIA-SEQUENCE:<number>
<number>表示PlayList中第一个分片开始的序号,其他分片序号按此逐步加1
#EXT-X-ENDLIST	表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个。直播节目不具有此tag,一般用此tag来区分是否为直播节目。
#EXT-X-STREAM-INF	指定一个包含多媒体信息的 media URI 作为PlayList,一般做M3U8的嵌套使用,它只对紧跟后面的URI有效。
格式:
#EXT-X-STREAM-INF:<attribute-list>
<URI>
<URI>指定下级m3u8下载地址。
<attribute-list>为属性描述
有以下属性:
BANDWIDTH:带宽,必须有。
PROGRAM-ID:该值是一个十进制整数,惟一地标识一个在PlayList文件范围内的特定的描述。一个PlayList 文件中可能包含多个有相同ID的此tag。
CODECS:不是必须的。
RESOLUTION:分辨率。
AUDIO:这个值必须和AUDIO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。
VIDEO:同上
#EXT-X-MEDIA	被用来在PlayList中表示相同内容的不用语种/译文的版本,比如可以通过使用3个这种tag表示3中不用语音的音频,或者用2个这个tag表示不同角度的video在PlayLists中。
格式:#EXT-X-MEDIA:<attribute-list>
<attribute-list>为属性描述,包含:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、AUTOSELECT。
URI:如果没有,则表示这个tag描述的可选择版本在主PlayList的EXT-X-STREAM-INF中存在;
TYPE:AUDIO或VIDEO;
GROUP-ID:具有相同ID的MEDIA tag,组成一组样式;
LANGUAGE:确定使用的主要语言
NAME:对当前类型的描述,如果存在LANGUAGE,则改属性必须描述LANGUAGE指定的语言。
DEFAULT:YES或是NO,默认是No,如果是YES,则客户端会以这种选项来播放,除非用户自己进行选择。
AUTOSELECT:YES或是NO,默认是No,如果是YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)。
#EXT-X-PROGRAM-DATE-TIME	将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida URI有效,格式如下:
#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>
例如:
#EXT-X-PROGRAM-DATE-TIME:2019-03-26T10:09:10Z
#EXT-X-BYTERANGE	表示媒体段是一个媒体URI资源中的一段,只对其后的media URI有效
格式:#EXT-X-BYTERANGE:<n>[@o]
<n>表示这个区间的大小
[@o]表在URI中的offset;
该tag只在V4及以后的版本生效
#EXT-X-KEY	表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI
格式:#EXT-X-KEY:<attribute-list>
<attribute-list>:NONE 或者 AES-128。如果是NONE,则URI以及IV属性必须不存在,如果是AES-128(Advanced Encryption Standard),则URI必须存在,IV可以不存在。对于AES-128的情况,keytag和URI属性共同表示了一个key文件,通过URI可以获得这个key,如果没有IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0;如果有IV,则将改值当成16个字节的16进制数。

Guess you like

Origin blog.csdn.net/myvest/article/details/90900135