Нужна помощь для изменения графического индикатора HTML5 Audio Analyzer - PullRequest
0 голосов
/ 11 января 2019

Существует пользовательская анимированная графика HTML-анализатора звука, которая воспроизводит звуковую дорожку и перемещается в зависимости от частоты этого звука.

Это код из CodePen ЗДЕСЬ , я обнаружил, что он работает только на домене 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>

1 Ответ

0 голосов
/ 11 января 2019

Google применяет еще одну политику

Ничто не является священным для этих ребят - по состоянию на декабрь 2018 года для пользователей Chrome, разрабатывающих Web Audio API, введены новые правила автозапуска. Если AudioContext(); создается до того, как пользователь взаимодействует с жестом (щелчок, нажатие, отрыжка, храп и т. Д.), AudioContext(); будет приостановлено до тех пор, пока пользователь не сделает это.

Итак, чтобы приспособиться к этому чуду инженерной мысли, я добавил кнопку воспроизведения и обернул все в EventListener.


Изменение src

"Теперь проблема в том, что мне не нужно загружать звуковую дорожку, как это делает код, мне просто нужна простая звуковая дорожка для автоматического воспроизведения и удаление кнопки загрузки. Допустим, у меня есть дорожка1 .mp3 в том же каталоге и хотите воспроизвести его, когда моя страница загружена. "

ОК, демо было адаптировано для загрузки обычного URL, вам нужно изменить эту строку так, чтобы она указала на местоположение файла на вашем сервере:

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

Новая строка выше упомянутой строки добавлена ​​для определенных конфликтов с CORS :

audio.crossOrigin = "anonymous";


Plunker

Демо

Примечание: Если у этого фрагмента стека нет звука, перейдите к этому 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...