UPDATE para iOS 6:
Todo esto se fija en iOS 6. Puede almacenar en caché un archivo de audio y reproducirlo a través de JavaScript sin intervención del usuario.
shaun5 Nov 7 '12 a 0:58
A pesar de que debería funcionar y no hay especificaciones (W3C, de Apple), que decir que no debería, he probado algunos escenarios y parece que Safari en iOS simplemente se niega a almacenar en caché los archivos de sonido.
Safari está cargando el archivo de audio (pero no el index.html) cada vez que recargo la página, por lo que el almacenamiento en caché aparentemente no funciona correctamente, independientemente del tamaño del archivo.
Después de algunas investigaciones: Parece que no es posible almacenar en caché los archivos de audio. Por lo tanto, puede presentar una falla en Apples bugtracker.
Aquí está mi código para demostrar mis resultados:
index.html:
<!DOCTYPE HTML>
<html lang="en-US" manifest="audio.appcache">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title>Cached audio</title>
</head>
<body>
<h1>Cached audio</h1>
<audio controls autobuffer>
<source src="sample.mp3" type="audio/mpeg" />
</audio>
</body>
</html>
audio.appcache:
CACHE MANIFEST
# 2012-02-23:v1
# explicitly cached
CACHE:
index.html
sample.mp3
.htaccess:
AddType text/cache-manifest .appcache
AddType audio/mpeg .mp3
EDITAR
también probé usando URIs de datos, pero que Safari sigue rechazando los datos de audio.Así que creo que no es posible almacenar en caché de audio ...
<?php
function data_uri($file) {
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:audio/mpeg;base64,'.$base64);
}
?>
...
<audio controls autobuffer>
<source src="<?php echo data_uri('sample.mp3'); ?>" type="audio/mpeg" />
</audio>
...
EDIT 2
Gran idea, pero parece que no está funcionando ... Safari para OS X -> OK; Safari para iOS -> sigue teniendo el mismo problema que antes.
<?php
function base_64_string($file) {
$contents = file_get_contents($file);
return base64_encode($contents);
}
?>
...
<audio controls autobuffer>
<source id="sound-src" src="sample.mp3" type="audio/mpeg" />
</audio>
...
<script>
(function(){
var sound;
if (localStorage.getItem('cachedSound')) {
sound = localStorage.getItem('cachedSound');
}
else {
sound = "<?php echo base_64_string('sample.mp3'); ?>";
localStorage.setItem('cachedSound',sound);
}
document.getElementById("sound-src").src='data:audio/mpeg;base64,' + sound;
})();
</script>
¿Comprobó que el contenido del manifiesto realmente se descargó? Tal vez sea solo un error tipográfico ... – andreapier
Sin saber más acerca de QUÉ estás haciendo, es muy difícil decir si es tu código o no. – livingtech
Ejemplo de código agregado. – shaun5