一、什么是直播 DVR 时移回看
很多监控直播、网课直播产品有回看功能,也就是 DVR 时移。通俗讲:直播正在播出,用户可以拖动进度条,回看几分钟、几十分钟之前已经播过的历史画面。点播视频全部分片提前生成好;而直播 DVR 是在直播运行过程中,服务器保留最近一段时间的历史 TS 分片,M3U8 清单里面带上历史分片,播放器就可以往回拖动。
很多新手会把 DVR 直播和点播搞混。DVR 本质依旧是直播流,M3U8 没有#EXT‑X‑ENDLIST结束标记,只是服务器多保存了一部分旧分片,回看窗口有时间上限,不能无限往前面拖动。比如业务配置保留 30 分钟回看,用户最多只能回看过去 30 分钟,更早的分片服务器已经删除。
实际开发测试经常遇到问题:直播实时画面播放正常,但是拖动回看就黑屏、花屏、报错。很多测试只看实时直播画面,从来不测试拖动回看,上线之后才收到用户反馈。
遇到 DVR 回看类问题,我会使用 m3u8live.cn 网页调试工具,加载直播 M3U8,尝试拖动进度条做回看操作,快速确认回看功能是否正常。
二、DVR 回看高频踩坑现象
坑 1:hls_list_size 设置过小,回看窗口很短
hls_list_size 控制 M3U8 清单保存分片的数量。分片数量少,能回看的时间就短。业务需要 30 分钟回看,但是分片数量设置太少,只能回看几分钟。很多新手只关心实时直播流畅,忽略这个参数会影响回看时长。
坑 2:推流断连重连,缺少 #EXT‑X‑DISCONTINUITY 标记
直播中间推流断开再恢复,服务器没有写入不连续标记。往回拖动到断流的时间段,播放器时间基准错乱,出现花屏、音画不同步。
坑 3:DVR 回看窗口配置过大
为了能看很久的历史,把 hls_list_size 设置巨大。M3U8 索引文本体积暴涨,每次播放器下载 M3U8 要下载大量文本,增加请求耗时,起播变慢,服务器 CPU、内存压力上涨。回看不是越大越好,按照产品需求设置合理窗口。
坑 4:前端播放器不做限制,用户无限制往前拖拽
服务端只保留 30 分钟历史分片,但是前端进度条没有做时间限制,用户拖到 30 分钟之前,请求已经被删除的旧分片,返回 404,直接黑屏。
坑 5:CDN 缓存干扰 DVR M3U8 清单
直播 DVR 的 M3U8 是动态不停变化的清单,如果给 M3U8 设置较长 Cache‑Control 缓存,浏览器拿到老旧清单,回看分片不全,拖动失败。
三、DVR 回看简单排查步骤
第一步,把直播 M3U8 放到网页调试工具,先确认实时直播画面正常,再尝试拖动进度条往回看。
- 如果工具拖动回看就黑屏花屏:优先排查切片服务 hls_list_size、推流重连标记;
- 如果工具回看正常,业务页面异常:排查前端播放器,是否做了进度条时间限制、hls.js 配置。
第二步,查看原始 M3U8 文本,观察分片数量,推流断开重连的位置有没有#EXT‑X‑DISCONTINUITY标记。
第三步,确认 M3U8 动态清单 Cache‑Control,不能设置长缓存。
四、业务开发测试建议
- hls_list_size 根据产品需要的回看时长计算,不要过小也不要盲目设置超大。
- 推流中断恢复,切片服务务必输出不连续标记,防止回看花屏。
- 前端进度条要做时间范围限制,不让用户拖动超出服务端保留的回看窗口,避免请求过期分片 404。
- 直播 DVR 的 M3U8 动态清单,max‑age 设置很短,禁止长缓存。
- 测试直播不能只看实时画面,一定要增加拖动回看的测试用例。
五、总结
DVR 时移回看是直播业务很实用的能力,但它并不是点播,回看窗口受服务器保存分片数量限制。hls_list_size、断流标记、CDN 缓存、前端进度限制,任何一环出错,拖动回看就会黑屏花屏。很多测试只测实时直播,漏掉回看场景。借助网页调试工具做拖动回看测试,可以提前发现 DVR 相关隐患,上线少出问题。