const audioFils = { 第一轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fl26qrspvy79.mp3", 第二轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fehshrpe5ook.mp3", 第三轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fgbz3iimk7yy.mp3", 第四轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fjwf50tlxxbi.mp3", 第五轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fg63lqrslhm7.mp3", 决金箭轮: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fhjycwubbwil.mp3", 请蓝方射箭: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fr0zpluiabph.mp3", 请红方射箭: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fu169yerpwey.mp3", 中场休息: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fug8faqrbtwd.mp3", 比赛结束: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblsdl717ilr0b3o0.mp3", 比赛开始: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbblsdl7qlkqgvthfr.mp3", 请开始射击: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbljrfx5guqt5oulk.mp3", 未上靶: "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkxm60bul0khcoqq.mp3", "1环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufj59qmdo96ha.mp3", "2环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufogy49ousbv4.mp3", "3环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufl3hhijeasck.mp3", "4环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufo8vo7k6jxdz.mp3", "5环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklkzq7lrbfpr6ij.mp3", "6环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0fw7hbmmhxkl.mp3", "7环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0fkirkanghmf.mp3", "8环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0cly2noykieg.mp3", "9环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0gsuumekhpkn.mp3", "10环": "https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklgw2dk22ek7qha.mp3", 射击无效: "https://static.shelingxingqiu.com/attachment/2025-08-26/dcc9qc84rir8gkj3mo.mp3", 距离不足5米: "https://static.shelingxingqiu.com/attachment/2025-08-27/dcd59px1cavp1hogxi.mp3", }; 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) => { 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) { // 如果有正在播放的音频,先停止 if (this.currentPlayingKey) { this.stop(this.currentPlayingKey); } const audio = this.audioMap.get(key); if (audio) { // 检查音频是否加载失败过多次 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; } } } // 停止指定音频 stop(key) { const audio = this.audioMap.get(key); if (audio) { audio.stop(); if (this.currentPlayingKey === key) { this.currentPlayingKey = null; } } } // 停止所有音频 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; } } // 导出单例 export default new AudioManager();