Browse Source

fix: guard LivePlayer media recover to one attempt

main
xiaosi 2 weeks ago
parent
commit
42fd09ee74
  1. 7
      src/components/LivePlayer.vue

7
src/components/LivePlayer.vue

@ -70,6 +70,7 @@ let startupRetryTimer = null
let startupRetryCount = 0
let startupStartedAt = 0
let activeUrl = ''
let mediaRecoverAttempted = false
const playable = computed(() => props.playUrl && !props.playUrl.startsWith('fake://'))
const isLiveShell = computed(() => props.active && !playable.value)
@ -128,6 +129,7 @@ function clearMediaListeners() {
function destroyPlayer() {
clearMediaListeners()
mediaRecoverAttempted = false
needsUserPlay.value = false
if (hls) {
hls.destroy()
@ -259,6 +261,7 @@ async function attachPlayer(url, { seq: existingSeq } = {}) {
startupRetryCount = 0
startupStartedAt = Date.now()
waitingForStream.value = false
mediaRecoverAttempted = false
}
activeUrl = url || ''
@ -371,6 +374,8 @@ async function attachPlayer(url, { seq: existingSeq } = {}) {
}
if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {
if (!mediaRecoverAttempted) {
mediaRecoverAttempted = true
try {
console.warn('[live-player] hls media fatal, recover once', data)
hls.recoverMediaError()
@ -379,6 +384,8 @@ async function attachPlayer(url, { seq: existingSeq } = {}) {
console.warn('[live-player] hls recover failed', recoverErr)
}
}
// already attempted or recover threw fall through to emitFatal
}
console.warn('[live-player] hls fatal', data)
emitFatal(buildPlayError({

Loading…
Cancel
Save