我的代码可以流畅播放,只是微信小程序的scriptProcessorNode的接口过时了,没有实现最新的浏览器:AudioWorkletNode 接口, 等微信努力吧 function initWebAudio() { try { scriptProcessorNode = audioContext.createScriptProcessor(BUFFER_SIZE, 1, 1); scriptProcessorNode.connect(gainNode); scriptProcessorNode.onaudioprocess = (audioProcessingEvent) => { // console.log("onaudioprocess triggered"); const outputBuffer = audioProcessingEvent.outputBuffer; const outputData = outputBuffer.getChannelData(0); if (pcmBuffer.length >= BUFFER_SIZE) { for (let i = 0; i < BUFFER_SIZE; i++) { outputData[i] = pcmBuffer[i]; } pcmBuffer = pcmBuffer.slice(BUFFER_SIZE); } else { for (let i = 0; i < BUFFER_SIZE; i++) { outputData[i] = 0; } } }; audioContext.resume().then(() => { console.log("AudioContext resumed."); }).catch((err) => { console.error("Failed to resume AudioContext:", err); }); console.log("Web Audio initialized successfully."); } catch (err) { console.error("Failed to initialize Web Audio:", err); } } // 接收 G.711 数据并解码 async function play(data, type) { if (type === 1) { const pcmData = new Int16Array(data.length); for (let i = 0; i < data.length; i++) { pcmData[i] = g711Codec.alaw2linear(data[i]); } const float32Data = new Float32Array(pcmData.length); for (let i = 0; i < pcmData.length; i++) { float32Data[i] = Math.max(-1, Math.min(1, pcmData[i] / 32768.0)); } // 采样率转换 const resampledData = resamplePCM(float32Data, SAMPLE_RATE, audioContext.sampleRate); // 合并 PCM 数据 const newPcmBuffer = new Float32Array(pcmBuffer.length + resampledData.length); newPcmBuffer.set(pcmBuffer, 0); newPcmBuffer.set(resampledData, pcmBuffer.length); pcmBuffer = newPcmBuffer; } } function resamplePCM(input, inputSampleRate, outputSampleRate) { const ratio = outputSampleRate / inputSampleRate; const outputLength = Math.round(input.length * ratio); const output = new Float32Array(outputLength); for (let i = 0; i < outputLength; i++) { const originalIndex = i / ratio; const lowerIndex = Math.floor(originalIndex); const upperIndex = Math.min(Math.ceil(originalIndex), input.length - 1); const weight = originalIndex - lowerIndex; output[i] = input[lowerIndex] * (1 - weight) + input[upperIndex] * weight; } return output; }
AudioBuffer是否支持动态添加buffer数据特性?如不支持,实时播放音频怎么解决播放卡顿?WebAudioContext.createBuffer
02-10