Cómo precarga un sonido en Javascript?


Puedo precarga imágenes fácilmente gracias a la función onload. Pero no funciona con audio. Navegadores como Chrome, Safari, Firefox, etc. no soporta las funciones onload en la etiqueta de audio.

¿Cómo precarga un sonido en Javascript sin usar bibliotecas JS y sin usar o crear etiquetas HTML?

Author: Servy, 2011-03-15

6 answers

Su problema es que los objetos de audio no soportan el evento 'load'.

En cambio, hay un evento llamado 'canplaythrough' que no significa que esté completamente cargado, pero lo suficiente como para que a la velocidad de descarga actual, termine cuando la pista haya tenido suficiente tiempo para reproducirse.

Así que en lugar de

audio.onload = isAppLoaded;

Intenta

audio.oncanplaythrough = isAppLoaded;

O, mejor aún.. ;)

audio.addEventListener('canplaythrough', isAppLoaded, false);
 44
Author: Kayla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-21 16:48:21

Probé la respuesta aceptada por tylermwashburn y no funcionó en Chrome. Así que seguí adelante y creé esto y se beneficia de jQuery. También huele para ogg y soporte mp3. El valor predeterminado es ogg porque algunos expertos dicen que un archivo ogg de 192KBS es tan bueno como un MP3 de 320KBS, por lo que ahorra un 40% en sus descargas de audio requeridas. Sin embargo mp3 es necesario para IE9:

// Audio preloader

$(window).ready(function(){
  var audio_preload = 0;
  function launchApp(launch){
    audio_preload++;
    if ( audio_preload == 3 || launch == 1) {  // set 3 to # of your files
      start();  // set this function to your start function
    }
  }
  var support = {};
  function audioSupport() {
    var a = document.createElement('audio');
    var ogg = !!(a.canPlayType && a.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ''));
    if (ogg) return 'ogg';
    var mp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
    if (mp3) return 'mp3';
    else return 0;
  }
  support.audio = audioSupport();
  function loadAudio(url, vol){
    var audio = new Audio();
    audio.src = url;
    audio.preload = "auto";
    audio.volume = vol;
    $(audio).on("loadeddata", launchApp);  // jQuery checking
    return audio;
  }
  if (support.audio === 'ogg') {
    var snd1 = loadAudio("sounds/sound1.ogg", 1);  // ie) the 1 is 100% volume
    var snd2 = loadAudio("sounds/sound2.ogg", 0.3);  // ie) the 0.3 is 30%
    var snd3 = loadAudio("sounds/sound3.ogg", 0.05);
        // add more sounds here
  } else if (support.audio === 'mp3') { 
    var snd1 = loadAudio("sounds/sound1.mp3", 1);
    var snd2 = loadAudio("sounds/sound2.mp3", 0.3);
    var snd3 = loadAudio("sounds/sound3.mp3", 0.05);
        // add more sounds here
  } else {
    launchApp(1);  // launch app without audio
  }

// this is your first function you want to start after audio is preloaded:
  function start(){
     if (support.audio) snd1.play();  // this is how you play sounds
  }

});

Además: Aquí hay un convertidor de mp3 a ogg: http://audio.online-convert.com/convert-to-ogg O puedes usar VLC Reproductor multimedia para convertir. Compruebe su tasa de bits mp3 haciendo clic derecho en el archivo mp3 (en Windows) y yendo a los detalles del archivo. Trate de reducir en un 40% al seleccionar su nueva tasa de bits para su nuevo archivo 'ogg'. El convertidor puede lanzar un error, así que siga aumentando el tamaño hasta que se acepte. Por supuesto, prueba sonidos para una calidad satisfactoria. También (y esto se aplica a mí) si está utilizando VLC Media player para probar sus pistas de audio, asegúrese de configurar el volumen al 100% o por debajo o de lo contrario escuchará degradación de audio y podría pensar erróneamente que es el resultado de la compresión.

 10
Author: Jonathan Tonge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-03 14:07:51

Dependiendo de sus navegadores de destino, configurar el prelaod el atributo en la etiqueta audio puede ser suficiente.

 0
Author: Damien Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-15 15:23:04

Remy ideó una solución para iOS que utiliza el concepto sprite:

Http://remysharp.com/2010/12/23/audio-sprites /

No estoy seguro de que se dirija directamente a la precarga, pero tiene la ventaja de que solo necesita cargar un archivo de audio (que también es un inconveniente, supongo).

 0
Author: DA.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 15:05:43

¿Intentaste hacer una solicitud ajax para el archivo? No lo mostrarías / usarías hasta que estuviera completamente cargado.

Por ejemplo jQuery: ¿Cómo se precarga el sonido? (no tendría que usar jQuery).

 0
Author: two7s_clash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:04
//Tested on Chrome, FF, IE6

function LoadSound(filename) {
    var xmlhttp;
    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else { // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById("load-sound").innerHTML = '<embed src="' + filename + '" controller="1" autoplay="0" autostart="0" />';
        }
    }
    xmlhttp.open("GET", filename, true);
    xmlhttp.send();
}

Referencia

 0
Author: Luca Filosofi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 13:39:28