You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.4 KiB
5.4 KiB
监控直播播放稳定(卡顿 / 花屏 / 重连)
日期:2026-09-03
状态:已确认(待写实现计划)
范围:仅前端 laic-frontend
1. 背景与证据
dock-1 现网可开播、可出 HLS 分片,但观感为卡顿 / 花屏 / 经常重连。API + 拉流实测要点:
- join 后约 8–12s 到
phase=streaming,deviceStreaming=true,cloudOnline=true。 GET /play-url现网返回http://vpull.jiagutech.com/...m3u8(本地后端源码期望https://)。https://vpull.jiagutech.comTLS handshake failure(无 peer certificate);站点本身也是 HTTP。- 刚进入 streaming 时 m3u8 常先 404,数秒后才有清单;首份清单常见
#EXT-X-DISCONTINUITY。 - 分片时长约
5.9s–12s,TARGETDURATION9–12 —— 普通 HLS,不是低延迟流。 - 前端
LivePlayer当前:lowLatencyMode: true,fragLoadingMaxRetry: 1,启动 404 窗口约 15s。 - join 后立刻 heartbeat 偶发
57006(租约不存在或已过期),前端会rejoinAfterLeaseInvalid→ 整段重开。
用户确认:能出画面,但卡顿 / 花屏 / 经常重连。本轮只改前端。
2. 目标
- 启动更稳:streaming 后短时 404 不直接失败;允许「等待流就绪」后出画。
- 播放中少重建:普通分片抖动 / 短暂网络错尽量在播放器内恢复,避免动辄
refreshPlayURL→ 整实例重建。 - 保留明确致命路径:TLS / CORS / 403 仍明确失败,不瞎刷 play-url。
3. 非目标
- 不改后端租约实现、stop grace、阿里云证书 / 播流域名。
- 不把
http://playUrl 强改https://(现网 https 不可用,改写会更糟)。 - 不改 Media 页、多路同屏、WebRTC / FLV。
- 不改停止确认框、join busy 重试等已合并行为(仅回归验证)。
4. 方案(稳播优先)
职责不变:LivePlayer 管媒体;useMonitorLive 管会话 / 租约 / play-url 续期。
4.1 LivePlayer.vue
new Hls配置改为普通直播友好:lowLatencyMode: falsemanifestLoadingMaxRetry: 2levelLoadingMaxRetry: 2fragLoadingMaxRetry: 4- 为上述重试设置合理 delay(与 hls.js 默认同量级即可,避免 0 间隔打爆 CDN)
- 启动 404 / manifest 未就绪窗口加长:
- 现:
STARTUP_RETRY_DELAYS_MS = [500,1000,2000,4000],STARTUP_WINDOW_MS = 15_000 - 改:
[500,1000,2000,4000,6000,8000],STARTUP_WINDOW_MS = 30_000 - 行为不变:窗口内同 URL 退避重建,不请求
/play-url
- 现:
- 错误分级:
- TLS / CORS / certificate / mixed content →
SecurityErrorfatal(已有) - HTTP 403 → fatal(已有)
- 启动窗口内 404 /
MANIFEST_LOAD_ERROR→ 同 URL 重试;耗尽再 fatal - 其它 fatal:若 hls 提供
recoverMediaError且错误类型适合,先尝试一次自愈;仍失败再emit('error')
- TLS / CORS / certificate / mixed content →
AbortError/NotAllowedError/ 用户手势恢复路径保持不变。
4.2 useMonitorLive.js
onPlayError收敛:AbortError/NotAllowedError:忽略(已有)recoverable === true:忽略(已有)57006:仍rejoinAfterLeaseInvalid()- TLS / 403:
markPlayFatal,不refreshPlayURL(已有) - 启动耗尽后的
HlsError(含持续 404):markPlayFatal(已有语义) - 其余非致命媒体错:仅在 LivePlayer 明确 fatal 且非 TLS/403 时,有限次
refreshPlayURL(保留PLAY_RETRY_MAX = 3,fromRetry: true不重置计数)
- 不改本轮:
- 心跳调度公式(仍约
lease/2) - phase 轮询间隔 / 超时
- stop / leave / join busy 重试
- 心跳调度公式(仍约
4.3 文件
| 文件 | 变更 |
|---|---|
src/components/LivePlayer.vue |
HLS 配置、启动窗口、有限自愈 |
src/composables/useMonitorLive.js |
onPlayError 注释与分支收紧(行为按上表) |
| 本 spec | 设计文档 |
5. 错误处理(汇总)
| 情况 | 处理 |
|---|---|
| 启动期 m3u8 404 | LivePlayer 同 URL 退避;不刷 play-url |
| 播放中 frag 短暂失败 | hls 重试 / recover;不立刻 rebuild |
| playUrl 临期 | 仍按 expiresAt - 30s 续期(已有) |
| 57006 | leave 本地态后重新 join |
| TLS / 403 | toast 明确原因;停止刷 URL |
| 启动窗口耗尽仍失败 | toast 播放失败;保留会话心跳与否沿用现逻辑(markPlayFatal 清 playUrl,不强制 leave) |
6. 验收
对 dock-1(或同等可推流机巢):
- 打开直播:可出现短暂「正在等待直播流就绪」,最终出画;不因首包 404 直接失败。
- 连续播放约 1–2 分钟:无明显「整段黑屏闪断式」频繁重建。
- 停止弹窗点取消:只关弹窗,不
POST /stop(回归)。 - 人为 TLS/403 类错误(若可模拟)仍提示致命信息,不循环刷 play-url。
npm run build通过。
7. 风险与后续
- 证书 / http playUrl:站点若日后上 HTTPS,现网 http 拉流会 Mixed Content;需后端改回 https 并修复
vpull证书。不在本轮。 - 57006 根因:属后端租约时序;前端 rejoin 是兜底,可能仍偶发一次重开。
- 上行抖动:机巢 / SRT 断续导致的 DISCONTINUITY 无法单靠前端消除,只能降低播放器过激反应。
8. 实现顺序
- 改
LivePlayerHLS 配置 + 启动窗口 - 收紧
onPlayError注释 / 分支(若代码已基本符合则只补缺口) - build + 现网 dock-1 冒烟
- commit / 部署