添加音频加载失败重新加载

This commit is contained in:
kron
2025-08-29 10:41:25 +08:00
parent 3c414afd82
commit a1942697e7

View File

@@ -55,39 +55,90 @@ class AudioManager {
constructor() {
this.audioMap = new Map();
this.currentPlayingKey = null; // 记录当前播放的音频key
this.retryCount = new Map(); // 记录每个音频的重试次数
this.maxRetries = 3; // 最大重试次数
this.retryDelay = 1000; // 重试延迟时间(毫秒)
this.initAudios();
}
// 初始化音频
initAudios() {
Object.keys(audioFils).forEach((key) => {
const audio = uni.createInnerAudioContext();
audio.src = audioFils[key];
audio.autoplay = false;
// 监听加载状态
audio.onCanplay(() => {
// console.log(`音频 ${key} 已加载完成`);
});
audio.onError((res) => {
console.log(`音频 ${key} 加载失败:`, res.errMsg);
});
// 监听播放结束事件
audio.onEnded(() => {
if (this.currentPlayingKey === key) {
this.currentPlayingKey = null;
}
});
// 监听播放停止事件
audio.onStop(() => {
if (this.currentPlayingKey === key) {
this.currentPlayingKey = null;
}
});
this.audioMap.set(key, audio);
this.createAudio(key);
});
}
// 创建单个音频实例
createAudio(key) {
const audio = uni.createInnerAudioContext();
audio.src = audioFils[key];
audio.autoplay = false;
// 监听加载状态
audio.onCanplay(() => {
// console.log(`音频 ${key} 已加载完成`);
// 加载成功后重置重试计数
this.retryCount.set(key, 0);
});
audio.onError((res) => {
console.log(`音频 ${key} 加载失败:`, res.errMsg);
this.handleAudioError(key);
});
// 监听播放结束事件
audio.onEnded(() => {
if (this.currentPlayingKey === key) {
this.currentPlayingKey = null;
}
});
// 监听播放停止事件
audio.onStop(() => {
if (this.currentPlayingKey === key) {
this.currentPlayingKey = null;
}
});
this.audioMap.set(key, audio);
// 初始化重试计数
if (!this.retryCount.has(key)) {
this.retryCount.set(key, 0);
}
}
// 处理音频加载错误
handleAudioError(key) {
const currentRetries = this.retryCount.get(key) || 0;
if (currentRetries < this.maxRetries) {
// 增加重试计数
this.retryCount.set(key, currentRetries + 1);
console.log(`音频 ${key} 开始第 ${currentRetries + 1} 次重试...`);
// 延迟重试
setTimeout(() => {
this.retryLoadAudio(key);
}, this.retryDelay);
} else {
console.error(`音频 ${key} 重试 ${this.maxRetries} 次后仍然失败,停止重试`);
}
}
// 重新加载音频
retryLoadAudio(key) {
// 销毁旧的音频实例
const oldAudio = this.audioMap.get(key);
if (oldAudio) {
oldAudio.destroy();
}
// 创建新的音频实例
this.createAudio(key);
}
// 播放指定音频
play(key) {
// 如果有正在播放的音频,先停止
@@ -97,8 +148,23 @@ class AudioManager {
const audio = this.audioMap.get(key);
if (audio) {
audio.play();
this.currentPlayingKey = key;
// 检查音频是否加载失败过多次
const retries = this.retryCount.get(key) || 0;
if (retries >= this.maxRetries) {
console.warn(`音频 ${key} 加载失败次数过多,尝试重新初始化`);
this.retryLoadAudio(key);
// 延迟播放,等待重新加载
setTimeout(() => {
const newAudio = this.audioMap.get(key);
if (newAudio) {
newAudio.play();
this.currentPlayingKey = key;
}
}, 500);
} else {
audio.play();
this.currentPlayingKey = key;
}
}
}
@@ -113,12 +179,42 @@ class AudioManager {
}
}
// 停止所有音频
stopAll() {
this.audioMap.forEach((audio, key) => {
audio.stop();
});
this.currentPlayingKey = null;
}
// 手动重新加载指定音频
reloadAudio(key) {
if (audioFils[key]) {
console.log(`手动重新加载音频: ${key}`);
this.retryCount.set(key, 0); // 重置重试计数
this.retryLoadAudio(key);
}
}
// 重新加载所有音频
reloadAllAudios() {
console.log('重新加载所有音频...');
this.audioMap.forEach((audio, key) => {
audio.destroy();
});
this.audioMap.clear();
this.retryCount.clear();
this.currentPlayingKey = null;
this.initAudios();
}
// 销毁所有音频实例
destroyAll() {
this.audioMap.forEach((audio) => {
audio.destroy();
});
this.audioMap.clear();
this.retryCount.clear();
this.currentPlayingKey = null;
}
}