2011-10-22 19 views
6

Tengo una pequeña aplicación web, que reproduce bits de sonido realmente cortos con el clic de varios botones. Se dirige explícitamente a Safari móvil en iOS (iPad).Safari móvil: manifiesto de audio + caché

Después de leer aquí y en otro lugar sobre las varias "deficiencias" de audio HTML5 en este contexto en el Safari móvil y probando algunos "trucos", estoy atrapado en una situación donde Safari parece simple (por la falta de una palabra mejor) roto:

Puedo reproducir el sonido A (tarda mucho tiempo para que comience - supongo que está descargando [de nuevo]?) con el clic del botón A. Después de eso, haga clic en el botón B reproducirá inmediatamente el sonido A nuevamente. Lo mismo para el botón C. En algunos casos, reproducirá un sonido diferente, a veces incluso el correcto. Pero principalmente sonido A. El formato en uso era .aiff, ahora es .m4a.

Después de escribir unas pocas versiones diminutas a mí mismo, decidí ir con la biblioteca Buzz para manejar la carga de sonido/juego/etc ..

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

Esperaba que un manifiesto de caché pudiera ayudar a superar las limitaciones de precarga de Apples y forzar a la aplicación a reproducir el sonido justo después de presionar el botón en modo fuera de línea. Pero después de confirmar que toda la aplicación había sido almacenada en la memoria caché, no puedo reproducir/escuchar ningún sonido en modo fuera de línea.

¿Alguien ha logrado que algo como esto funcione de alguna manera? (- Después de haber visto cómo Apple se encarga de ciertas cosas, yo no esperes mucho la respuesta, aunque ...)


Actualización 1:

El ejemplo de esta respuesta provoca el mismo efecto: How to synthesize audio using HTML5/Javascript on iPad


actualización 2:

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

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

Respuesta

7

Ojalá pudiera decirles que hay una fórmula mágica para que todos sus medios html5 funcionen perfectamente, pero no los hay. El soporte móvil para audio/video HTML5 es bastante pobre en este momento; mucho más atrás que sus predecesores de escritorio. Para empeorar las cosas, cada una de las diferentes plataformas lo maneja de manera diferente y la mayoría de ellas solo lo admiten en versiones semi-recientes.

Sin embargo, hay algunos trucos que puede emplear para que los archivos multimedia funcionen correctamente en Safari móvil. Para explicarlos, necesitarás entender algunas de sus deficiencias.


1) No se puede cargar varios archivos de vídeo/audio

Ha sido mi experiencia que el navegador sólo se carga un archivo a la vez. Si juegas un archivo, ve y juega otro, y luego regresa y simplemente cargará ese archivo de nuevo. Y, aunque no lo intenté yo mismo, no creo que un manifiesto de caché te ayude aquí.

Lo que tuve que hacer es combinar todos mis archivos de audio en un archivo de audio de gran tamaño. Luego, dependiendo de qué pista de audio se solicitó, movería la posición de reproducción a la posición de inicio apropiada y reproduciría esa pista. Luego, utilizaría un setInterval para examinar la reproducción cada pocos milisegundos para determinar si la posición de reproducción actual toca el final de la pista. Una vez que lo hizo, lo detuve. Pluis, me di unos segundos (2-3) entre cada canción, solo en caso de que la CPU del teléfono tuviese mucha carga y comprobé la alimentación un poco tarde.

2) No se puede auto-reproducir archivos de audio/vídeo

Apple incorporado en su tecnología de etiquetas de medios HTML5 la limitación de que estas pistas serían solamente cargar y reproducir en respuesta a un evento de clic del usuario. De esa forma, los desarrolladores no podían reproducir automáticamente pistas molestas cuando visitabas sus sitios web.

Cuando estaba usando etiquetas de audio/video, intentaba crear una publicidad en rich media. Así que conecté la carga de audio/pistas al evento de clic de banner, cuando haces clic en un banner y expandes el anuncio.

Lo que sugeriría es que haga aparecer una pequeña ventana emergente, preguntándole al usuario si desea activar o desactivar el sonido. Puede adjuntar sus funciones de carga al evento click de ese cuadro emergente, independientemente de si el usuario enciende o apaga el sonido.

Personalmente, no tuve mucha suerte con la función load(). Me gustaría ejecutar esa función para cargar el audio y luego haga clic en reproducir y simplemente cargarlo de nuevo. Siempre podría haber sido que no lo hice bien, así que siéntete libre de probar que estoy equivocado y haz que funcione. Lo que hice fue que le dije a la pista que debía jugar, para que así comenzara a cargar, y luego usaría un setInterval para ver si el tiempo de reproducción actual aumentaba solo unos pocos milisegundos. Una vez que noté que comenzó a tocar la pista, inmediatamente la detuve.

3) etiquetas de audio/vídeo sólo se admiten en iOS 4.0 y superior

no hay truco para conseguir alrededor de esto. Son solo los hechos.


Aquí hay algunos sitios que ayudaron cuando cuando se estaba desarrollando con las etiquetas de audio/vídeo:

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

Buena suerte!

+0

¡Muchas gracias! Aquí hay muchos buenos consejos. Definitivamente voy a probar algunas cosas. – polarblau

+0

Una cosa adicional que debes saber es que es imposible almacenar en caché audio o video en iOS. Incluso con aplicación. – idbehold

+0

puede dar un ejemplo de código para - mover la posición de reproducción a la posición de inicio adecuada. Además, si quieres tocar la canción durante 3 segundos, ¿cómo la paras? – Jon

Cuestiones relacionadas