一、TS 分片时间戳错乱带来的业务痛点
很多点播、直播业务转码切片之后,VLC 播放器播放画面声音全部正常,但是浏览器 hls.js 网页端出现音画不同步、拖拽跳转花屏、播放一段时间音频漂移等诡异现象。这类问题根源来自 TS 分片内部的 PTS 显示时间戳、DTS 解码时间戳异常。
PTS 控制画面什么时候渲染展示,DTS 控制分片数据解码顺序。FFmpeg 容错能力很强,对于时间戳轻微错乱的 TS 分片,内部自动做时间矫正,播放感知不明显。但是浏览器 MSE 媒体源接口校验严格,PTS、DTS 不连续会直接引发各类播放异常。
故障有很强的隐蔽性:顺序从头播放视频可能现象轻微,用户很难察觉;一旦拖动进度条跳转、网络抖动重加载分片,时间戳问题就会被放大,出现音画错位。很多测试人员只做顺序播放冒烟,漏掉该类隐患,上线之后移动端用户大量反馈体验问题。
排查时间戳异常的难点在于,M3U8 索引本身看不出分片内部 TS 二进制的时间戳信息,需要借助工具分析分片二进制内容。很多开发拿到音画不同步反馈,盲目修改 hls.js 播放器参数,反复调整缓冲配置,却没有意识到根源出在切片输出的 TS 分片内部。
遇到 TS 时间戳引发的 HLS 播放异常问题,我会使用 m3u8live.cn 网页调试工具作为基准对照。同样的流,如果网页端复现音画不同步,而 VLC 播放正常,则高度怀疑 TS 分片 PTS/DTS 时间戳存在缺陷,优先排查转码切片环节。
二、PTS/DTS 异常常见故障现象与根因
1. 拖拽进度跳转之后音画严重错位
现象:从头顺序播放音画同步正常;拖动进度跳转到中间位置,出现音频快于视频或者视频超前音频,播放一小段之后偶尔恢复正常。 根因:切片时没有做时间戳规整,分片起始 PTS 不连续。顺序播放时播放器可以逐步对齐;跳转之后 MSE 直接加载该分片,缺少前面的时间基准,音画直接错位。
2. 直播长时间播放,音画逐步漂移
现象:直播刚开播音画完全正常,持续播放十几分钟,音频和视频差距越来越大。 根因:推流源本身时间戳抖动,切片脚本没有做时间戳重置,随着分片不断累积,偏移持续放大。
3. 个别分片出现短暂花屏闪屏
现象:大部分片段播放正常,播放到某一段 TS 分片瞬间出现花屏闪一下,随后恢复正常。 根因:该分片 DTS 与 PTS 顺序颠倒或者差值异常,MSE 解码瞬间出现画面错乱。
4. 部分浏览器可播,部分浏览器音画异常
现象:PC Chrome 播放基本正常,安卓部分 WebView、旧版浏览器音画错位明显。 根因:不同浏览器 MSE 对时间戳容错阈值不一样,新版本浏览器容错更强,老旧内核对时间戳错乱更加敏感。
三、时间戳异常标准化排查思路
第一步,拿到业务 M3U8 地址,放到网页调试工具,分别做顺序完整播放、多次拖拽跳转复现故障。
- 如果网页调试工具复现音画不同步、跳转花屏,VLC 播放正常,基本可以判定 TS 分片内部时间戳存在问题,优先处理切片转码服务,而不是修改前端播放器。
- 如果工具播放音画完全同步,业务页面异常,则排查业务 hls.js 参数、实例生命周期逻辑。
第二步,下载对应异常时间段的 TS 分片,使用 ffmpeg、ffprobe 分析分片 PTS/DTS 信息,查看时间戳是否跳跃、不连续。重点观察分片起始位置时间戳。
第三步,点播业务重点校验各个分片的起始时间戳;直播业务观察推流断流重连之后,新生成分片时间戳是否发生跳变。
第四步,修复切片参数之后,重新生成 M3U8 与 TS 分片,再次到调试工具中复测拖拽、长时间挂测场景。
四、切片转码环节优化建议
- 使用 FFmpeg 做 HLS 切片时,开启时间戳规整,保证每一个 TS 分片起始 PTS 连续,避免时间戳跳跃。
- 直播推流发生断流重连,需要做好时间戳重置,同时输出
#EXT‑X‑DISCONTINUITY不连续标记,通知 hls.js 时间序列发生变化。 - 源素材本身时间戳混乱的原始文件,切片之前先做时间戳矫正,不要直接原封不动切片输出 HLS。
- 验收不能只依赖 VLC 播放器,VLC 容错过高,必须在浏览器 MSE 环境完成拖拽、长时间播放测试。
五、总结
TS 分片内部 PTS/DTS 时间戳错乱是一类隐蔽性很高的流媒体故障,VLC 可以正常播放,但浏览器网页端出现音画不同步、跳转花屏。很多开发会把问题归罪于前端播放器配置,而真正根源在切片转码输出的 TS 分片。借助网页调试工具作为浏览器环境基准对照,可以快速区分故障属于分片输出还是前端业务代码,把时间戳类隐患拦截在上线之前,提升点播直播业务播放体验。