Efectos de sonido en JavaScript/HTML5
Estoy usando HTML5 para programar juegos; El obstáculo con el que me he topado ahora es cómo reproducir efectos de sonido.
Los requisitos específicos son pocos:
- Reproduce y mezcla múltiples sonidos,
- Reproduzca la misma muestra varias veces, posiblemente superponiendo reproducciones,
- Interrumpir la reproducción de una muestra en cualquier momento,
- Preferiblemente reproduzca archivos WAV que contengan PCM sin formato (de baja calidad), pero puedo convertirlos, por supuesto.
Mi primer enfoque fue utilizar el <audio>
elemento HTML5 y definir todos los efectos de sonido en mi página. Firefox reproduce los archivos WAV perfectamente, pero llamar #play
varias veces en realidad no reproduce la muestra varias veces. Según tengo entendido de la especificación HTML5, el <audio>
elemento también rastrea el estado de reproducción, lo que explica por qué.
Mi pensamiento inmediato fue clonar los elementos de audio, así que creé la siguiente pequeña biblioteca de JavaScript para hacerlo por mí (depende de jQuery):
var Snd = {
init: function() {
$("audio").each(function() {
var src = this.getAttribute('src');
if (src.substring(0, 4) !== "snd/") { return; }
// Cut out the basename (strip directory and extension)
var name = src.substring(4, src.length - 4);
// Create the helper function, which clones the audio object and plays it
var Constructor = function() {};
Constructor.prototype = this;
Snd[name] = function() {
var clone = new Constructor();
clone.play();
// Return the cloned element, so the caller can interrupt the sound effect
return clone;
};
});
}
};
Ahora puedo hacerlo Snd.boom();
desde la consola Firebug y reproducir snd/boom.wav
, pero todavía no puedo reproducir la misma muestra varias veces. Parece que el <audio>
elemento es más una función de transmisión que algo para reproducir efectos de sonido.
¿Existe alguna forma inteligente de hacer que esto suceda y que me falta, preferiblemente usando solo HTML5 y JavaScript?
También debo mencionar que mi entorno de prueba es Firefox 3.5 en Ubuntu 9.10. Los otros navegadores que probé (Opera, Midori, Chromium, Epiphany) produjeron resultados variables. Algunos no juegan nada y otros lanzan excepciones.
Audio
objetos HTML5
No necesitas preocuparte por <audio>
los elementos. HTML 5 te permite acceder Audio
a objetos directamente:
var snd = new Audio("file.wav"); // buffers automatically when created
snd.play();
No hay soporte para mezclar en la versión actual de la especificación.
Para reproducir el mismo sonido varias veces, cree varias instancias del Audio
objeto. También puedes configurar snd.currentTime=0
el objeto después de que termine de reproducirse.
Dado que el constructor JS no admite <source>
elementos alternativos, debes usar
(new Audio()).canPlayType("audio/ogg; codecs=vorbis")
para probar si el navegador es compatible con Ogg Vorbis.
Si está escribiendo un juego o una aplicación de música (más que un simple reproductor), querrá utilizar Web Audio API más avanzada , que ahora es compatible con la mayoría de los navegadores .
API de audio web
Editar: a partir de diciembre de 2021, Web Audio API es esencialmente compatible con Chrome, Firefox, Safari y todos los demás navegadores principales (excepto IE, por supuesto).
A partir de julio de 2012, la API Web Audio ahora es compatible con Chrome y, al menos parcialmente, con Firefox, y está previsto que se agregue a IOS a partir de la versión 6.
Aunque el Audio
elemento es lo suficientemente robusto como para usarse mediante programación para tareas básicas, nunca estuvo pensado para brindar soporte de audio completo para juegos y otras aplicaciones complejas. Fue diseñado para permitir que un solo elemento multimedia se incruste en una página, similar a una img
etiqueta. Hay muchos problemas al intentar usarlo para juegos:
- Los desfases de tiempo son comunes con
Audio
los elementos. - Necesitas un
Audio
elemento para cada instancia de un sonido. - Los eventos de carga aún no son totalmente confiables
- Sin controles de volumen comunes, sin desvanecimientos, sin filtros/efectos
A continuación se muestran algunos buenos recursos para comenzar con la API de Web Audio:
- Documentación de MDN
- Artículo Introducción a WebAudio
- El estudio de caso de FieldRunners WebAudio también es una buena lectura