如何用 ZLMediaKit 的 HLS 时移实现直播视频实时回看(完整指南)
【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
做安防监控的同事曾问:直播还在推流,我想立刻回看刚才 30 分钟的画面,录播文件还没生成完怎么办?其实答案就藏在 ZLMediaKit 的 HLS 模块里——它在直播的同时把流切成 TS 小文件并实时维护 M3U8 索引,只要把hls.segNum这一个参数改成 0,"直播 HLS" 就变成"直播时移",观众可以边播边回看几分钟前的内容,而不必等录制文件收尾。
为什么普通录制满足不了实时回看
传统的 MP4 录制是"播完一场、落盘一个文件",文件没写完就无法播放。但监控、课堂、赛事这类场景里,用户往往在事件发生的十几秒后就想知道刚才发生了什么。
HLS 的存储方式天生不一样:它把直播流按秒切成一段段小文件(TS),同时维护一个 M3U8 索引。可以把直播 HLS 想象成一本"只保留最近几页"的书;而时移模式就是把这本书变成"边写边翻、整本保留"——播放器不断刷新 M3U8,就能看到越来越长的历史画面。
核心原理:一个参数决定"直播"还是"时移"
ZLMediaKit 默认配置是保留最近 3 个切片,播放列表滚动更新,这是标准直播行为。关键在于hls.segNum这个参数:
- segNum=3(默认):M3U8 只保留最近 3 个切片,老切片从索引中移除,纯直播。
- segNum=0:切片不删除,M3U8 全量记录所有切片列表,直播流持续落盘为可回看内容。
- segKeep=1:M3U8 对外仍表现为直播(索引滚动),但磁盘上所有切片全部保留供点播,每个切片目录还会生成
vod.m3u8用于回看该时段的录像。
修改位置在配置文件的[hls]段落,见配置文件。时移模式的核心改动就一行:
[hls] segNum=0改完后拉一路 HLS 流,M3U8 里会持续追加新切片,播放器从头播放这个 M3U8,就是从录制开始到现在的全程回看。切片写入逻辑在 HlsMaker 源码 中,_seg_number == 0时走录制分支、不触发切片清理,对照源码读一遍很快能看懂。
三个配套参数怎么调
⏱️segDur(切片时长,默认 2 秒)回看延迟的下限就是切片时长——最后一个切片没写满之前它不会进索引。监控回看建议 1~2 秒(低延迟、文件多);普通直播回看 4~10 秒更省磁盘 I/O。
📦segRetain(索引移除后磁盘多留的切片数,默认 5)切片从 M3U8 移除后不会立刻删,而是再留 5 个。这给"边播边删"留了缓冲,时移模式(segNum=0)下它不参与清理,保持默认即可。
🗑️deleteDelaySec(直播 HLS 删除延时,默认 10 秒)流断开后切片文件延迟 10 秒才删除,避免正在下载最后几片的播放器 404。时移场景如果希望断流后录像立刻可查,这个参数和segNum=0组合使用时可以忽略。
另外,时移模式(segNum=0)下 HLS 会一直生成,不受hls按需生成开关的限制(见 MediaSource 源码 中的注释),也就是说"只要有人推流,回看内容就在持续累积"。
验证与常见坑
验证方法很简单:推一路流后请求该流的 M3U8,观察#EXTINF行是否持续增加且不回卷;用浏览器或支持时移的 HLS 播放器从头播放,应能看到从录制起点开始的画面。
几个容易踩的点:
- 磁盘会一直涨。segNum=0 意味着切片只增不减,必须配好清理策略(比如按天归档),长直播前算好空间。
- 回看深度 = 推流时长。时移是"从本场录制开始回看",不是无限历史,需要跨天的完整录像请配合 MP4 录制或按周期重启录制。
- 播放器要支持时移刷新。普通直播播放器只追最后几片,不会从头拉;需要客户端主动从头请求 M3U8 并周期性刷新,仓库里的 webassists 播放器目录 和
www/下的示例页可以作为起点。 - 延迟别指望低于切片时长。想"1 秒回看"就调小 segDur,但文件数量和索引更新频率会上升,按服务器 I/O 能力权衡。
适用边界
这套方案解决的是"本场直播内、分钟到小时级的即时回看",实现成本低(一行配置),代价是切片文件占用的存储。如果需求是"回看昨天的录像",应把它当作实时性最高的第一层,再叠加 MP4 完整录制做长期存档;两者共用同一份推流,互不影响。
【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考