1. HLS

HLS是为移动设备开发的基于HTTP的流媒体解决方案。

2. 原理:

将视频或流切分成小片(TS), 并建立索引(M3U8).

支持视频流:H.264; 音频流:AAC

3. M3U8文件解析

M3U8文件在很多地方也叫做Playlist file。

一个简单的例子:

#EXTM3U

#EXT-X-TARGETDURATION:10

#EXT-X-MEDIA-SEQUENCE:1

#EXTINF:10, http://media.example.com/segment0.ts

#EXTINF:10, http://media.example.com/segment1.ts 
#EXTINF:10, http://media.example.com/segment2.ts

#EXT-X-ENDLIST (VOD含EXT-X-ENDLIST,live stream则没有)

3.1 File

一个M3U的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行可以是一个URI  空白行或是以”#“号开头的字符串,并且空格只能存在于一行中不同元素间的分隔。

一个URI 表示一个媒体段或是”variant Playlist file“(最多支持一层嵌套,即一个mm3u8文件中嵌套另一个m3u8)

以”#EXT“开头的表示一个”tag“,否则表示注释

3.2 Tag

#EXTM3U: 

每个M3U文件第一行必须是这个tag。

#EXTINF

指定每个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开,其格式如下:

#EXTINF:<duration>,<title> :

duration表示持续的时间(秒)”Durations MUST be integers if the protocol version of the Playlist file is less than 3“,否则可以是浮点数。

#EXT-X-BYTERANGE:

表示媒体段是一个媒体URI资源中的一段,只对其后的media URI有效,格式如下:
 #EXT-X-BYTERANGE:<n>[@o]:
 其中n表示这个区间的大小,o表在URI中的offset;”The EXT-X-BYTERANGE tag appeared in version 4 of the protocol“。

#EXT-X-TARGETDURATION

指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大值。这个tag在整个PlayList文件中只能出现一 次(在嵌套的情况下,一般有真正ts url的m3u8才会出现该tag)。格式如下:

#EXT-X-TARGETDURATION:<s>:s表示最大的秒数。

#EXT-X-MEDIA-SEQUENCE:

每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1。

#EXT-X-MEDIA-SEQUENCE:<number>:

一个media URI并不是必须要包含的,如果没有,默认为0。

#EXT-X-KEY

表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI,格式如下:
               #EXT-X-KEY:<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进制数。

#EXT-X-PROGRAM-DATE-TIME

将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida URI有效,格式如下:

#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>

For example:

#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

#EXT-X-ALLOW-CACHE:

是否允许做cache,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作用效果是所有的媒体段。格式如下:

#EXT-X-ALLOW-CACHE:<YES|NO>

#EXT-X-PLAYLIST-TYPE

提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的,格式如下:

#EXT-X-PLAYLIST-TYPE:<EVENT|VOD> :

如果是VOD,则服务器不能改变PlayList 文件;如果是EVENT,则服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容。

#EXT-X-ENDLIST

表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个,格式如下:

#EXT-X-ENDLIST

4. TS简介

5. 参考文献

[1] http://blog.csdn.net/matthew_fan/article/details/7796732

[2] http://tools.ietf.org/html/draft-pantos-http-live-streaming-08

[3] m3u8文件解析

[4] HLS协议--学习笔记--M3U8

HLS协议详解的更多相关文章

  1. 让Chrome看不了WWDC直播的HLS技术详解

    Requirements: Live streaming uses Apple's HTTP Live Streaming (HLS) technology. HLS requires an iPho ...

  2. 如何将HLS延时缩短至4秒,HLS+技术详解

    在直播应用中,RTMP 和 HLS 是两种较为成熟且广泛应用的流媒体协议,基本上可以覆盖所有客户端.RTMP 是互联网 TCP/IP 五层体系结构中应用层的协议,主要优势就是实时性高,基本可将直播延时 ...

  3. HTTP协议详解(转)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  4. HTTP协议详解

    Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  5. 动态选路、RIP协议&&OSPF协议详解

    动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...

  6. ASP.NET知识总结(3.HTTP协议详解)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. 接口测试之HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  8. 计算机网络(12)-----HTTP协议详解

    HTTP协议详解 http请求 http请求由三部分组成,分别是:请求行.消息报头.请求正文 (1)请求行 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Metho ...

  9. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

随机推荐

  1. 任务35:JWT 认证授权介绍

    任务35:JWT 认证授权介绍 应用场景主要是移动端或者PC端前后分离的场景 直接对客户端API的请求 例如访问admin/Index 没有权限返回403. 需要客户端手动的再发动请求,这是一个拿to ...

  2. 模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)

    先看看. 通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3.所求的项数还不能超过2的23次方(因为998244353的分解). 感觉没啥用. #incl ...

  3. Android笔记---常用控件以及用法

    这篇文章主要记录下Android的常用控件以及使用的方法,Android 给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,这些是Android学习的基础,没有什么业 ...

  4. TP5之model

    使用model 查询数据,添加数据,修改数据,删除数据 聚合操作 获取器,修改器 自动添加时间戳(创建时间,修改时间) 软删除 1.使用model查询数据 $res = User::get(1); / ...

  5. SpringBoot 整合SpringMVC 原理探究

    https://blog.csdn.net/cml_blog/article/details/70196572 Spring Web MVC 的配置 Bean :WebMvcProperties

  6. 跟我一起玩Win32开发(8):绘图(A)

    从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相 ...

  7. 剪花布条 HDU - 2087

    剪花布条 HDU - 2087 要求各个匹配出来的子串不重叠的kmp.实际上直接贪心从前往后找,每找到一个就把当前j标为0即可.(一般kmp是标为f[j]) #include<cstdio> ...

  8. SPFA/Dijkstra POJ 3159 Candies

    题目传送门 题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果 分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时! 代码: /****** ...

  9. C#局部类型partial在定义实体类Model中的应用

    以前一直用继承类的方法,原来还可以这样 //例如:定义一个Person的实体类,用户ID(PersonId),姓名(Name),性别(Sex),年龄(Age),地址(Address),联系方式(Tel ...

  10. SQL中的SELECT_简单查询语句总结

    --以scott用户下的dept和emp表为例 --注意:如果scott用户不能使用,请使用system用户登录--解锁scott用户ALTER USER SCOTT ACCOUNT UNLOCK;- ...