为了账号安全,请及时绑定邮箱和手机立即绑定

Web Audio API 在 google chrome 浏览器中无法正常工作

Web Audio API 在 google chrome 浏览器中无法正常工作

阿波罗的战车 2023-09-14 18:03:49
我创建了一个简单的音乐播放器,它bufferArray为特定的音频 URL 创建一个来播放音乐。它在我的许多手机浏览器中工作正常,所以我猜音频 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);});
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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

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

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

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

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

在此行之前:

 const context = new AudioContext();


这似乎在执行其余代码时就达到了目的。然而,没有声音,似乎音频没有播放。该图还仅显示一条水平线。

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

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


查看完整回答
反对 回复 2023-09-14
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信