协议之HLS介绍
HLS(HTTP Live Streaming),苹果推出的基于 HTTP 的流媒体传输协议,核心是把视频切分成小分片 + m3u8 索引文件,浏览器 / 播放器通过普通 HTTP 请求逐段下载播放,无需专用流媒体端口(RTMP 用 1935),80/443 端口通用,防火墙、CDN 友好。
其实就是音视频直接使用HTTP 进行传输,这样天然的满足网元的传输。
核心特点
- 基于标准 HTTP,穿透性强,CDN 完美加速
- 自适应码率(多清晰度自动切换)
- 延迟偏高:标准直播 10~30s;低延迟 LL-HLS 可压到 2~5s
- 原生支持:Safari、iOS、Android、Chrome、VLC、Video.js、Flv.js
- 封装:视频 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:码率 bpsRESOLUTION:分辨率
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 批量下载解密)
