|  | @ -1645,85 +1645,143 @@ export default { | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 添加延迟确保音频状态完全清理 |  |  | // 添加延迟确保音频状态完全清理 | 
														
													
														
															
																|  |  | setTimeout(() => { |  |  | setTimeout(() => { | 
														
													
														
															
																|  |  |  |  |  | try { | 
														
													
														
															
																|  |  |  |  |  | // 检查音频数据有效性 | 
														
													
														
															
																|  |  |  |  |  | if (!this.currentPageAudios || this.currentPageAudios.length === 0) { | 
														
													
														
															
																|  |  |  |  |  | console.warn('🎵 onAudioEnded: 没有音频数据'); | 
														
													
														
															
																|  |  |  |  |  | this.isProcessingEnded = false; | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | if (this.currentAudioIndex < this.currentPageAudios.length - 1) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | let currentAudioData = this.currentPageAudios[this.currentAudioIndex]; |  |  |  | 
														
													
														
															
																|  |  | // 检查当前音频的 isLead 状态 |  |  |  | 
														
													
														
															
																|  |  | if (currentAudioData && !currentAudioData.isLead) { |  |  |  | 
														
													
														
															
																|  |  | console.log('🎵 playAudio: 当前音频 isLead=false,检查是否需要跳过 isLead=true 的音频'); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (this.currentAudioIndex < this.currentPageAudios.length - 1) { | 
														
													
														
															
																|  |  |  |  |  | // 还有下一个音频,继续播放 | 
														
													
														
															
																|  |  |  |  |  | let currentAudioData = this.currentPageAudios[this.currentAudioIndex]; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 从当前索引开始,跳过所有 isLead=true 的音频 |  |  |  | 
														
													
														
															
																|  |  | let nextIndex = this.currentAudioIndex; |  |  |  | 
														
													
														
															
																|  |  | while (nextIndex < (this.currentPageAudios.length - 1)) { |  |  |  | 
														
													
														
															
																|  |  | const audioData = this.currentPageAudios[nextIndex + 1]; |  |  |  | 
														
													
														
															
																|  |  | if (audioData && audioData.isLead == true) { |  |  |  | 
														
													
														
															
																|  |  | console.log(`🎵 playAudio: 跳过 isLead=true 的音频,索引=${nextIndex}`); |  |  |  | 
														
													
														
															
																|  |  | nextIndex++; |  |  |  | 
														
													
														
															
																|  |  | } else { |  |  |  | 
														
													
														
															
																|  |  | break; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 检查当前音频的 isLead 状态 | 
														
													
														
															
																|  |  |  |  |  | if (currentAudioData && !currentAudioData.isLead) { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 onAudioEnded: 当前音频 isLead=false,检查是否需要跳过 isLead=true 的音频'); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 从当前索引开始,跳过所有 isLead=true 的音频 | 
														
													
														
															
																|  |  |  |  |  | let nextIndex = this.currentAudioIndex; | 
														
													
														
															
																|  |  |  |  |  | while (nextIndex < (this.currentPageAudios.length - 1)) { | 
														
													
														
															
																|  |  |  |  |  | const audioData = this.currentPageAudios[nextIndex + 1]; | 
														
													
														
															
																|  |  |  |  |  | if (audioData && audioData.isLead == true) { | 
														
													
														
															
																|  |  |  |  |  | console.log(`🎵 onAudioEnded: 跳过 isLead=true 的音频,索引=${nextIndex + 1}`); | 
														
													
														
															
																|  |  |  |  |  | nextIndex++; | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | break; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 更新当前音频索引 |  |  |  | 
														
													
														
															
																|  |  | if (nextIndex !== this.currentAudioIndex) { |  |  |  | 
														
													
														
															
																|  |  | this.currentAudioIndex = nextIndex; |  |  |  | 
														
													
														
															
																|  |  | console.log(`🎵 playAudio: 跳过后的新索引=${this.currentAudioIndex}`); |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 检查新索引是否有效 |  |  |  | 
														
													
														
															
																|  |  | if (this.currentAudioIndex >= this.currentPageAudios.length) { |  |  |  | 
														
													
														
															
																|  |  | console.log('🎵 playAudio: 跳过后已到达音频列表末尾'); |  |  |  | 
														
													
														
															
																|  |  | return; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 更新当前音频索引 | 
														
													
														
															
																|  |  |  |  |  | if (nextIndex !== this.currentAudioIndex) { | 
														
													
														
															
																|  |  |  |  |  | this.currentAudioIndex = nextIndex; | 
														
													
														
															
																|  |  |  |  |  | console.log(`🎵 onAudioEnded: 跳过后的新索引=${this.currentAudioIndex}`); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 检查新索引是否有效 | 
														
													
														
															
																|  |  |  |  |  | if (this.currentAudioIndex >= this.currentPageAudios.length - 1) { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 onAudioEnded: 跳过后已到达音频列表末尾,进入播放完毕逻辑'); | 
														
													
														
															
																|  |  |  |  |  | // 跳转到播放完毕的逻辑 | 
														
													
														
															
																|  |  |  |  |  | this.handlePlaybackComplete(); | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 播放下一个音频 |  |  |  | 
														
													
														
															
																|  |  | this.currentAudioIndex++; |  |  |  | 
														
													
														
															
																|  |  | console.log(`🎵 onAudioEnded: 准备播放下一个音频,索引=${this.currentAudioIndex}`, this.currentPageAudios); |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 确保音频数据有效 |  |  |  | 
														
													
														
															
																|  |  | const nextAudio = this.currentPageAudios[this.currentAudioIndex]; |  |  |  | 
														
													
														
															
																|  |  | if (nextAudio && nextAudio.url) { |  |  |  | 
														
													
														
															
																|  |  | this.playAudio(); |  |  |  | 
														
													
														
															
																|  |  | } else { |  |  |  | 
														
													
														
															
																|  |  | console.error('🎵 onAudioEnded: 下一个音频数据无效', nextAudio); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 移动到下一个音频索引 | 
														
													
														
															
																|  |  |  |  |  | this.currentAudioIndex++; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 确保索引在有效范围内 | 
														
													
														
															
																|  |  |  |  |  | if (this.currentAudioIndex >= this.currentPageAudios.length) { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 onAudioEnded: 索引超出范围,进入播放完毕逻辑'); | 
														
													
														
															
																|  |  |  |  |  | this.handlePlaybackComplete(); | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 滚动到下一段音频对应的文字 |  |  |  | 
														
													
														
															
																|  |  | // setTimeout(() => { |  |  |  | 
														
													
														
															
																|  |  | //   this.scrollToCurrentAudio(); |  |  |  | 
														
													
														
															
																|  |  | // }, 300); // 延迟300ms确保音频切换完成 |  |  |  | 
														
													
														
															
																|  |  |  |  |  | console.log(`🎵 onAudioEnded: 准备播放下一个音频,索引=${this.currentAudioIndex}`); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | } else { |  |  |  | 
														
													
														
															
																|  |  | // 所有音频播放完毕 |  |  |  | 
														
													
														
															
																|  |  | console.log('🎵 onAudioEnded: 所有音频播放完毕'); |  |  |  | 
														
													
														
															
																|  |  | if (this.isLoop) { |  |  |  | 
														
													
														
															
																|  |  | // 循环播放 |  |  |  | 
														
													
														
															
																|  |  | this.currentAudioIndex = 0; |  |  |  | 
														
													
														
															
																|  |  | console.log('🎵 onAudioEnded: 循环播放,重置索引为0'); |  |  |  | 
														
													
														
															
																|  |  | this.playAudio(); |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 滚动到第一段音频对应的文字 |  |  |  | 
														
													
														
															
																|  |  | // setTimeout(() => { |  |  |  | 
														
													
														
															
																|  |  | //   this.scrollToCurrentAudio(); |  |  |  | 
														
													
														
															
																|  |  | // }, 300); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 确保音频数据有效 | 
														
													
														
															
																|  |  |  |  |  | const nextAudio = this.currentPageAudios[this.currentAudioIndex]; | 
														
													
														
															
																|  |  |  |  |  | if (nextAudio && nextAudio.url) { | 
														
													
														
															
																|  |  |  |  |  | this.playAudio(); | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | console.error('🎵 onAudioEnded: 下一个音频数据无效', nextAudio); | 
														
													
														
															
																|  |  |  |  |  | // 如果下一个音频无效,尝试播放再下一个 | 
														
													
														
															
																|  |  |  |  |  | this.findAndPlayNextValidAudio(); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | } else { |  |  | } else { | 
														
													
														
															
																|  |  | // 停止播放 |  |  |  | 
														
													
														
															
																|  |  | this.isPlaying = false; |  |  |  | 
														
													
														
															
																|  |  | this.currentTime = this.totalTime; |  |  |  | 
														
													
														
															
																|  |  | this.currentHighlightIndex = -1; |  |  |  | 
														
													
														
															
																|  |  | this.$emit('highlight-change', -1); |  |  |  | 
														
													
														
															
																|  |  | console.log('🎵 onAudioEnded: 播放完毕,停止播放'); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 所有音频播放完毕 | 
														
													
														
															
																|  |  |  |  |  | this.handlePlaybackComplete(); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } catch (error) { | 
														
													
														
															
																|  |  |  |  |  | console.error('🎵 onAudioEnded: 处理过程中发生错误', error); | 
														
													
														
															
																|  |  |  |  |  | } finally { | 
														
													
														
															
																|  |  |  |  |  | // 重置防抖标志 | 
														
													
														
															
																|  |  |  |  |  | this.isProcessingEnded = false; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 重置防抖标志 |  |  |  | 
														
													
														
															
																|  |  | this.isProcessingEnded = false; |  |  |  | 
														
													
														
															
																|  |  | }, 50); // 添加50ms延迟确保状态清理完成 |  |  | }, 50); // 添加50ms延迟确保状态清理完成 | 
														
													
														
															
																|  |  | }, |  |  | }, | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 处理播放完毕的逻辑 | 
														
													
														
															
																|  |  |  |  |  | handlePlaybackComplete() { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 handlePlaybackComplete: 所有音频播放完毕'); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (this.isLoop) { | 
														
													
														
															
																|  |  |  |  |  | // 循环播放 | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 handlePlaybackComplete: 循环播放,重置索引为0'); | 
														
													
														
															
																|  |  |  |  |  | this.currentAudioIndex = 0; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 确保第一个音频有效 | 
														
													
														
															
																|  |  |  |  |  | const firstAudio = this.currentPageAudios[0]; | 
														
													
														
															
																|  |  |  |  |  | if (firstAudio && firstAudio.url) { | 
														
													
														
															
																|  |  |  |  |  | this.playAudio(); | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | console.error('🎵 handlePlaybackComplete: 第一个音频数据无效,停止循环播放'); | 
														
													
														
															
																|  |  |  |  |  | this.stopPlayback(); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | // 停止播放 | 
														
													
														
															
																|  |  |  |  |  | this.stopPlayback(); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | }, | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 停止播放的逻辑 | 
														
													
														
															
																|  |  |  |  |  | stopPlayback() { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 stopPlayback: 播放完毕,停止播放'); | 
														
													
														
															
																|  |  |  |  |  | this.isPlaying = false; | 
														
													
														
															
																|  |  |  |  |  | this.currentTime = this.totalTime; | 
														
													
														
															
																|  |  |  |  |  | this.currentHighlightIndex = -1; | 
														
													
														
															
																|  |  |  |  |  | this.$emit('highlight-change', -1); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 通知父组件音频状态变化 | 
														
													
														
															
																|  |  |  |  |  | this.$emit('audio-state-change', { | 
														
													
														
															
																|  |  |  |  |  | hasAudioData: this.hasAudioData, | 
														
													
														
															
																|  |  |  |  |  | isLoading: false, | 
														
													
														
															
																|  |  |  |  |  | currentHighlightIndex: -1 | 
														
													
														
															
																|  |  |  |  |  | }); | 
														
													
														
															
																|  |  |  |  |  | }, | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 查找并播放下一个有效的音频 | 
														
													
														
															
																|  |  |  |  |  | findAndPlayNextValidAudio() { | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 findAndPlayNextValidAudio: 查找下一个有效音频'); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 从当前索引开始查找有效音频 | 
														
													
														
															
																|  |  |  |  |  | for (let i = this.currentAudioIndex + 1; i < this.currentPageAudios.length; i++) { | 
														
													
														
															
																|  |  |  |  |  | const audio = this.currentPageAudios[i]; | 
														
													
														
															
																|  |  |  |  |  | if (audio && audio.url) { | 
														
													
														
															
																|  |  |  |  |  | console.log(`🎵 findAndPlayNextValidAudio: 找到有效音频,索引=${i}`); | 
														
													
														
															
																|  |  |  |  |  | this.currentAudioIndex = i; | 
														
													
														
															
																|  |  |  |  |  | this.playAudio(); | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // 没有找到有效音频,播放完毕 | 
														
													
														
															
																|  |  |  |  |  | console.log('🎵 findAndPlayNextValidAudio: 没有找到有效音频,播放完毕'); | 
														
													
														
															
																|  |  |  |  |  | this.handlePlaybackComplete(); | 
														
													
														
															
																|  |  |  |  |  | }, | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // 滚动到当前播放音频对应的文字 |  |  | // 滚动到当前播放音频对应的文字 | 
														
													
														
															
																|  |  | // scrollToCurrentAudio() { |  |  | // scrollToCurrentAudio() { | 
														
													
														
															
																|  |  | //   try { |  |  | //   try { | 
														
													
												
													
														
															
																|  | 
 |