HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。它的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。
在开始一个流媒体会话 ,客户端会下载一个包含元数据的 extended M3U (m3u8)playlist 文件,用于寻找可用的媒体流。HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
在服务器端,流媒体文件被切割成一个一个的小分片,这些小分片有着相同的时长(常用 10s),每一个小分片是一个 ts 文件。同时 产生一个索引文件(m3u8),索引文件里存放了 ts 文件的 URL。
客户端请求方式分两种,一种是点播(vod),一种是直播(live)
Video on demand:视频点播,有求才播放
vod:客户端一次获取整个 m3u8 文件,按照里面的 URL 获取 ts 文件,采用 HTTP 协议。
live:由于 M3u8 文件时实时更新的,所以客户端每隔一段时间获取 m3u8 文件,再根据里面的 URL 获取 ts 文件,采用 HTTP 协议。
HLS总体架构
1、 服务器将媒体文件转换为 m3u8 及 ts 分片;对于直播源,服务器需要实时动态更新。
2、 客户端请求 m3u8 文件,根据索引获取 ts 分片;点播与直播服务器不同的地方是, 直播的 m3u8 文件会不断更新,而点播的 m3u8 文件是不会变的,只需要客户端在开始时请求一次即可。
HLS优劣势
优势:
客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可。使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样资源(多码流自适应),允许流媒体会话适应不同的数据速率。
劣势:
因其自身的实现方式,HLS 存在延迟(最少有一个分片),对于直播等实时敏感的场景,
体验不好。
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:
二级M3U8:
详解
HLS 是提供一个 m3u8 地址。
Apple 的 Safari 浏览器直接就能打开 m3u8 地址,譬如:
http://demo.srs.com/live/livestream.m3u8
Android 不能直接打开,需要使用 html5 的 video 标签,然后在浏览器中打开这个页面即可,
譬如:
<!-- livestream.html -->
<video width="640" height="360"
autoplay controls autobuffer
src="http://demo.srs.com/live/livestream.m3u8"
type="application/vnd.apple.mpegurl">
</video>
HLS 协议规定
视频的封装格式是 TS。
视频的编码格式为 H264,音频编码格式为 MP3、AAC 或者 AC-3。
除了 TS 视频文件本身,还定义了用来控制播放的 m3u8 文件(文本文件)。
点播 VOD 的特点就是当前时间点可以获取到所有 index 文件和 ts 文件,二级 index 文件中记录了所有 ts 文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的 m3u8 的结构。
Live 模式就是实时生成 M3u8 和 ts 文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级 index 文件,以获得最新生成的 ts 文件播放视频。如果一个二级 index 文件的末尾没有#EXT-X-ENDLIST 标志,说明它是一个 Live 视频流。
TS文件
ts 文件为传输流文件(MPEG2 - tranport stream),视频编码主要格式 h264/mpeg4,音频为 acc/MP3。
ts 文件分为三层:
ts 层 Transport Stream、pes 层 Packet Elemental Stream、es 层 Elementary Stream。
es 层就是音视频压缩数据,pes 层是在音视频数据 es 上加了时间戳(pts,dts)等对数据帧的说明信息,ts 层就是在 pes 层加入数据流的识别和传输必须的信息。