HLS直播协议m3u8
文章目录
为了方便理解,会按照“流媒体传输协议”、“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 的流媒体传输协议,用于实时音视频流的传输,目前已被广泛应用与视频点播、直播场景。
工作原理
完整的 HLS 架构可以划分为 3 个部分:
- 服务器 Server:负责视频流的编码、切割为连续的 MPEG-TS 格式的视频片段,并提供配套的 M3U8 类型的媒体列表文件和索引文件。
- 分发组件 CDN:由标准的网络服务器组成,负责接收客户端的请求并分发资源。
- 客户端 Client:先下载 m3u8 索引文件,根据带宽等字段选择合适的 m3u8 媒体播放列表文件下载,按顺序下载列表中的所有 ts 视频片段文件。
完整的 HLS 的过程可以参考下图:
大体可以划分为 6 个阶段:
- 采集媒体源
- 媒体编码器(Media encoder) 对媒体源进行编码
- 编码后以MPEG-2的传输串形式传递给切片器
- 切片器(Steam Segmenter)将媒体切割为若干
Media Segment
,并创建配套的媒体列表文件Media Playlist
以及索引文件Master Platlist
- 上传:将资源上传到 HTTP 服务器。
- 播放:客户端请求播放。
组成结构
经过上面第 4 步骤的加工可以形成完整的结构,由 Master Playlist
、Media Playlist
、Media 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
|
|
字节解释:
- 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
|
|
字节解释:
- EXT-X-VERSION:表示 HLS 协议版本号
- EXT-X-TARGETDURATION:表示 ts 视频片段允许最大的时长
- EXT-X-PLAYLIST-TYPE:表示流媒体类型
- EXT-X-MEDIA-SEQUENCE:表示播放列表第一个 ts 视频片段文件的序列号
- EXT-X-KEY:表示 ts 视频文件的加密信息
- METHOD:加密方法,可选
NONE
、AES-128
、SAMPLE-AES
- URI:密钥路径
- METHOD:加密方法,可选
- EXTINF:表示下面 url 对应的 ts 视频片段的时长
文章作者 oldjii
上次更新 2021-09-25