网络音频 API 在 google chrome 浏览器中无法正常工作

Web Audio API is not working properly, in google chrome browser

我创建了一个简单的音乐播放器,它为特定音频 URL 创建了一个 bufferArray 来播放音乐。

It is working fine in many of my cellphone's browser, so I guess there is no cross origin issue for audio URL.

但是 chrome 没有播放音频。

我还创建了一个 Uint8Array 用于在 canvas 中绘制频率数据,而许多浏览器在 canvas 中成功绘制了频率图,chrome 则没有所以!

看看我目前的尝试!

```
<!DOCTYPE html>
<html>
<head>
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <center>
    <h1>Music Player</h1>
    <hr>
    <div id="div"></div>
    <canvas></canvas>
    <p>Frequency plot</p>
    </center>
    <script>
    url = "https://dl.dropbox.com/s/5jyylqps64nyoez/Legends%20never%20die.mp3?dl=0";
    const div = document.querySelector("#div");
    const cvs = document.querySelector("canvas");
    cvs.width = window.innerWidth - 20;
    cvs.height = 200;
    const c = cvs.getContext("2d");
    function loadMusic(url){
 div.innerHTML = "Loading music, please wait...";
        const context = new AudioContext();
        const source = context.createBufferSource();
        const analyser = context.createAnalyser();
        let request = new XMLHttpRequest();
        request.open("GET",url,true);
        request.responseType = "arraybuffer";
        request.onload = ()=>{
            div.innerHTML = "Music loaded, please wait, music will be played soon...";
context.decodeAudioData(request.response,suffer=>{
    source.buffer = suffer;
    source.connect(context.destination);
    source.connect(analyser);
    analyser.connect(context.destination);
    source.start();
    div.innerHTML = "Music is playing... Enjoy!";
    setInterval(()=>{
c.clearRect(0,0,cvs.width,cvs.height);
let array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
let m = 0;
for(m = 0; m < array.length; m++){
    let x = (parseInt(window.innerWidth -20)*m)/array.length;
    c.beginPath();
    c.moveTo(x,150-((100*array[m])/255));
    c.lineTo((parseInt(window.innerWidth -20)*(m+1))/array.length,150-((100*array[m+1])/255));
    c.lineWidth = 1;
    c.strokeStyle = "black";
    c.stroke();

}
},1);
});
        }
        request.send();
    }
   
        loadMusic(url);
    
    </script>
</body>
</html>

```

这是一些观察结果,而不是完整的解决方案。

给出的代码在 Edge、Chrome 和 Windows 10 的 Firefox 上对我有效。

在 IOS 14 Safari 和 IOS 14 Chrome 上,它似乎在发出加载消息后停止了。

MDN 参考使用 'cross browser' 方法创建音频上下文,因此我添加了这一行:

 var AudioContext = window.AudioContext || window.webkitAudioContext;

在这一行之前:

 const context = new AudioContext();

[编辑:刚刚在 caniuse 确认 Safari 需要 -webkit 前缀]

这似乎在执行其余代码时起到了作用。但是,没有声音,似乎没有播放音频。该图还只显示了一条水平线。

这是否体现了 IOS 要求在实际播放音频之前必须有一些用户交互?

我很确定音频已加载,因为此时有明显的停顿。我怀疑必须有一个按钮,当点击它时实际上开始播放。