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

三者关系:

  • HLS是一种流媒体传输协议
  • M3U8是HLS传输内容中的一部分

流媒体传输协议

常见的流媒体传输协议

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

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

主流的流媒体传输协议:

  • RTMP(Real Time Protocol):基于 TCP 的 FLV 分块 message 传输协议,用于 Flash 客户端。
  • HTTP-FLV:基于 HTTP 长连接的 FLV 分块 tag 传输协议,可用于点播和直播场景。
  • HLS(HTTP Live Streaming):基于 HTTP,由 Apple 推出的 MP4 分片传输协议,可以用于点播、直播,每次下载一次分片都需要发生一次 HTTP 请求。

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

流媒体加密原理

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

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

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

一般使用 AES 加密算法

为什么是对称加密?

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

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

HLS

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

参考资料:HTTP Live Streaming Document

工作原理

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

  • 服务器 Server:负责视频流的编码、切割为连续的 MPEG-TS 格式的视频片段,并提供配套的 M3U8 类型的媒体列表文件和索引文件。
  • 分发组件 CDN:由标准的网络服务器组成,负责接收客户端的请求并分发资源。
  • 客户端 Client:先下载 m3u8 索引文件,根据带宽等字段选择合适的 m3u8 媒体播放列表文件下载,按顺序下载列表中的所有 ts 视频片段文件。

完整的 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 结构由两部分组成:

  • m3u8 类型的 Master Playlist 文件:其中会提供若干根据带宽等字段区分的 Media Playlist 的请求链接。
  • m3u8 类型的 Media Playlist 文件:其中会有视频的基本信息和若干 Media Segment 的请求链接,这些片段就组成了完整的视频。

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

1
2
3
4
5
6
7
#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

字节解释

  • EXTM3U:表示该文件为m3u8文件,每个M3U文件都是以EXTM3U开头
  • EXT-X-STREAM-INF:表示一个备份源,并提供备份源的相关信息
    • BANDWIDTH:表示每秒传输的比特数,即带宽
    • RESOLUTION:表示备份源的最佳像素方案

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

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

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

Media Playlist

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#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

字节解释

  • EXT-X-VERSION:表示 HLS 协议版本号
  • EXT-X-TARGETDURATION:表示 ts 视频片段允许最大的时长
  • EXT-X-PLAYLIST-TYPE:表示流媒体类型
  • EXT-X-MEDIA-SEQUENCE:表示播放列表第一个 ts 视频片段文件的序列号
  • EXT-X-KEY:表示 ts 视频文件的加密信息
    • METHOD:加密方法,可选 NONEAES-128SAMPLE-AES
    • URI:密钥路径
  • EXTINF:表示下面 url 对应的 ts 视频片段的时长