hls.js如何配置实现直播禁止倒退但允许时移暂停功能
hls.js 直播场景适配配置
最优方案(同时满足全部3项需求)
适用hls.js 1.4.0及以上稳定版本,配置如下:
const hlsLiveConfig = { // 标记直播流模式 isLive: true, // 适配需求1:启动直接定位最新直播边缘 startPosition: -1, // 传负数代表从流的末尾位置启动加载,无需拉取历史分片 liveSyncDurationCount: 3, // 保持和直播边缘差3个分片的缓冲距离,平衡低延迟和抗卡顿能力 // 适配需求2:禁止倒退seek到历史缓存 maxSeekableLength: 0, // 向浏览器上报的可seek范围长度为0,从底层拦截所有跳转到历史位置的seek请求 // 适配需求3:支持暂停后续播 liveBackBufferLength: 1800, // 保留最多30分钟的向后缓存(和直播缓存窗口匹配),暂停时不会清理已缓冲内容 maxBufferLength: 30, // 向前最多缓冲30秒内容,避免冗余内存占用 lowLatencyMode: false, // 关闭低延迟模式下的自动追帧逻辑,避免暂停恢复后被强制拉回边缘 }
配置生效注意事项:
- 前端播放器UI层需要同步禁用进度条拖动交互,避免用户操作触发无效seek,和底层配置形成双重拦截
- 不要开启
liveSyncOnStall相关的自动追帧配置,否则暂停时间过长恢复时会被强制跳转到最新边缘,断点续看失效 - 该配置下用户暂停后,已缓冲到本地的分片会被保留,恢复播放时直接从暂停位置继续解码播放,不会自动跳转
降级方案(放弃暂停续看能力,恢复即跳最新边缘)
如果使用的hls.js版本较低,或者最优方案出现seek拦截失效、缓存异常清理的问题,使用该方案:
const hlsFallbackConfig = { isLive: true, startPosition: -1, liveSyncDurationCount: 3, maxSeekableLength: 0, // 降级核心逻辑 backBufferLength: 0, // 不保留播放过的历史分片,从底层消除可回看的内容基础 liveSync: true, // 开启强制直播同步 liveMaxLatencyDurationCount: 10, // 播放位置距离边缘超过10个分片时自动追帧到最新位置 }
配置说明:
- 该配置下用户暂停恢复播放时,会自动丢弃旧缓冲,直接拉取最新的直播分片从边缘位置开始播放
- 启动定位最新点、禁止倒退seek的能力不受影响,满足核心的前两项要求
测试提示:如果是m3u8列表返回的
EXT-X-ENDLIST标记异常,会导致hls.js误判为点播流,所有直播相关配置都会失效,需要先保证源流的m3u8格式符合直播规范。
内容的提问来源于stack exchange,提问作者cadavre
相关产品推荐
相关产品推荐

