Estoy tratando de encontrar el mejor enfoque para construir un visualizador de música para que se ejecute en un navegador a través de la web. La unidad es una opción, pero tendré que crear un complemento personalizado de importación/análisis de audio para obtener la salida de sonido del usuario final. Quartz hace lo que necesito, pero solo se ejecuta en Mac/Safari. WebGL parece no estar listo. Raphael es principalmente en 2D, y todavía existe la cuestión de obtener el sonido del usuario ... alguna idea? ¿Alguien ha hecho esto antes?¿Cómo escribir un visualizador de música basado en web?
Respuesta
Al decir que WebGL no está "listo", asumo que te refieres a la penetración (solo está soportado en WebKit y Firefox por el momento).
Aparte de eso, los ecualizadores definitivamente son posibles usando audio HTML5 y WebGL. Un tipo llamado David Humphrey tiene blogged about making different music visualisers usando WebGL y fue capaz de crear algunos realmente impresionantes. He aquí algunos vídeos de las visualizaciones (clic para ver):
Dependiendo de la complejidad que podría estar interesado en probar Procesamiento (http://www.processing.org), se tiene herramientas realmente sencillas para hacer aplicaciones basadas en web, y tiene herramientas para obtener la FFT y la forma de onda de un archivo de audio.
Utilicé SoundManager2 para extraer los datos de forma de onda del archivo mp3. Esa característica requiere Flash 9 por lo que podría no ser el mejor enfoque.
Mi demostración forma de onda con HMTL5 lona: http://www.momentumracer.com/electriccanvas/
Haciendo reactiva de audio algo es bastante simple. Here's an open source site with lots audio reactive examples.
En cuanto a cómo hacerlo, básicamente utiliza Web Audio API para transmitir la música y usar su AnalyserNode para obtener datos de 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>
Entonces es sólo depende de usted para dibujar algo creativo.
tenga en cuenta algunos problemas que probablemente encuentre.
En este momento (2017/1/3) ni Android Chrome ni iOS Safari admiten el análisis de la transmisión de datos de audio. En su lugar, tienes que cargar la canción completa. Here'a a library that tries to abstract that a little
En el móvil no puede reproducir audio automáticamente. Debe iniciar el audio dentro de un evento de entrada basado en la entrada del usuario como
'click'
o'touchstart'
.Como se indica en la muestra, solo se puede analizar el audio si la fuente es del mismo dominio O se solicita el permiso CORS y el servidor da permiso. AFAIK solo Soundcloud da permiso y es por canción. Depende de la configuración de la canción del artista individual si el análisis de audio está permitido o no para una canción en particular.
para tratar de explicar esta parte
El valor por defecto es que tiene permiso para acceder a todos los datos del mismo dominio, pero sin el permiso de otros dominios.
Cuando se agrega
audio.crossOrigin = "anonymous";
Eso dice, básicamente, "pedir al servidor de autorización para el usuario" anónimo". El servidor puede dar permiso o no. Depende del servidor. Esto incluye solicitar incluso al servidor en el mismo dominio, lo que significa que si va a solicitar una canción en el mismo dominio necesita (a) eliminar la línea anterior o (b) configurar su servidor para dar permiso a CORS. La mayoría de los servidores de forma predeterminada no otorgan permiso a CORS, por lo que si agrega esa línea, incluso si el servidor es del mismo dominio, si no da permiso a CORS, entonces se intentará analizar el audio.
música: DOCTOR VOX - Level Up
Pfffft! ¡Respuesta asesina! ¡Gracias! – Alon
- 1. ¿Cómo comenzar a escribir un visualizador de música en C++?
- 2. Crear visualizador de música
- 3. Creación de un iPhone Visualizador de música basado en Fourier Transform
- 4. ¿Hay un navegador web basado en C#?
- 5. Reproducción continua de música en un sitio web
- 6. Cómo escribir un transporte personalizado basado en socket para WCF
- 7. JQuery: ¿Cómo ejecutar música de fondo en el sitio web?
- 8. Usabilidad de la web - Música de fondo
- 9. ¿Cómo localizas un sitio web basado en bases de datos?
- 10. Cómo crear un servicio web basado en API En Symfony2
- 11. Sitio web basado en XML: ¿cómo crear?
- 12. Escribir un servidor basado en socket en Python, ¿estrategias recomendadas?
- 13. cómo agregar música de fondo a una página web?
- 14. Música de fondo ininterrumpida en el sitio web
- 15. Cliente VNC basado en web?
- 16. ¿Es posible escribir un dispositivo basado en Windows?
- 17. visualizador de PDF de alto rendimiento para web
- 18. Web Editor XML basado
- 19. Cómo escribir un servidor basado en REST simple en C# en mono?
- 20. Escribir un servidor web simple en Ruby
- 21. Buscando un componente diff basado en la web
- 22. ¿Navegación URL en un sitio web basado en AJAX?
- 23. ¿Cómo debo comenzar el desarrollo web basado en Java?
- 24. Visualizador/visualizador HTML de Java puro para usar en un panel desplazable
- 25. visor de subversión basado en web
- 26. Cómo escribir el for-loop basado en rango con Argv?
- 27. ¿Equivalente basado en web de Microsoft Access?
- 28. Constructor de consultas visuales basado en web
- 29. Distinguir instrumentos en un archivo de música
- 30. Cómo escribir servicios web efectivos en Java
Gracias - que es increíblemente útil. :) – nico