HLS直播协议m3u8

HLS直播协议m3u8

Sep 25, 2021 ·
7 分钟阅读

为了方便理解,会按照“流媒体传输协议”、“HLS”、“M3U8”的顺序来介绍。

三者关系:

流媒体传输协议

常见的流媒体传输协议

流媒体就是以数据流的方式,实时发布音频、视频多媒体内容的媒体形式,关键技术在于流式传输

流媒体传输协议就是用来定义如何流式传输的,设计、制定了流媒体服务器和客户端通讯的方式。

主流的流媒体传输协议:

本文只详细介绍 HLS,不涉及 RTMP 与 RTSP

流媒体加密原理

大多数流媒体传输协议都可以分为拆分、加密两部分。

拆分是 将完整的视频流拆分为连续的视频片段,不同的传输协议的区别在于拆分片段的大小、视频容器的格式不同。

加密是 对每段视频片段进行加密,使用对称加密算法,在服务端加密,在客户端解密,且通过一定手段限制解密密钥的获取。

一般使用 AES 加密算法

为什么是对称加密?

对称加密效率相对较高,非对称加密效率相对较低,但是更安全。流媒体场景对实时性的要求很高,而且数据量也很大,所以选用效率相对较高的对称加密算法。

类似的场景还有很多,比如 HTTPS 的请求过程,内容传输为了效率选用对称加密(TLS),证书校验为了安全选用非对称加密(SSL)。

HLS

HLS 全称 HTTP Live Streaming, 是由 Apple 提出的基于 HTTP 的流媒体传输协议,用于实时音视频流的传输,目前已被广泛应用与视频点播、直播场景。

参考资料:HTTP Live Streaming Document

工作原理

完整的 HLS 架构可以划分为 3 个部分:

完整的 HLS 的过程可以参考下图:

大体可以划分为 6 个阶段:

  1. 采集媒体源
  2. 媒体编码器(Media encoder) 对媒体源进行编码
  3. 编码后以MPEG-2的传输串形式传递给切片器
  4. 切片器(Steam Segmenter)将媒体切割为若干 Media Segment,并创建配套的媒体列表文件 Media Playlist 以及索引文件 Master Platlist
  5. 上传:将资源上传到 HTTP 服务器。
  6. 播放:客户端请求播放。

组成结构

经过上面第 4 步骤的加工可以形成完整的结构,由 Master PlaylistMedia PlaylistMedia Segment 构成,关系结构如图。

完整的 HLS 结构由两部分组成:

Media Segment 就是单纯的 ts 格式的视频文件,并无任何描述信息,可以单独使用播放器进行播放。

M3U8 是 Unicode 版本的 M3U,8 代表使用的是 UTF-8 编码,M3U 和 M3U8 都是多媒体列表的文件格式。

M3U8

M3U8 描述文件中由各种描述字段构成,下面解释部分主要字段的含义。

我在网上随便找的一个 m3u8 视频的链接:https://mgtv-com.jjyl12349.com/20210519/fXE0kuJ7/index.m3u8

请求该链接的返回结果为一个 m3u8 文件,也就是 Master Playlist 文件。

Master Playlist

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234
/20210519/fXE0kuJ7/150kb/hls/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234
/20210519/fXE0kuJ7/150kb/hls/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=1280x720
/20210519/fXE0kuJ7/1000kb/hls/index.m3u8

字节解释

我们根据 BANDWIDTH、RESOLUTION 等信息选取合适的 Media Playlist 的请求链接,并将链接与视频链接的域名结合,即可得到完整的链接。

比如,BANDWIDTH 为 1000kb、RESOLUTION 为 1280x720 的备用源的请求链接为:https://mgtv-com.jjyl12349.com/20210519/fXE0kuJ7/1000kb/hls/index.m3u8

请求该链接的返回结果也为一个 m3u8 文件,也就是 Media Playlist 文件。

Media Playlist

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://mgtv-com.ycshengwang.com/20210519/fXE0kuJ7/1000kb/hls/key.key"
#EXTINF:3,
https://mgtv-com.ycshengwang.com/20210519/fXE0kuJ7/1000kb/hls/mDHy0Stk.ts
#EXTINF:3,
https://mgtv-com.ycshengwang.com/20210519/fXE0kuJ7/1000kb/hls/FWZjOCHy.ts
...
...
...
#EXT-X-ENDLIST

字节解释

编辑于 Jul 12