From cd37b3d7915a9974184a3541f41e060cb6fc11c6 Mon Sep 17 00:00:00 2001 From: xiaosi <2652281683@qq.com> Date: Wed, 2 Sep 2026 13:17:42 +0800 Subject: [PATCH] fix: harden LivePlayer HLS attach races --- src/components/LivePlayer.vue | 46 ++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/components/LivePlayer.vue b/src/components/LivePlayer.vue index f38fb99..7e34fcf 100644 --- a/src/components/LivePlayer.vue +++ b/src/components/LivePlayer.vue @@ -103,31 +103,39 @@ async function attachPlayer(url) { return } - const { default: Hls } = await import('hls.js') - if (seq !== attachSeq) return - if (!Hls.isSupported()) { - emit('error') - return - } - - hls = new Hls({ enableWorker: true, lowLatencyMode: true }) - hls.on(Hls.Events.ERROR, (_event, data) => { - if (seq !== attachSeq) return - if (data?.fatal) emit('error') - }) - hls.loadSource(url) - hls.attachMedia(video) - hls.on(Hls.Events.MANIFEST_PARSED, () => { + try { + const { default: Hls } = await import('hls.js') if (seq !== attachSeq) return - video.play().catch(() => {}) - }) + if (!Hls.isSupported()) { + emit('error') + return + } + + hls = new Hls({ enableWorker: true, lowLatencyMode: true }) + hls.on(Hls.Events.ERROR, (_event, data) => { + if (seq !== attachSeq) return + if (data?.fatal) emit('error') + }) + hls.loadSource(url) + hls.attachMedia(video) + hls.on(Hls.Events.MANIFEST_PARSED, () => { + if (seq !== attachSeq) return + video.play().catch(() => {}) + }) + } catch (_) { + if (seq === attachSeq) emit('error') + } } watch( () => props.playUrl, (url) => { - if (playable.value) attachPlayer(url) - else destroyPlayer() + if (playable.value) { + attachPlayer(url).catch(() => {}) + } else { + attachSeq += 1 + destroyPlayer() + } }, { immediate: true } )