首页 > 解决方案 > 声音无法通过网络音频正确播放

问题描述

我正在尝试使用 AudioContext 播放 wav 文件 - 它在加载<audio>标签时正确播放(如jsfiddle所示),但在使用 AudioContext 时播放不正确。

var startButton = document.getElementById('start-stream');
var wav = new wavefile.WaveFile();
startButton.onclick = function() {
  audioCtx = new AudioContext();
  wav.fromBase64(mydata);

  buffer = audioCtx.createBuffer(1, audioCtx.sampleRate * 3, audioCtx.sampleRate);

  // add audio data to buffer
  buffer.getChannelData(0).set(wav.getSamples());

  source = audioCtx.createBufferSource();
  source.buffer = buffer;
  source.connect(audioCtx.destination);
  source.start();
};

小提琴在这里: https ://jsfiddle.net/Persiancoffee/6v8dLt3f/7/

标签: javascripthtml5-audioweb-audio-apiaudiocontext

解决方案


Web Audio API的decodeAudioData()功能可以解码 WAV 文件,这就是为什么您不需要任何外部库来处理这个用例。它会AudioBuffer为你生成一个。

startButton.onclick = async function () {
    audioCtx = new AudioContext();

    const arrayBuffer = Uint8Array.from(
        atob(mydata),
        (character) => character.charCodeAt(0)
    ).buffer;

    buffer = await audioCtx.decodeAudioData(arrayBuffer);
    
    source = audioCtx.createBufferSource();
    source.buffer = buffer;
    source.connect(audioCtx.destination);
    source.start();
};

这是您的小提琴更新版本的链接:https ://jsfiddle.net/pzx0vg89/ 。


推荐阅读