Mobile Safari: audio + manifiesto de caching

Tengo una pequeña aplicación web, que reproduce bits de sonido realmente cortos con solo hacer clic en varios botones. Dirige explícitamente Safari mobile en iOS (iPad).

Después de leer aquí y en otro lugar sobre las varias "deficiencias" del audio HTML5 en este context en el Safari mobile y probar algunos "trucos" y trucos, estoy atrapado en una situación en la que Safari parece simplemente (por la falta de una palabra mejor) roto:

Puedo reproducir el sonido A (tarda mucho time para que comience, asumo que está volviendo a bajar [de nuevo]) con el clic del button A. Después de eso, onclick en el button B se reproducirá de inmediato el sonido A de nuevo. Lo mismo para el button C. En algunos casos, reproducirá un sonido diferente, a veces incluso el correcto. Pero sobre todo suena A. El formatting en uso fue .aiff, ahora es .m4a.

Después de escribir algunas pequeñas versiones yo mismo, decidí ir con la biblioteca de Buzz para manejar el sonido de carga / reproducción / etc …

Curiosamente, su demostración incluye un juego, que hace exactamente lo que necesito y desencadena el mismo comportamiento defectuoso. Incluso terminé en una situación en la que cualquier reproductor de audio en Safari mobile en cualquier pestaña reproduciría un sonido determinado del juego de demostración de Buzz (!).

Tenía la esperanza de que un manifiesto de caching podría ayudar a superar las limitaciones de precarga de Apple y obligar a la aplicación a reproducir el sonido justo después de presionar el button en modo fuera de línea. Pero después de confirmar que toda la aplicación había sido almacenada en caching, no puedo reproducir / escuchar ningún sonido en modo fuera de línea.

¿Alguien ha conseguido que algo así funcione de alguna manera? (- Después de haber visto cómo Apple maneja ciertas cosas, no espero mucha respuesta, sin embargo …)


Actualización 1:

El ejemplo de esta respuesta produce el mismo efecto: Cómo sintetizar audio usando HTML5 / Javascript en iPad


Actualización 2:

La actualización de iOS (y Safari) parece resolver el error de audio. Sin embargo, el manifiesto de caching no parece afectar a los files de audio. Estos files simplemente no están disponibles en absoluto.

Después de eliminar el manifiesto de caching, la aplicación funciona bien, pero agregarlo a la "pantalla de inicio" y volver a cargarlo evita que el audio se reproduzca también.

Me gustaría poder decirte que hay una fórmula mágica para que todos tus medios html5 funcionen perfectamente, pero no lo hay. El soporte mobile para audio / video HTML5 es bastante pobre en este momento; mucho más atrás que sus pnetworkingecesores de escritorio. Para empeorar las cosas, cada una de las diferentes plataforms lo maneja de manera diferente y la mayoría solo lo soporta en versiones semi-recientes.

Sin embargo, hay algunos trucos que puede emplear para que los files multimedia funcionen correctamente en el Safari mobile. Para explicarlos, necesitará comprender algunas de sus deficiencias.


1) No puede cargar varios files de audio / video

Ha sido mi experiencia que el browser solo cargará un file a la vez. Si reproduce un file, vaya y juegue otro, y luego regrese y simplemente cargará ese file nuevamente. Y, aunque no lo intenté yo mismo, no creo que un manifiesto de caching te ayude aquí.

Lo que tenía que hacer es combinar todos mis files de audio en un file de audio grande. Luego, dependiendo de la pista de audio que se solicitó, movería la position de reproducción a la position de inicio adecuada y reproduciría esa pista. Luego, usaría un setInterval para examinar la reproducción cada pocos milisegundos para determinar si la position de reproducción actual tocaba el final de la pista. Una vez que lo hizo, lo detuve. Pluis, me di unos segundos (2-3) entre cada pista, solo en caso de que la CPU del teléfono estuviera bajo mucha carga y verificaba la alimentación un poco tarde.

2) No puede reproducir automáticamente files de audio / video

Apple incorporó en su tecnología de tags de medios HTML5 la limitación de que estas pistas solo se cargarían y reproducirían en respuesta a un evento de clic del usuario. De esa manera, los desarrolladores no podían reproducir automáticamente pistas molestas cuando visitaba sus sitios web.

Cuando estaba usando tags de audio / video, estaba tratando de crear un anuncio de Rich Media. Así que conecté mi carga de audio / pistas al evento de clic de banner, cuando presionas un banner y expandes el anuncio.

Lo que te sugiero que hagas es que aparezca una pequeña window emergente de lightbox, preguntando al usuario si quieren activar o desactivar el sonido. Puede adjuntar sus funciones de carga al evento de clic de ese cuadro emergente, independientemente de si el usuario enciende o apaga el sonido.

Personalmente, no tuve mucha suerte usando la function load (). Ejecutaría esa function para cargar el audio y luego hacer clic en reproducir y simplemente lo volvería a cargar. Podría haber sido siempre que simplemente no lo hice bien, así que siéntete libre de probarme mal y conseguir que funcione. Lo que sucedió es que le dije a la pista que tocara, para que así comenzara a cargarse, y luego usaría un setInterval para ver si el time de reproducción actual aumentaba solo unos pocos milisegundos. Una vez que noté que comenzó a reproducir la pista, inmediatamente la detengo.

3) Las tags de audio / video solo son compatibles con iOS 4.0 y versiones posteriores.

No hay truco para evitar esto. Es solo los hechos.


Aquí hay algunos sitios que ayudaron cuando estaba desarrollando con tags de audio / video:

http://www.w3.org/wiki/HTML/Elements/video
http://dev.w3.org/html5/spec-author-view/video.html#media-elements

¡Buena suerte!