La devolución de llamada de audio HTML5 falla en Safari/iOS

Creé una aplicación, diseñada para reproducir cada sonido a medida que el primero finaliza usando el evento 'terminado'.

En mi versión inicial, cada sonido tiene su propio elemento de audio, lo que resulta en algo como:

   function play_next_audio(){
        speaker = $('audio#' + sounds[i++]).get(0);
        speaker.addEventListener('ended',play_next_audio);
        speaker.play();
   }

Esto funciona muy bien en todos los navegadores de escritorio, incluido Safari, pero no va más allá de la primera letra en iOS.

También probé un enfoque diferente: un solo elemento de audio que carga cada sonido por turno. Allí experimenté vinculando el evento 'finalizado', así como cargando primero y vinculando el evento 'canplaythrough' en su lugar. En ambos casos, no funciona ni siquiera en el escritorio de Safari, esta vez jugando con éxito el primero. dos letras.

Aquí está la prueba aislada:

http://dev.connectfu.com:42001/app/test-sounds.html

Tenga en cuenta que audio.load() está comentado en varios lugares; tenerlo dentro o fuera parece no hacer ninguna diferencia.

¿Qué estoy haciendo mal? ¿Cómo puedo reproducir series de sonidos en iOS? ¡Muchas gracias por la ayuda!

preguntado el 11 de junio de 12 a las 19:06

te ayudo mi respuesta? Si es así, márquelo como respuesta aceptada. ¡Gracias! -

2 Respuestas

actualización A partir de 2017, el evento finalizado no se activa en Safari (o Chrome) en iOS bajo varias condiciones. Puede encontrar más información aquí: Es casi 2017 y el audio HTML5 todavía no funciona en iOS.


He construido un reproductor de audio HTML5 (Radio Mesiánica Chavah) que "funciona" en Safari en iOS.

Por "funciona", quiero decir, juega lo mejor que puede en el iOS paralizado de Apple implementación. En el momento de escribir este artículo, esto incluye iOS 5. Lo probé en iPhone 3 y posteriores, y iPad original, iPad 2 y iPad 3.

Aquí están mis hallazgos:

  • Apple no le permite llamar a .play en ningún audio hasta la interacción del usuario. Para mí, esto significa detectar iOS y luego mostrar la música como pausada hasta que el usuario haga clic en reproducir. Su razonamiento es que esto consumirá datos y batería; en la práctica, sin embargo, paraliza las aplicaciones web y sofoca la evolución de la web.
  • Si desea reproducir sonidos sucesivos (uno tras otro), utilice un solo elemento. Cuando sea el momento de reproducir el siguiente sonido, configure el archivoexistentAudio.src, luego llame aexistentAudio.load(), luego llame aexistentAudio.play(). Esto le permitirá reproducir sonidos sucesivos.
  • Los eventos de audio no se disparan si Safari está en segundo plano.. Si bien el audio continuará reproduciéndose si el usuario cambia a una aplicación diferente, el evento .ended no se activará. Esto significa que es prácticamente imposible crear una aplicación de reproductor de música.

Espero que esto ayude.

<despotricar>

Mientras tanto: Apple, por favor, por favor, danos mejor soporte para HTML5 en iOS Safari. Aquí están tus elementos de acción, Apple:

  1. Deje que el audio HTML5 funcione en segundo plano.
  2. Apoya a OGG.
  3. Admite precarga de audio.
  4. Soporta audio concurrente.
  5. Reproduzcamos audio sin interacción del usuario.

Haz esas cosas, Apple, serás el líder de la industria en audio móvil HTML5, todos te emularán, una vez más estarás liderando el camino y las aplicaciones web funcionarán perfectamente en tus plataformas, mientras que quedarán paralizadas en otras plataformas móviles. . Sí, estas funciones usarán datos y la batería, pero las aplicaciones nativas ya lo hacen. Deje de paralizar las aplicaciones web y sea el líder. Hacer HTML5 un ciudadano de primera clase en iOS.

Respondido el 23 de diciembre de 16 a las 17:12

No creo que el método .play() sea compatible con audio o video en iOS. A Apple no le gusta la idea de que los videos o el audio se reproduzcan automáticamente al visitar una página.

Aquí hay una lectura útil sobre el estado del soporte de audio HTML5 en todas las plataformas: http://www.phoboslab.org/log/2011/03/the-state-of-html5-audio

Respondido el 12 de junio de 12 a las 04:06

Cerrar. No hay nada malo con .play() - es .load() el problema. Todavía estoy investigando. :-)- kateyoak

Como Judah mencionó a continuación, el .play no se puede llamar sin la interacción del usuario. - Brett Holt

Además, Apple suspende la ejecución de JavaScript cuando la página no está en primer plano. Entonces, si cambia de aplicación, cambia de pestaña, apaga la pantalla o deja que la pantalla entre en reposo, no podrá llamar a .play(). - Judá Gabriel Himango

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.