From 7bb632f9a9a5c1a134d4900d37fcc821b8be6dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=A0?= <2091066548@qq.com> Date: Fri, 29 Aug 2025 18:28:49 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9Ahls=E4=BC=A0=E6=92=AD=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/course/DPlayerVideo.vue | 66 ++++++++++++++++---------- src/views/CourseExchanged.vue | 7 ++- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/components/course/DPlayerVideo.vue b/src/components/course/DPlayerVideo.vue index 30f13af..bf97d14 100644 --- a/src/components/course/DPlayerVideo.vue +++ b/src/components/course/DPlayerVideo.vue @@ -286,11 +286,33 @@ const initializePlayer = async (videoUrl?: string) => { }) player.on('error', (error: any) => { - console.error('DPlayer 播放错误:', error) + // 检查是否为无害的错误 + const isHarmlessError = ( + !error.message || // 没有错误消息通常是无害的 + error.message === undefined || + (player && player.video && !player.video.error) // 播放器本身没有错误 + ) + + if (isHarmlessError && player && player.video && player.video.readyState > 0) { + console.warn('⚠️ 检测到可能的假阳性错误,但视频仍可播放:', { + type: error.type, + message: error.message, + url: url, + videoReadyState: player.video.readyState, + videoPaused: player.video.paused + }) + // 不触发错误事件,因为视频实际上是可以播放的 + return + } + + console.error('❌ DPlayer 播放错误:', error) console.error('错误详情:', { type: error.type, message: error.message, - url: url + url: url, + videoError: player?.video?.error, + networkState: player?.video?.networkState, + readyState: player?.video?.readyState }) emit('error', error) }) @@ -442,7 +464,8 @@ const switchQuality = (quality: any) => { from: getCurrentQualityLabel(), to: quality.label, currentTime: currentTime, - wasPlaying: wasPlaying + wasPlaying: wasPlaying, + newUrl: quality.url }) // 暂停播放 @@ -450,37 +473,30 @@ const switchQuality = (quality: any) => { player.pause() } - // 切换视频源 - if (typeof player.switchVideo === 'function') { - player.switchVideo({ - url: quality.url, - type: 'auto' - }) + // 销毁当前播放器 + if (player) { + player.destroy() + player = null + } - // 恢复播放状态 + // 重新初始化播放器使用新的URL + initializePlayer(quality.url).then(() => { + console.log('✅ 播放器重新初始化完成,新URL:', quality.url) + // 恢复播放时间 setTimeout(() => { if (player && player.video) { player.seek(currentTime) if (wasPlaying) { player.play() } + console.log('✅ 恢复播放状态:', { currentTime, wasPlaying }) } - }, 1000) - } else { - // 重新初始化播放器 - initializePlayer(quality.url).then(() => { - // 恢复播放时间 - setTimeout(() => { - if (player && player.video) { - player.seek(currentTime) - if (wasPlaying) { - player.play() - } - } - }, 500) - }) - } + }, 500) + }).catch(error => { + console.error('❌ 重新初始化播放器失败:', error) + }) + // 通知父组件清晰度已切换 emit('qualityChange', quality.value) console.log('✅ 切换清晰度到:', quality.label) } catch (error) { diff --git a/src/views/CourseExchanged.vue b/src/views/CourseExchanged.vue index 1b95b10..9715f8f 100644 --- a/src/views/CourseExchanged.vue +++ b/src/views/CourseExchanged.vue @@ -75,6 +75,7 @@ @error="onVideoError" @screenshot="onScreenshot" @danmaku-send="onDanmakuSend" + @qualityChange="onQualityChange" />