Как написать веб-визуализатор музыки? - PullRequest
5 голосов
/ 22 июня 2010

Я пытаюсь найти лучший подход для создания музыкального визуализатора для запуска в браузере через Интернет.Unity - вариант, но мне нужно будет создать собственный плагин для импорта / анализа аудио, чтобы получить вывод звука конечного пользователя.Кварц делает то, что мне нужно, но работает только на Mac / Safari.WebGL, похоже, не готов.Рафаэль в основном 2D, и все еще есть проблема с получением звука пользователя ... какие-нибудь идеи?Кто-нибудь делал это раньше?

Ответы [ 4 ]

4 голосов
/ 03 января 2017

Сделать что-то аудиореактивное довольно просто. Вот сайт с открытым исходным кодом с множеством аудиореактивных примеров. .

Что касается того, как это сделать, вы в основном используете API-интерфейс Web Audio для потоковой передачи музыки и его AnalyserNode для вывода аудиоданных.

"use strict";
const ctx = document.querySelector("canvas").getContext("2d");

ctx.fillText("click to start", 100, 75);
ctx.canvas.addEventListener('click', start);  

function start() {
  ctx.canvas.removeEventListener('click', start);
  // make a Web Audio Context
  const context = new AudioContext();
  const analyser = context.createAnalyser();

  // Make a buffer to receive the audio data
  const numPoints = analyser.frequencyBinCount;
  const audioDataArray = new Uint8Array(numPoints);

  function render() {
    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);

    // get the current audio data
    analyser.getByteFrequencyData(audioDataArray);

    const width = ctx.canvas.width;
    const height = ctx.canvas.height;
    const size = 5;

    // draw a point every size pixels
    for (let x = 0; x < width; x += size) {
      // compute the audio data for this point
      const ndx = x * numPoints / width | 0;
      // get the audio data and make it go from 0 to 1
      const audioValue = audioDataArray[ndx] / 255;
      // draw a rect size by size big
      const y = audioValue * height;
      ctx.fillRect(x, y, size, size);
    }
    requestAnimationFrame(render);
  }
  requestAnimationFrame(render);

  // Make a audio node
  const audio = new Audio();
  audio.loop = true;
  audio.autoplay = true;

  // this line is only needed if the music you are trying to play is on a
  // different server than the page trying to play it.
  // It asks the server for permission to use the music. If the server says "no"
  // then you will not be able to play the music
  // Note if you are using music from the same domain 
  // **YOU MUST REMOVE THIS LINE** or your server must give permission.
  audio.crossOrigin = "anonymous";

  // call `handleCanplay` when it music can be played
  audio.addEventListener('canplay', handleCanplay);
  audio.src = "https://twgljs.org/examples/sounds/DOCTOR%20VOX%20-%20Level%20Up.mp3";
  audio.load();


  function handleCanplay() {
    // connect the audio element to the analyser node and the analyser node
    // to the main Web Audio context
    const source = context.createMediaElementSource(audio);
    source.connect(analyser);
    analyser.connect(context.destination);
  }
}
canvas { border: 1px solid black; display: block; }
<canvas></canvas>

Тогда вам нужно нарисовать что-то творческое.

обратите внимание на некоторые проблемы, с которыми вы, вероятно, столкнетесь.

  1. На данный момент (2017/1/3) ни Android Chrome, ни iOS Safari не поддерживают анализ потоковых аудиоданных.Вместо этого вы должны загрузить всю песню. Вот библиотека, которая пытается немного абстрагироваться

  2. На мобильном вы не можете автоматически воспроизводить аудио.Вы должны запустить звук внутри входного события на основе пользовательского ввода, например 'click' или 'touchstart'.

  3. Как указано в примере, вы можете анализировать звук только в том случае, если источником является либоиз того же домена ИЛИ вы запрашиваете разрешение CORS, а сервер дает разрешение.AFAIK только Soundcloud дает разрешение, и это на основе каждой песни.В зависимости от настроек песни отдельного исполнителя, разрешен ли аудиоанализ для конкретной песни.

    Чтобы попытаться объяснить эту часть

    По умолчанию у вас есть разрешение на доступ ко всем данным изтот же домен, но нет разрешения от других доменов.

    Когда вы добавляете

    audio.crossOrigin = "anonymous";
    

    Это в основном говорит "запросить у сервера разрешение для пользователя" анонимный "".Сервер может дать разрешение или нет.Это зависит от сервера.Это включает в себя запрос даже сервера в том же домене, что означает, что если вы собираетесь запрашивать песню в том же домене, вам нужно либо (а) удалить строку выше, либо (б) настроить свой сервер для предоставления разрешения CORS.Большинство серверов по умолчанию не дают разрешения CORS, поэтому, если вы добавите эту строку, даже если сервер находится в том же домене, если он не дает разрешения CORS, попытка анализа звука завершится неудачей.


музыка: DOCTOR VOX - повышение уровня

4 голосов
/ 24 июня 2010

Поскольку WebGL "не готов", я предполагаю, что вы имеете в виду проникновение (на данный момент оно поддерживается только в WebKit и Firefox).

Кроме этого, эквалайзеры определенно возможны с использованием аудио HTML5 и WebGL. Парень по имени Дэвид Хамфри написал в блоге о создании различных музыкальных визуализаторов с использованием WebGL и смог создать действительно впечатляющие. Вот несколько видео визуализаций (нажмите, чтобы посмотреть):

2 голосов
/ 11 апреля 2011

Я использовал SoundManager2 для извлечения данных формы сигнала из mp3-файла. Эта функция требует Flash 9, так что это может быть не лучшим подходом.

Моя демонстрация формы волны с HMTL5 Canvas: http://www.momentumracer.com/electriccanvas/

и WebGL: http://www.momentumracer.com/electricwebgl/

Источники: https://github.com/pepez/Electric-Canvas

1 голос
/ 15 октября 2010

В зависимости от сложности вам может быть интересно попробовать обработку (http://www.processing.org), у него действительно простые инструменты для создания веб-приложений, а также есть инструменты для получения БПФ и формы волны аудиофайла.

...