什么是 M3U8?什么是 HLS 协议?
Posted on Wed, 25 Dec 2024 10:33:36 +0800 by LiangMingJian
概述
要了解什么是 M3U8,我们需要先了解什么是 HLS(HTTP Live Streaming)协议,因为 M3U8 是 HLS 协议的一个重要产物。
要了解什么是 HLS 协议,我们需要先了解什么是流媒体传输协议,因为 HLS 协议是流媒体传输协议的一种。
流媒体传输协议是什么
在介绍流媒体传输协议前,我们先了解什么是流媒体?
传统的 MP3,MP4,WebM 这些音视频文件,它们的大小往往都是固定的,播放的开始和结束时间都明确的。这些文件存放在服务端,可以像其他文件一样,在知道大小的前提下传输到浏览器端,因此我们可以称之为静态媒体(音视频数据都是静态的,固定的)。
现实中,除了 MP3,MP4 这些固定大小的音视频数据外,还包括摄像头直接采集的数据,电脑屏幕采集的数据等这种没办法知道大小的音视频数据。与静态数据相比,这些摄像头,采集卡数据没有固定的开始和结束时间,我们在播放这些数据时,不是在播放一个大小明确的文件,而是在转播一个即时创建的文件,因此我们称这些数据为流媒体(音视频数据都是动态的,不固定的)。
与静态媒体通常使用 HTTP 传输下载不同,流媒体支持更多样的协议。
当前常用的流媒体传输协议主要包括以下几类:
RTSP
Real Time Streaming Protocol,实时流传输协议。
RTSP 是基于 RTP 实时传输协议(基于此传输音视频数据)和 RTCP 实时传输控制协议(基于此控制音视频数据)的一种流媒体传输协议。
但需要注意的是,RTSP 无法直接在浏览器网页上播放,因此 RTSP 的应用场景更多是在嵌入式硬件设备或者 PC 软件上。
RTMP
Real Time Messaging Protocol,实时消息协议。
RTMP 是 Adobe 公司开发的一种专用实时音视频传输协议,其基于 TCP 传输协议实现低延迟双向通信。
特别的,RTMP 虽然也无法直接在浏览器网页上播放,但是 RTMP 可以通过 Adobe Flash 插件或者转换为 FLV(Flash Video)视频格式来直接在网页上播放。
FLV 在网页上通过
flv.js这一开源库实现解码播放,但是注意,FLV 流无法在苹果系的产品上播放。这主要是因为 FLV 依赖于 Flash 解码器,而苹果出于安全着想,自 iOS 13 开始便禁止 Flash,进而导致 FLV 流无法在苹果系统上播放。
显然,RTMP+FLV 不能在苹果系统上播放这一问题并不满足当前实际的应用环境,因此,就需要引入 HLS 流媒体协议,来实现全平台播放。
HLS
HTTP Live Streaming,基于 HTTP 的流媒体传输协议。
HLS 是由苹果公司研发的协议,它能被 JavaScript 所解码,因此 HLS 支持在 PC、IOS、Safari 及安卓等大多数浏览器上播放,是当前最通用的流媒体传输协议。
注意,与 RTSP,RTMP/FLV 相比,HLS 的延迟会更大,这与其技术原理有密切的关系。
HLS 协议的解析
HLS 协议的核心工作原理是通过将一段视频分割成无数个小段,每一个小段生成一个后缀名为 ts 的分片文件,然后通过 HTTP 协议,像静态资源一样传输下载到视频网站上一段一段的播放。
通过这样处理,流媒体能像静态资源一样被 JavaScript 进行解码,无需任何插件。同时,用户观看更为流畅,网站可以根据网络状况自动切换视频的清晰度,下载不同分辨率的 ts 分片视频文件,在网络状况不稳定的情况下,保障视频的流畅播放。
HLS 工作流程可以参照下面的示例图:

上半部分,是采集处理的工作流程
- 首先,前端设备,如摄像头,采集卡这些硬件设备采集音视频信号并生成音视频数据。
- 然后,前端设备将生成的音视频数据推送到服务器。
- 接着,服务器对接收到的音视频数据进行分析,并解码数据到切片器。
- 最后,切片器会针对音视频数据进行切片操作。
- 在切片时,首先会创建一个索引文件记录切片文件,然后将数据切割成多个 TS 文件。
下半部分,是浏览器获取流媒体播放的工作流程
- 首先,浏览器向服务器请求所要播放流媒体的索引文件。
- 然后,浏览器对所获取的索引文件进行分析。
- 最后,浏览器依据索引内容,按顺序下载并播放 TS 分片文件。
上面工作流程中的索引文件就是 M3U8。
M3U8 是什么?
M3U8 是苹果对 M3U 的升级播放列表格式,数字 8 代表 UTF-8 编码。
M3U,Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator,MP3 URL,是早期 Winamp 播放器为 MP3 音频设计的一种播放列表格式,后来发展成支持视频的通用标准。
M3U8 本质是一个文本文件,它记录着视频片段的地址和播放顺序。浏览器或者播放器通过读取它,能自动下载片段进行播放。
一个标准的 M3U8 文件往往包括以下的内容:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.009,segment_0.ts
http://example.com/video/segment_0.ts
#EXTINF:10.000,segment_1.ts
http://example.com/video/segment_1.ts
#EXTINF:8.000,segment_2.ts
http://example.com/video/segment_2.ts
#EXT-X-ENDLIST
其中各字段的含义如下表所示:
| 内容 | 含义 |
|---|---|
#EXTM3U | 文件头,标识为 M3U8 格式,必须位于首行 |
#EXT-X-VERSION:3 | 指定 HLS 协议版本 |
#EXT-X-TARGETDURATION:10 | 分片的最大时长(秒),所有分片的长度都必须小于或等于这个值。 |
#EXT-X-MEDIA-SEQUENCE:N | 首个播放分片的序列号,视频从这个分片开始播放 |
#EXTINF:DURATION, TITLE | 分片的时长(秒)和标题(可选),后面必须跟随分片 URL。 |
#EXT-X-ENDLIST | 列表结束,流媒体播放完毕 |
特别的,M3U8 还可以通过 #EXT-X-KEY 标签实现 AES-128 加密,对流媒体资源进行保护。