流媒体协议HLS

4/24/2023 10:21:44 AM
1146
0

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前HLS协议被广泛的应用于视频点播和直播领域。

原理介绍

HLS 跟 DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便。

HLS 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。

关于 HLS 的详细介绍可参考: https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23

在 HTML5 页面上使用 HLS 非常简单:

直接:

<video src="example.m3u8" controls></video>

或者:

<video controls>
    <source src="example.m3u8"></source>
</video>

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 的 m3u8,是一个 ts 的列表,也就是告诉浏览器可以播放这些 ts 文件,譬如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:EVENT
#EXTINF:8.333322,
u10.ts
#EXTINF:8.333333,
u11.ts
#EXTINF:8.333322,
u12.ts
#EXTINF:8.333322,
u13.ts
#EXTINF:8.333322,
u14.ts
#EXTINF:8.333333,
u15.ts
#EXTINF:8.333322,
u16.ts
#EXTINF:8.333322,
u17.ts
#EXTINF:8.333322,
u18.ts
#EXTINF:8.333333,
u19.ts
#EXTINF:8.333322,
u110.ts
#EXTINF:8.333322,
u111.ts
#EXTINF:8.333322,
u112.ts
#EXTINF:8.333333,
u113.ts
#EXTINF:8.333322,
u114.ts
#EXTINF:8.333322,
u115.ts
#EXTINF:8.033333,
u116.ts
#EXT-X-ENDLIST

有几个关键的参数,这些参数在 SRS 的配置文件中都有配置项:

  • EXT-X-TARGETDURATION:所有切片的最大时长。有些 Apple 设备这个参数不正确会无法播放。SRS 会自动计算出 ts 文件的最大时长,然后更新 m3u8 时会自动更新这个值。用户不必自己配置。
  • EXTINF:ts 切片的实际时长,SRS 提供配置项 hls_fragment,但实际上的 ts 时长还受 gop 影响。
  • ts 文件的数目:SRS 可配置 hls_window,指定 m3u8 中保存多少个切片,SRS 会自动清理旧的切片。
  • u10.ts:SRS 会自动维护 ts 切片的文件名,在编码器重推之后,这个编号会继续增长,保证流的连续性。直到 SRS 重启,这个编号才重置为 0。
  • EXT-X-PLAYLIST-TYPE 播放模式,EVENT是直播模式  vod 是点播模式

譬如,每个 ts 切片为 10 秒,窗口为 60 秒,那么 m3u8 中会保存 6 个 ts 切片。

每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 web 服务器上,ts 文件放在 cdn 上。

.m3u8 文件,其实就是以 utf-8 编码的 m3u 文件,这个文件本身不能播放,只是存放了播放信息的文本文件。

整体框架

HLS的架构分为三部分:Server,CDN,Client 。即服务器、分发组件和客户端。

 (1) Server

服务器端将视频数据流编码、封装和切割为连续的、时长很短的MPEG-TS格式的文件,通常一个ts分片大概是10s;并提供一个配套的媒体列表文件(m3u8文件)。

视频封装格式:MPEG-TS。

编码:视频编码为H.264,音频编码为AAC, MP3, AC-3或者EC-3格式。

HLS也支持纯音频格式,通常是MPEG基本音频文件(MP4封装的AAC格式)。

(2) Distribution

由标准的网络服务器组成,接收客户端的请求和分发所有的资源包括m3u8列表文件和ts分片文件。

(3) Client

客户端先通过下载m3u8文件,再通过m3u8文件的索引地址顺序地拉取ts媒体文件播放。对于直播,它的索引文件一直处于动态变化的,你需要不断的更新索引文件 playlist 然后移除旧的索引文件。

一般为了加快速度,m3u8 放在 web 服务器上,ts 文件放在 cdn 上。

把视频文件上传到服务器上,视频会被转换成HLS格式的视频(即TS和m3u8文件)。Media encoder模块负责将视频源中的视频数据转码到目标编码格式(H264)的视频数据,然后Stream Segment模块将视频切片,切片的结果就是index file(m3u8)和ts文件了。

HLS的index文件就是m3u8的文件,先下载一级index file(master_playlist.m3u8),它里面记录了二级索引文件的地址(Alternate-A、Alternate-B、Alternate-C)的地址,然后客户端再去下载二级索引文件,二级索引文件中又记录了TS文件的下载地址,这样客户端就可以按顺序下载TS视频文件并连续播放。

HLS协议编码格式要求

  • 视频的编码格式:H264
  • 音频的编码格式:AAC、MP3、AC-3
  • 视频的封装格式:ts
  • 保存 ts 索引的 m3u8 文件

 

本文来自  https://zhuanlan.zhihu.com/p/355136397

全部评论



提问