2010-06-22 26 views
5

J'essaie de trouver la meilleure approche pour construire un visualiseur de musique à exécuter dans un navigateur sur le web. Unity est une option, mais je vais devoir construire un plugin d'import/d'analyse audio personnalisé pour obtenir la sortie audio de l'utilisateur final. Quartz fait ce dont j'ai besoin, mais fonctionne uniquement sur Mac/Safari. WebGL ne semble pas prêt. Raphael est principalement 2D, et il y a toujours le problème d'obtenir le son de l'utilisateur ... des idées? Est-ce que quelqu'un a déjà fait ça? Par WebGL étant "pas prêt", je suppose que vous faites référence à la pénétration (il est seulement pris en charge dans WebKit et Firefox pour le moment)Comment écrire un visualiseur de musique basé sur le Web?

Répondre

4

À part cela, les égaliseurs sont définitivement possibles en utilisant HTML5 audio et WebGL. Un gars appelé David Humphrey a blogged about making different music visualisers en utilisant WebGL et a pu en créer des vraiment impressionnants. Voici quelques vidéos des visualisations (cliquez pour voir):

+0

Merci - c'est incroyablement utile. :) – nico

1

En fonction de la complexité vous pourriez être intéressé à essayer le traitement (http://www.processing.org), il a des outils très simples pour faire des applications basées sur le Web, et il a des outils pour obtenir la FFT et la forme d'onde d'un fichier audio.

3

Faire quelque chose réactive audio est assez simple. Here's an open source site with lots audio reactive examples. Pour ce faire, vous utilisez essentiellement l'API Web Audio pour diffuser la musique et utiliser AnalyserNode pour extraire les données audio.

"use strict"; 
 

 
// make a Web Audio Context 
 
var context = new AudioContext(); 
 
var analyser = context.createAnalyser(); 
 

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

 
var ctx = document.querySelector("canvas").getContext("2d"); 
 

 
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 
 
var 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>

Ensuite, il est juste à vous de tirer quelque chose de créatif.

notez quelques problèmes que vous risquez de rencontrer.

  1. À ce stade (2017/1/3), ni Android Chrome ni iOS Safari ne prennent en charge l'analyse des données audio en continu. Au lieu de cela, vous devez charger la chanson entière. Here'a a library that tries to abstract that a little

  2. Sur Mobile, vous ne pouvez pas lire automatiquement l'audio. Vous devez démarrer l'audio à l'intérieur d'un événement d'entrée en fonction de l'entrée de l'utilisateur, par exemple 'click' ou 'touchstart'. Comme indiqué dans l'exemple, vous ne pouvez analyser l'audio que si la source provient du même domaine OU si vous demandez l'autorisation CORS et que le serveur donne son autorisation. AFAIK seulement Soundcloud donne la permission et c'est par chanson. Il appartient aux paramètres de la chanson de l'artiste individuel si l'analyse audio est autorisée ou non pour une chanson particulière.

    pour tenter d'expliquer cette partie

    La valeur par défaut est que vous avez la permission d'accéder à toutes les données du même domaine, mais pas l'autorisation d'autres domaines.

    Lorsque vous ajoutez

    audio.crossOrigin = "anonymous"; 
    

    Cela dit essentiellement « demander au serveur d'autorisation pour l'utilisateur« anonyme ». Le serveur peut donner la permission ou non. C'est au serveur. Cela inclut de demander même au serveur sur le même domaine, ce qui signifie que si vous devez demander une chanson sur le même domaine, vous devez (a) supprimer la ligne ci-dessus ou (b) configurer votre serveur pour autoriser CORS. La plupart des serveurs par défaut n'accordent pas la permission CORS donc si vous ajoutez cette ligne, même si le serveur est le même domaine, si elle ne donne pas l'autorisation CORS alors essayer d'analyser l'audio échouera.


musique: DOCTOR VOX - Level Up

+0

Pfffft! Tueur réponse! Merci! – Alon