mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-14 06:30:49 +08:00
feat: 优化预加载逻辑和继续播放功能
This commit is contained in:
@@ -682,14 +682,19 @@ class AudioService {
|
||||
if (isHotSwap) {
|
||||
console.log('audioService: 执行无缝切换');
|
||||
|
||||
// 1. 获取当前播放进度
|
||||
let currentPos = 0;
|
||||
if (this.currentSound) {
|
||||
currentPos = this.currentSound.seek() as number;
|
||||
// 1. 获取当前播放进度或使用指定的 seekTime
|
||||
let targetPos = 0;
|
||||
if (seekTime > 0) {
|
||||
// 如果有指定的 seekTime(如恢复播放进度),优先使用
|
||||
targetPos = seekTime;
|
||||
console.log(`audioService: 使用指定的 seekTime: ${seekTime}s`);
|
||||
} else if (this.currentSound) {
|
||||
// 否则同步当前进度
|
||||
targetPos = this.currentSound.seek() as number;
|
||||
}
|
||||
|
||||
// 2. 同步新音频进度
|
||||
newSound.seek(currentPos);
|
||||
newSound.seek(targetPos);
|
||||
|
||||
// 3. 初始化新音频的 EQ
|
||||
await this.disposeEQ(true);
|
||||
@@ -711,7 +716,7 @@ class AudioService {
|
||||
this.currentTrack = track;
|
||||
this.pendingSound = null;
|
||||
|
||||
console.log(`audioService: 无缝切换完成,进度同步至 ${currentPos}s`);
|
||||
console.log(`audioService: 无缝切换完成,进度同步至 ${targetPos}s`);
|
||||
} else {
|
||||
// 普通加载逻辑
|
||||
await this.setupEQ(newSound);
|
||||
|
||||
@@ -113,6 +113,21 @@ class PreloadService {
|
||||
return this.preloadedSounds.get(songId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗(使用)已预加载的音频
|
||||
* 从缓存中移除但不 unload(由调用方管理生命周期)
|
||||
* @returns 预加载的 Howl 实例,如果没有则返回 undefined
|
||||
*/
|
||||
public consume(songId: string | number): Howl | undefined {
|
||||
const sound = this.preloadedSounds.get(songId);
|
||||
if (sound) {
|
||||
this.preloadedSounds.delete(songId);
|
||||
console.log(`[PreloadService] 消耗预加载的歌曲: ${songId}`);
|
||||
return sound;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理所有预加载资源
|
||||
*/
|
||||
|
||||
@@ -337,8 +337,15 @@ export const usePlayerCoreStore = defineStore(
|
||||
// 检查保存的进度
|
||||
let initialPosition = 0;
|
||||
const savedProgress = JSON.parse(localStorage.getItem('playProgress') || '{}');
|
||||
console.log(
|
||||
'[playAudio] 读取保存的进度:',
|
||||
savedProgress,
|
||||
'当前歌曲ID:',
|
||||
playMusic.value.id
|
||||
);
|
||||
if (savedProgress.songId === playMusic.value.id) {
|
||||
initialPosition = savedProgress.progress;
|
||||
console.log('[playAudio] 恢复播放进度:', initialPosition);
|
||||
}
|
||||
|
||||
// B站视频URL检查
|
||||
@@ -371,12 +378,21 @@ export const usePlayerCoreStore = defineStore(
|
||||
}
|
||||
}
|
||||
|
||||
// 使用 PreloadService 加载音频
|
||||
// 这将确保如果正在进行预加载修复,我们会等待它完成
|
||||
// 同时也处理了时长检查和自动修复逻辑
|
||||
// 使用 PreloadService 获取音频
|
||||
// 优先使用已预加载的 sound(通过 consume 获取并从缓存中移除)
|
||||
// 如果没有预加载,则进行加载
|
||||
let sound: Howl;
|
||||
try {
|
||||
sound = await preloadService.load(playMusic.value);
|
||||
// 先尝试消耗预加载的 sound
|
||||
const preloadedSound = preloadService.consume(playMusic.value.id);
|
||||
if (preloadedSound && preloadedSound.state() === 'loaded') {
|
||||
console.log(`[playAudio] 使用预加载的音频: ${playMusic.value.name}`);
|
||||
sound = preloadedSound;
|
||||
} else {
|
||||
// 没有预加载或预加载状态不正常,需要加载
|
||||
console.log(`[playAudio] 没有预加载,开始加载: ${playMusic.value.name}`);
|
||||
sound = await preloadService.load(playMusic.value);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('PreloadService 加载失败:', error);
|
||||
// 如果 PreloadService 失败,尝试直接播放作为回退
|
||||
|
||||
Reference in New Issue
Block a user