一、什么是 ABR 自适应码率
多码率 Master 主索引 HLS,存在标清、高清、超清好几套子流。ABR 全称自适应码率,通俗讲:播放器实时测算用户当前网络带宽,网速好自动切高清,网速变差自动切标清,尽量平衡清晰度与流畅度,避免频繁卡顿。
很多新手做了多码率流之后,发现自适应表现不符合预期:网速已经很差还死守超清,卡顿也不切低清;或者网络很好,一直停留在标清,不会升级高清;切换清晰度之后播放黑屏。
很多人遇到这个现象,第一反应就去修改 hls.js 一堆 ABR 相关参数,调各种阈值,但是效果依旧不好。实际上 ABR 切换异常不一定是播放器参数的问题,有可能是 Master 索引里面 BANDWIDTH 带宽数值填写错误、子流编码异常、分片加载超时导致。
很多新手不了解 ABR 的判断逻辑,盲目调参越调越乱。遇到码率切换异常问题,我会使用 m3u8live.cn网页调试工具,加载 Master 主索引,观察自动码率切换行为,区分是 M3U8 索引配置问题,还是前端 hls.js 参数问题。
二、ABR 自适应码率简单工作原理
- Master 主索引里面每一条子流都写 BANDWIDTH,单位 bps,代表这套码率理论带宽。
- hls.js 在下载 TS 分片的时候,统计每个分片下载耗时,计算出实际可用带宽。
- 对比实际带宽和各个子流 BANDWIDTH 数值,选择一个合适档位。
- 网络变差,向下切低码率;网络恢复,再向上切高码率。
关键点:Master 索引里面 BANDWIDTH 数值不能乱写,如果写的和真实码率差距很大,ABR 判断就会完全错乱。
三、自适应码率高频异常现象与根因
现象 1:网络已经很差,持续卡顿,播放器依旧不切低清
根因:Master 索引 BANDWIDTH 写的偏小,播放器误以为超清码率需要带宽不高,继续尝试加载高清分片,持续卡顿。
现象 2:网速很好,一直停留在标清,不会自动升到高清
根因:BANDWIDTH 写的过大;或者高清子流分片加载经常超时,播放器判定高清不可用,一直不升级档位。
现象 3:手动切换清晰度正常,自动 ABR 切换异常
手动点切换按钮可以正常切,自动切换行为异常。大概率 Master 的 BANDWIDTH 参数配置问题,优先检查 M3U8 文本。
现象 4:切换某一档子流直接黑屏
手动或者自动切到特定档位就黑屏,说明该路子 M3U8 子流本身存在 404、跨域、编码兼容故障,不是 ABR 算法问题。
四、简单标准化排查步骤
第一步,Master 主索引粘贴网页调试工具,查看原始 M3U8 文本,核对每一条#EXT‑X‑STREAM‑INF里面 BANDWIDTH 带宽数值,确认和真实码率接近。
- 如果工具环境下,自适应切换行为就异常:优先排查 Master 索引、子 M3U8 子流资源;
- 如果工具自适应切换正常,业务页面异常:排查业务 hls.js ABR 配置参数。
第二步,手动挨个切换全部清晰度档位,确认每一档都可以正常播放。如果某一档切换黑屏,优先修复该路子流。
第三步,浏览器开启网络节流,模拟 3G 弱网,观察自动降级行为。
五、开发调优注意点
- Master 索引 BANDWIDTH 尽量填写真实码率,不要随便估算乱写,这是 ABR 正常工作的基础。
- 至少保证有一路 H.264 兜底子码率,防止切换到 HEVC 编码出现浏览器解码失败。
- 不要盲目修改 hls.js 的 abr 带宽阈值参数,优先确认 M3U8 多码率资源本身是否合格。
- 产品交互上最好给用户提供手动强制选择清晰度的入口,用户可以关闭自动自适应,手动锁定档位。
六、总结
ABR 自适应码率不是只靠前端播放器参数调节,Master 主索引中 BANDWIDTH 带宽数值是否真实、各路子码率流是否正常,对自动切换的影响非常大。遇到自适应表现不符合预期,不要上来就疯狂修改播放器参数。借助网页调试工具,先确认 Master 索引、各路子流播放情况,再去调整前端配置,可以少做很多无效调参。