【问题标题】:Need help to Modify HTML5 Audio Analyser bar graphic需要帮助修改 HTML5 音频分析器条形图
【发布时间】:2019-01-14 03:48:28
【问题描述】:

有一个自定义的动画 HTML 音频分析器图形,可播放音轨并根据该音频的频率移动。

这是来自 CodePen HERE 的代码,我发现它只适用于 HTTPS 域。

现在的问题是:我不需要像代码那样上传音轨,我只需要一个简单的音轨来自动播放并删除那个上传按钮。假设我在服务器上的同一目录中有一个 track1.mp3,并希望在加载我的 HTML 页面时播放它。

  window.onload = function() {
  var file = document.getElementById("thefile");
  var audio = document.getElementById("audio");

  file.onchange = function() {
    var files = this.files;
    audio.src = URL.createObjectURL(files[0]);
    audio.load();
    audio.play();
    var context = new AudioContext();
    var src = context.createMediaElementSource(audio);
    var analyser = context.createAnalyser();

    var canvas = document.getElementById("canvas");
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    var ctx = canvas.getContext("2d");

    src.connect(analyser);
    analyser.connect(context.destination);

    analyser.fftSize = 256;

    var bufferLength = analyser.frequencyBinCount;
    console.log(bufferLength);

    var dataArray = new Uint8Array(bufferLength);

    var WIDTH = canvas.width;
    var HEIGHT = canvas.height;

    var barWidth = (WIDTH / bufferLength) * 2.5;
    var barHeight;
    var x = 0;

    function renderFrame() {
      requestAnimationFrame(renderFrame);

      x = 0;

      analyser.getByteFrequencyData(dataArray);

      ctx.fillStyle = "#000";
      ctx.fillRect(0, 0, WIDTH, HEIGHT);

      for (var i = 0; i < bufferLength; i++) {
        barHeight = dataArray[i];

        var r = barHeight + (25 * (i / bufferLength));
        var g = 250 * (i / bufferLength);
        var b = 50;

        ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
        ctx.fillRect(x, HEIGHT - barHeight, barWidth, barHeight);

        x += barWidth + 1;
      }
    }

    audio.play();
    renderFrame();
  };
};
#thefile {
  position: fixed;
  top: 10px;
  left: 10px;
  z-index: 100;
}

#canvas {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}

audio {
  position: fixed;
  left: 10px;
  bottom: 10px;
  width: calc(100% - 20px);
}
<div id="content">
  <input type="file" id="thefile" accept="audio/*" />
  <canvas id="canvas"></canvas>
  <audio id="audio" controls></audio>
</div>

【问题讨论】:

  • " 假设我在同一目录中有一个 track1.mp3,并且想在我的页面加载时播放它。" 假设是服务器上的这个文件夹还是你的桌面?
  • 具有 HTTPS 域的服务器
  • 好的,测试一下它准备好了。我只能将其加载到某个点,因为该站点不是 Same Origin Policy 问题的合适环境,所以如果您遇到任何问题,请告诉我,祝您好运。

标签: javascript html


【解决方案1】:

Google Forces Yet Another Policy

对于这些人来说,没有什么是神圣的——从 2018 年 12 月起,针对开发 Web Audio API 的 Chrome 用户实施了新的自动播放政策。如果AudioContext(); 是在用户与手势交互之前创建的(点击、轻敲、打嗝、打鼾等),AudioContext(); 将被暂停,直到用户这样做。

所以为了适应这个工程奇迹,我添加了一个播放按钮并将所有内容都包装在一个 eventListener 中。


更改src

“现在的问题是:我不需要像代码那样上传音轨,我只需要一个简单的音轨来自动播放并删除那个上传按钮。假设我有一个 track1 .mp3 在同一目录中,并希望在我的页面加载时播放。”

好的,该演示已被调整为加载一个普通的 url,您需要更改此行,使其指向您服务器上文件的位置:

audio.src = "https://host.top/path/to/file.mp3";

certain conflicts with CORS 添加前面提到的行上方的新行:

audio.crossOrigin = "anonymous";


Plunker

演示

注意:如果这个 Stack Snippet 没有声音,那就去这个Plunker

document.getElementById('load').addEventListener('click', audioViz);

function audioViz(e) {

  var player = document.getElementById("player");

  player.crossOrigin = "anonymous";
  player.src = "https://glsbx.s3-us-west-1.amazonaws.com/-/dd.mp3";
  player.load();
  player.play();

  var context = new AudioContext();
  var src = context.createMediaElementSource(player);
  var analyser = context.createAnalyser();

  var canvas = document.getElementById("canvas");
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  var ctx = canvas.getContext("2d");

  src.connect(analyser);
  analyser.connect(context.destination);

  analyser.fftSize = 256;

  var bufferLength = analyser.frequencyBinCount;
  console.log(bufferLength);

  var dataArray = new Uint8Array(bufferLength);

  var WIDTH = canvas.width;
  var HEIGHT = canvas.height;

  var barWidth = (WIDTH / bufferLength) * 2.5;
  var barHeight;
  var x = 0;

  function renderFrame() {

    requestAnimationFrame(renderFrame);

    x = 0;

    analyser.getByteFrequencyData(dataArray);

    ctx.fillStyle = "#000";
    ctx.fillRect(0, 0, WIDTH, HEIGHT);

    for (var i = 0; i < bufferLength; i++) {
      barHeight = dataArray[i];

      var r = barHeight + (25 * (i / bufferLength));
      var g = 250 * (i / bufferLength);
      var b = 50;

      ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
      ctx.fillRect(x, HEIGHT - barHeight, barWidth, barHeight);

      x += barWidth + 1;
    }
  }

  player.play();
  renderFrame();
}
button {
  position: fixed;
  top: 46px;
  left: 46px;
  z-index: 100;
  display: inline-block;
  font-size: 48px;
  border: none;
  background: none;
  color: rgba(223, 6, 39, 0.8);
  cursor: pointer;
}

button:hover {
  color: rgba(255, 0, 128, 0.8);
}

button:focus {
  outline: 0
}

#canvas {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}

#player {
  position: fixed;
  left: 10px;
  bottom: 10px;
  width: calc(100% - 20px);
}
<button id='load' class='load' type='button'>▶</button>
<canvas id="canvas"></canvas>
<audio id="player" controls>
  <source src='about:blank'>
</audio>

【讨论】:

  • 感谢您的回复...不幸的是,上面的代码不起作用。这是我测试它的链接。 reed123.000webhostapp.com/Index.html
  • 当我添加 var audio = new Audio();它播放音频,但没有酒吧......他们不在那里
  • 脚本已经有一个音频对象,不需要再做一个
  • @SaraRee 谷歌制定了一项新政策concerning Web Audio Dec 2018,等等...
  • @SaraRee 好的,现在试试……等等……抱歉。
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多