收藏
回答

使用webaudio播放音频,android版本可以播放,ios看到解码成功了但是没有声音

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 Bug webaudio 微信iOS客户端 8.0.60 3.8.9

载入一个ogg文件,decode之后调用play。

let systemVersion; if (rx.env.is_wechat) { const { system } = wx.getDeviceInfo ? wx.getDeviceInfo() : wx.getSystemInfoSync(); const systemVersionArr = system ? system.split(' ') : []; systemVersion = systemVersionArr.length ? systemVersionArr[systemVersionArr.length - 1] : ''; } let webAutoResumeTicker = null; function getWebAudioCtx() { if (rx.env.is_wechat) { var audioCtx = wx.createWebAudioContext(); const { SDKVersion } = wx.getAppBaseInfo ? wx.getAppBaseInfo() : wx.getSystemInfoSync(); if (compareVersion(SDKVersion, "2.25.3") && GameGlobal.isIOSHighPerformanceMode) { webAutoResumeTicker = setTimeout(() => { console.log("webAutoResumeTicker:", audioCtx); audioCtx.resume(); }, 2000); } return audioCtx ; } else if (window.AudioContext || window.webkitAudioContext) { return new (window.AudioContext || window.webkitAudioContext)(); } throw new Error('WebAudio Api Unsupported'); } constructor() { this.audioCtx = getWebAudioCtx(); console.log("create audioCtx:", audioCtx); if (rx.env.is_wechat) { wx.onHide(() => { if (webAutoResumeTicker) { clearTimeout(webAutoResumeTicker); webAutoResumeTicker = null; } this.audioCtx.suspend(); }); wx.onShow(() => { console.log("RXWebaudio: onShow"); if (compareVersion(systemVersion, '17.5') && GameGlobal.isIOSHighPerformanceMode) { this.audioCtx.close(); this.audioCtx = getWebAudioCtx(); console.log("RXWebaudio: onShow:", this.audioCtx); } else { this.audioCtx.resume(); } }); } this.groups = {}; this.instances = {}; // 存储音频实例 this.nextInstanceId = 0; this.nextGroupId = 1; // 创建主音量控制组 const groupGainNode = this.audioCtx.createGain(); groupGainNode.connect(this.audioCtx.destination); this.groups[0] = { groupGainNode, }; } createGroup() { const id = this.nextGroupId++; const groupGainNode = this.audioCtx.createGain(); groupGainNode.connect(this.audioCtx.destination); // 连接到主组 this.groups[id] = { groupGainNode, }; return id; } createInstance(groupID = 0) { const id = this.nextInstanceId++; const gainNode = this.audioCtx.createGain(); // 获取指定的组 let group = this.groups[groupID]?.groupGainNode; if (!group) { console.warn(`Group ID ${groupID} not found, using master group.`); group = this.groups[0].groupGainNode; } gainNode.connect(group); this.instances[id] = { sourceNode: null, gainNode: gainNode, groupID: groupID, audioBuffer: null, }; return id; } setAudio(id, data, size, wrapper) { const instance = this._getInstance(id); let bc = Module.HEAPU8.subarray(data, data + Number(size)); //let bc = Module.HEAPU8.slice(data, data + Number(size));// memory.buffer.slice(data, data + size); let view = new Uint8Array(bc); return this.audioCtx.decodeAudioData(view.buffer, (buffer) => { //instance.sourceNode.buffer = buffer; instance.audioBuffer = buffer; //console.log("解码成功"); //Module._wx_web_audio_decoded(id, true); Module._async_file_callback(wrapper, true, null); //resolve(); }, (decodeErr) => { console.log("WebAudio 解码失败:", decodeErr); //Module._wx_web_audio_decoded(id, false); Module._async_file_callback(wrapper, false, null); //reject(decodeErr); }); } play(id, offset, loop, wrapper) { const instance = this._getInstance(id); if (instance.sourceNode != null){ instance.sourceNode.stop(0); instance.sourceNode.disconnect(); instance.sourceNode = null; } instance.sourceNode = this.audioCtx.createBufferSource(); instance.sourceNode.buffer = instance.audioBuffer; instance.sourceNode.loop = loop; instance.sourceNode.connect(instance.gainNode); instance.sourceNode.onended = () => { //Module.wx_web_audio_play_finish(id); Module._async_file_callback(wrapper, true, null); //resolve('播放完成') }; instance.sourceNode.start(0, offset); }
最后一次编辑于  星期四 18:50
回答关注问题邀请回答
收藏

1 个回答

  • 山凌
    山凌
    星期五 09:13

    问题找到了,iphone静音键打开,即便设置只静音铃声仍然会影响webaudio。

    星期五 09:13
    有用
    回复
登录 后发表内容