quedan - donde se guardan los archivos descargados de safari en iphone
Reproducir automáticamente archivos de audio en un iPad con HTML5 (15)
A partir de iOS 4.2.1, ni el clic falso ni el truco .load () funcionarán para reproducir automáticamente el audio en cualquier dispositivo iOS. La única opción que conozco es hacer que el usuario realice realmente una acción de clic y comience la reproducción en el controlador de evento click sin envolver la llamada .play () en nada asincrónico (ajax, setTimeout, etc.).
Alguien por favor dime si estoy equivocado. Tuve lagunas de trabajo tanto para iPad como para iPhone antes de la actualización más reciente, y todas parecen cerradas.
Estoy tratando de obtener un archivo de audio para reproducir automáticamente en Safari en un iPad. Si voy a la página usando Safari en mi Mac, está bien. En el iPad, la reproducción automática no funciona.
Apple no es compatible con el estándar por completo, pero hay una solución. Su justification es la congestión de la red celular, tal vez porque aterrizará en páginas que reproducen audio aleatorio. Este comportamiento no cambia cuando un dispositivo se enciende wifi, tal vez por coherencia. Por cierto, esas páginas suelen ser una mala idea de todos modos. No deberías tratar de poner una banda sonora en cada página web. Eso está mal. :)
El audio html5 se reproducirá si se inicia como resultado de una acción del usuario. Cargando una página no cuenta. Por lo tanto, debe reestructurar su aplicación web para que sea una aplicación todo en una página. En lugar de un enlace que abre una página que reproduce audio, necesita ese enlace para reproducirlo en la página actual, sin un cambio de página. Esta regla de "interacción del usuario" se aplica a los métodos html5 a los que puede llamar en un elemento de audio o video. Las llamadas vuelven sin ningún efecto si se activan automáticamente al cargar la página, pero funcionan cuando se las llama desde los controladores de eventos.
Apple rechaza de manera molesta muchos estándares web HTML5 en sus dispositivos iOS, por una variedad de razones comerciales. En última instancia, no puede precargar o reproducir automáticamente los archivos de sonido antes de un evento táctil, solo reproduce un sonido a la vez, y no es compatible con Ogg / Vorbis. Sin embargo, encontré una solución ingeniosa para permitirle tener un poco más de control sobre el audio.
<audio id="soundHandle" style="display:none;"></audio>
<script type="text/javascript">
var soundHandle = document.getElementById(''soundHandle'');
$(document).ready(function() {
addEventListener(''touchstart'', function (e) {
soundHandle.src = ''audio.mp3'';
soundHandle.loop = true;
soundHandle.play();
soundHandle.pause();
});
});
</script>
Básicamente, empiezas a reproducir el archivo de audio en el primer evento táctil, luego pausas de inmediato. Ahora puede usar los comandos soundHandle.play () y soundHandle.pause () en su Javascript y controlar el audio sin tocar eventos. Si puedes sincronizarlo perfectamente, solo tienes que hacer una pausa justo después de que el sonido haya terminado. Luego, la próxima vez que lo juegues de nuevo, volverá al principio. Esto no resolverá todo el lío que Apple ha creado aquí, pero es una solución.
Confirmo que el audio no funciona como se describe (al menos en iPad con 4.3.5). El problema específico es que el audio no se cargará en un método asíncrono (ajax, evento del temporizador, etc.) pero se reproducirá si se precargó. El problema es que la carga tiene que estar en un evento desencadenado por el usuario. Entonces, si puede tener un botón para que el usuario inicie la reproducción, puede hacer algo como:
function initSounds() {
window.sounds = new Object();
var sound = new Audio(''assets/sounds/clap.mp3'');
sound.load();
window.sounds[''clap.mp3''] = sound;
}
Luego, para jugarlo, por ejemplo, en una solicitud de Ajax, puedes hacer
function doSomething() {
$.post(''testReply.php'',function(data){
window.sounds[''clap.mp3''].play();
});
}
No es la mejor solución, pero puede ser útil, especialmente sabiendo que el culpable es la función de carga en un evento no desencadenado por un usuario.
Editar: Encontré la explicación de Apple, y afecta a iOS 4+: http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html
Esto parece funcionar:
<html>
<title>
iPad Sound Test - Auto Play
</title>
</head>
<body>
<audio id="audio" src="mp3test.mp3" controls="controls" loop="loop">
</audio>
<script type="text/javascript">
window.onload = function() {
var audioPlayer = document.getElementById("audio");
audioPlayer.load();
audioPlayer.play();
};
</script>
</body>
</html>
Véalo en acción aquí: http://www.johncoles.co.uk/ipad/test/1.html (Archivado)
A partir de iOS 4.2 esto ya no funciona. Lo siento.
Funciona con jQuery, probado en Ipad v.5.1.1
$(''video'').get(0).play();
Tienes que anexar / eliminar el elemento de video de la página.
Intente llamar al método .load () antes del método .play () en la etiqueta de audio o video ... que será HTMLAudioElement o HTMLVideoElement respectivamente. ¡Esa era la única forma en que funcionaría en el iPad para mí!
La reproducción automática no funciona en el iPad o iPhone, ya sea para el video o las etiquetas de audio. Esta es una restricción establecida por Apple para salvar el ancho de banda de los usuarios.
Manejé esto al adjuntar un controlador de eventos para todos los eventos para los que se permite activar el audio del elemento del cuerpo que activa cualquier elemento de audio html con reproducción automática para jugar una vez.
var mobile = /iPad|iPhone|iPod|android/.test(navigator.userAgent) && !window.MSStream;
if (mobile) {
$(''body'').on(''touchstart click doubleclick keydown'', function() {
$("audio[autoplay=''autoplay'']").each(
function(){
this.play();
this.removeAttribute(''autoplay'');
});
});
}
Me he quedado perplejo al desarrollar una aplicación web de prototipo rápido en iOS4.2 (desarrollo dev). La solución es bastante simple. Tenga en cuenta que parece que ya no tiene la etiqueta en su página HTML, en realidad tiene que insertar la etiqueta en el documento de forma dinámica (tenga en cuenta que este ejemplo usa Prototype 1.7 para obtener algo de gracia extra de JavaScript):
this.soundFile = new Element("audio", {id: "audio-1", src: "audio-1.mp3", controls: ""});
document.body.appendChild(this.soundFile);
this.soundFile.load();
this.soundFile.play();
Como no ha configurado un controlador, no debería haber ninguna necesidad de hacer nada truculento con CSS para ocultarlo / colocarlo fuera de la pantalla.
Esto parece funcionar perfectamente.
Me parece que la respuesta a esta pregunta está (al menos ahora) claramente documentada en los documentos de Safari HTML5 :
Control de usuario de descargas a través de redes celulares
En Safari en iOS (para todos los dispositivos, incluido el iPad), donde el usuario puede estar en una red celular y se le puede cobrar por unidad de datos, la precarga y la reproducción automática están desactivadas. No se cargan datos hasta que el usuario lo inicia. Esto significa que los métodos JavaScript play () y load () también están inactivos hasta que el usuario inicia la reproducción, a menos que el método play () o load () se active por acción del usuario. En otras palabras, un botón Play iniciado por el usuario funciona, pero un evento onLoad = "play ()" no funciona.
Esto reproduce la película: <input type="button" value="Play" onClick="document.myMovie.play()">
Esto no hace nada en iOS: <body onLoad="document.myMovie.play()">
Mi solución se desencadena desde un evento táctil real en un menú anterior. No te obligan a usar una interfaz de jugador específica, por supuesto. Para mis propósitos, esto funciona bien. Si no tienes una interfaz existente para usar, afaik estás enloquecido. Tal vez podrías probar los eventos de inclinación o algo ...
Si creas un elemento de audio usando:
var a = new Audio("my_audio_file.wav");
Y agregue un detector de eventos suspend
través de:
a.addEventListener("suspend", function () {console.log(''suspended'')}, false);
Y luego cargue el archivo en Safari móvil (iPad o iPhone), verá que el ''suspendido'' se registra en la consola del desarrollador. De acuerdo con las especificaciones de HTML5, esto significa que "el agente de usuario no está buscando intencionalmente datos de medios, pero no tiene todo el recurso de medios descargado".
Llamar a una a.load () posterior, probar el evento "canplay" y luego usar a.play () parece ser un método adecuado para activar automáticamente el sonido.
También me gustaría enfatizar que la razón por la que no puedes hacer esto es una decisión de negocios que Apple tomó, no una decisión técnica. A saber, no había una justificación técnica racional para que Apple desactive el sonido de las aplicaciones web en el iPod Touch. Es solo un dispositivo WiFi, no un teléfono que puede incurrir en costosos cargos de ancho de banda, por lo que ese argumento no tiene ningún mérito para ese dispositivo. Pueden decir que están ayudando con la administración de la red WiFi, pero cualquier problema con el ancho de banda en mi red WiFi es mi preocupación, no la de Apple.
Además, si lo que realmente les importaba era evitar el consumo excesivo de ancho de banda no deseado, proporcionarían una configuración para permitir a los usuarios optar por los sonidos de las aplicaciones web. Además, harían algo para evitar que los sitios web consuman ancho de banda equivalente por otros medios. Pero no hay tales restricciones. Un sitio web puede descargar enormes archivos en segundo plano una y otra vez y a Apple no le importa eso. Y finalmente, creo que los sonidos se pueden descargar de todos modos, ¡POR LO QUE NO SE GUARDARÁ NINGÚN ANCHO DE BANDA! Apple simplemente no les permite jugar automáticamente sin la interacción del usuario, lo que los hace inutilizables para los juegos, que por supuesto es su verdadera intención.
Apple bloqueó el sonido porque empezaron a notar que las aplicaciones HTML5 pueden ser tan capaces como las aplicaciones nativas, si no más. Si desea sonido en las aplicaciones web, debe presionar a Apple para que deje de ser anticompetitivo como Microsoft. No hay ningún problema técnico que pueda solucionarse aquí.
ACTUALIZACIÓN: Este es un truco y ya no funciona en IOS 4.X y superior. Éste trabajó en IOS 3.2.X.
No es verdad. Apple no quiere reproducir automáticamente video y audio en IPad debido a la gran cantidad de tráfico que puede usar en redes móviles. No usaría reproducción automática para contenido en línea. Para los sitios HTML sin conexión es una gran característica y es para lo que la he usado.
Aquí hay una solución de "clic falso de JavaScript": http://www.roblaplaca.com/examples/html5AutoPlay/
Copiar y pegar el código del sitio:
<script type="text/javascript">
function fakeClick(fn) {
var $a = $(''<a href="#" id="fakeClick"></a>'');
$a.bind("click", function(e) {
e.preventDefault();
fn();
});
$("body").append($a);
var evt,
el = $("#fakeClick").get(0);
if (document.createEvent) {
evt = document.createEvent("MouseEvents");
if (evt.initMouseEvent) {
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
el.dispatchEvent(evt);
}
}
$(el).remove();
}
$(function() {
var video = $("#someVideo").get(0);
fakeClick(function() {
video.play();
});
});
</script>
Esta no es mi fuente. Encontré esto hace algún tiempo y probé el código en un iPad e iPhone con IOS 3.2.X.