【问题标题】:How to code audio visualizer with Javascript如何使用 Javascript 编写音频可视化器
【发布时间】:2020-09-03 16:31:18
【问题描述】:

我正在尝试编写这个特殊的音频可视化代码:https://codepen.io/nfj525/pen/rVBaab

我正在苦苦挣扎,因为我不想像示例中那样上传音频文件,而是希望通过单击音频的播放按钮来运行代码。我想使用我自己预先存在的音频并播放它,而不必上传文件。我是编码新手,我不确定如何编辑 javascript 来做到这一点。

这是我在要播放的音频中添加的html,“song.mp3”

<div id="content">
  <input type="file" id="thefile" accept="audio/*" />
  <canvas id="canvas"></canvas>
  <audio src="song.mp3" id="audio" controls></audio>
</div>

这就是它的js

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();
  };
};

【问题讨论】:

    标签: javascript html html5-audio


    【解决方案1】:

    因此,为此,您的 html 中不再需要文件输入元素,因此您的第一部分变为:

        <div id="content">
          <canvas id="canvas"></canvas>
          <audio src="song.mp3" id="audio" controls></audio>
        </div>
    

    至于 Javascript,还有一些工作要做。总之,我们将提取并命名实际完成整个工作的函数,然后在window.onload 事件上调用它。所以你的脚本部分应该是这样的:

    <script>
        function playAudio() {
                var audio = document.getElementById("audio");
                // var files = this.files;  // not needed
                // audio.src = URL.createObjectURL(files[0]);  // not needed
                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();
              };
    
            window.onload = function () {
              // start playing audio once the page is fully loaded
              playAudio();
            };
    </script>
    

    请注意,这必须托管在某个服务器上。

    【讨论】:

    • 有没有办法在没有服务器的情况下做到这一点?
    • 恐怕,不多。这是一个安全的事情。你可以阅读更多关于它herehere
    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多