簡體   English   中英

如何使用 Javascript 編寫音頻可視化器

[英]How to code audio visualizer with Javascript

我正在嘗試編寫這個特殊的音頻可視化: 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();
  };
};

因此,為此您不再需要 html 中的文件輸入元素,因此您的第一部分變為:

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

至於 Javascript,還有一點工作要做。 總之,我們將提取並命名實際完成整個工作的 function,然后在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>

請注意,這必須托管在某些服務器上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM