【问题标题】:Web Audio API is not working properly, in google chrome browser在 google chrome 浏览器中,Web Audio API 无法正常工作
【发布时间】:2021-03-10 12:45:06
【问题描述】:

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

它在我的许多手机浏览器中都可以正常工作,所以我想音频 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 和 Firefox 上的 Windows 10 上尝试了您的 sn-p,它们都可以正常工作。然而,在 IOS 上的 Safari 和 Chrome 中,它没有超过加载阶段,并且似乎存在脚本错误(我没有追踪到)。
  • iOS 上的 Chrome 提供与 IOS 上的 Safari 相同的结果(即不播放)。

标签: javascript google-chrome canvas web-audio-api


【解决方案1】:

这更多的是观察而不是完整的解决方案。

给出的代码适用于我在 Windows 10 上的 Edge、Chrome 和 Firefox。

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

这个MDN 参考使用“跨浏览器”方法来创建音频上下文,所以我添加了这一行:

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

在这一行之前:

 const context = new AudioContext();

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

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

这是否体现了 IOS 要求必须有一些用户交互才能真正播放音频?

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

【讨论】:

  • 感谢您的回答,终于知道问题所在了,其实是我需要添加的button,看来缓冲区足够大,自动播放受到一些限制浏览器,我已经添加了按钮,现在它工作正常,频率图也在工作,因为音频正在播放,所以画布能够获取数据。
  • 很高兴它成功了。 IOS还是需要按钮吗? (我相信它不会自动播放声音)。
  • 我还没有在 iPhone 上测试过它,但是在我的设备中,一些浏览器能够自动播放声音,而其他一些浏览器则不能这样做。我想这可能与浏览器的政策或arraybuffer 的大小有关...
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2012-05-30
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多