2012-03-26 12 views
6

Tengo un video html5 que estoy intentando configurar devoluciones de llamada en ciertos intervalos durante la reproducción. El video comienza a reproducirse desde javascript con video.play(). En este momento mi código escucha el evento 'loadedmetadata', luego consulta la duración y configura esas devoluciones de llamada. Funciona bien en safari móvil, pero no en Android (2.3.4 y 2.3.7).Android video.duration no se carga hasta que video.play()

En Android, 'loadedmetadata' parece emitirse antes de que la duración esté realmente disponible. Para probar esto, registré la duración en cada paso del proceso de carga en mi código para ver dónde se puede leer realmente. Hasta video.play() y después de un evento 'timeupdate', la propiedad video.duration es 6000, independientemente del video que se use. Probé esto con un archivo mp4 y un archivo de 3gp. Una vez que se cumplen esas condiciones, la duración real está disponible.

Encontré esta otra publicación con problemas similares [1]. La respuesta más votada que no fue aceptada es cómo configuré esto originalmente, y funciona bien en iOS. La respuesta aceptada tampoco funciona, y sugiere que se trata de un problema de webkit. Registro la propiedad video.readyState y veo que es '4' antes de que el video comience a reproducirse, pero la duración aún no está disponible hasta después de que comienza a reproducirse, y el primer evento 'timeupdate'.

Nuestra solución actual es consultar el valor video.duration, y solo configurar las devoluciones de llamada de eventos cuando video.duration !== 6000. Esto es bastante feo y me gustaría llegar al fondo del asunto, para que este truco no vuelva a ser malo. Una discusión aquí [2] parece sugerir que el problema puede estar relacionado con la codificación. Es decir, no está codificado correctamente, Android no lee los metadatos correctamente hasta que se carga el archivo, o tal vez nada y calcula la duración de otra manera.

¿Hay algo que pueda hacer para hacer este limpiador, o estoy atrapado con el truco por ahora?

[1] Problem retrieving HTML5 video duration

[2] http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/

+2

He usado un oyente 'v.addEventListener ('durationchange', repos, false);' para seguir el cambio, pero sí ... parece que es un problema de WebView/Video en muchas de las compilaciones de Android – Offbeatmammal

+1

El dispositivo móvil tiene sus propias limitaciones, por lo que no carga todo lo que hace un navegador de escritorio, en el navegador Android, el video no se llama hasta que juegas, ya que eso ahorrará ancho de banda y reducirá el uso de memoria/buffer. Creo que ahí puedes hacer por defecto, juega y luego usa un script que detendrá el video después de 1-2 segundos ... que debería servir para tu propósito ... – MarmiK

Respuesta

0

Id utilizar un setTimeout que llama a una función para verificar si la duración está disponible de forma recursiva.

De esta forma, la función puede tan pronto como haya información disponible, mostrar etc. la duración.

Cuestiones relacionadas