协议之HLS介绍

HLS(HTTP Live Streaming),苹果推出的基于 HTTP 的流媒体传输协议,核心是把视频切分成小分片 + m3u8 索引文件,浏览器 / 播放器通过普通 HTTP 请求逐段下载播放,无需专用流媒体端口(RTMP 用 1935),80/443 端口通用,防火墙、CDN 友好。

其实就是音视频直接使用HTTP 进行传输,这样天然的满足网元的传输。

核心特点

  1. 基于标准 HTTP,穿透性强,CDN 完美加速
  2. 自适应码率(多清晰度自动切换)
  3. 延迟偏高:标准直播 10~30s;低延迟 LL-HLS 可压到 2~5s
  4. 原生支持:Safari、iOS、Android、Chrome、VLC、Video.js、Flv.js
  5. 封装:视频 H.264/H.265,音频 AAC,分片容器 TS(传统)/fMP4(LL-HLS)

一、两大核心技术

1.1 m3u8 索引文件(文本,UTF-8)

后缀.m3u8,播放器先拉取这个文件,获取分片地址、时长、码率等配置。

1.1.1 主索引(Master m3u8):多清晰度自适应

包含多个不同分辨率 / 码率的子流地址,播放器根据网速自动切换。 示例:

#EXTM3U

#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=1280x720 720p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=960x540 540p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=200000,RESOLUTION=640x360 360p.m3u8

  • BANDWIDTH:码率 bps
  • RESOLUTION:分辨率

1.1.2 分片索引(Media m3u8):存放 TS 分片列表

记录每一段视频分片、单段时长、加密信息、直播序列。

#EXTM3U

#EXT-X-TARGETDURATION:10 // 单个分片最大时长10s

#EXT-X-MEDIA-SEQUENCE:100 // 当前第一个分片序号

#EXTINF:9.8, seg-100.ts

#EXTINF:9.9, seg-101.ts

#EXT-X-ENDLIST // 点播视频才有,直播无此行

关键标签:

  • #EXTINF:分片实际时长(秒)
  • #EXT-X-MEDIA-SEQUENCE:直播滚动更新,旧分片会被删除
  • #EXT-X-KEY:加密信息(AES-128 加密 HLS)
  • #EXT-X-DISCONTINUITY:分片编码切换标记

关于m3u8文件的生成,可以参考我在CNblog的博文:HLS(HTTP Live Streaming)协议之m3u8文件生成方式 - mediastream - 博客园

1.2. TS 分片文件(Transport Stream)

  • 传统 HLS 分片后缀.ts,一般 2~10s 一段
  • 每片独立可解码,不用依赖前后分片,网络卡顿只卡当前片段
  • LL-HLS 使用 fMP4(碎片化 MP4)分片,延迟更低

二、点播 HLS vs 直播 HLS

2.1. VOD 点播

  • m3u8 末尾带#EXT-X-ENDLIST
  • 所有分片固定,不会新增、不会删除,可完整下载整部视频

2.2. Live 直播

  • #EXT-X-ENDLIST
  • 服务端持续追加新分片,旧分片超时自动清理(滑动窗口)
  • 播放器循环定时重新请求 m3u8 获取最新片段,天然存在缓冲延迟

HLS的服务搭建,可以参考我的博文:基于nginx的HLS简单服务器搭建 - mediastream - 博客园

三 常见工具与服务

3.1推流 / 切片工具

  • FFmpeg:ffmpeg -i rtmp://input -c copy -hls_time 4 output.m3u8
  • Nginx-RTMP-Module:RTMP 转 HLS 直播
  • SRS、MediaKit、Wowza、Nimble Streamer 流媒体服务器

3.2 前端播放

  • Video.js + hls.js(Chrome/PC 浏览器)
  • Safari 原生支持 m3u8,无需插件
  • Android ExoPlayer、iOS AVPlayer 原生支持

3.3 下载工具

  • ffmpeg、vlc、N_m3u8DL-RE(m3u8 批量下载解密)