2010-05-25 13 views
17

Tengo una galería de videos dinámica y funciona muy bien en una computadora. Cuando se mueve a un iPad, el video comienza a cargarse y muestra el ícono de no se puede reproducir. En lugar de esto, preferiría que el video no se muestre hasta que esté listo para jugar. He tratado de agregar oyentes de eventos para "canplaythrough" y "canplay" y cuando ocurren para que el video se desvanezca y luego se reproduzca. ¿El iPad no es compatible con estos eventos?video HTML5 en el iPad

new_video = document.createElement('video'); 
new_video.setAttribute('class', 'none'); 
new_video.setAttribute('width', '568'); 
new_video.setAttribute('height', '269'); 
new_video.setAttribute('id', 'video'+video_num); 
current_video.insertBefore(new_video, video_controls); 
new_video.load(); 
new_video.addEventListener('canplaythrough', function() { 
    $('#video'+video_num').fadeIn(100); 
    new_video.play(); 
}); 
+2

¿Qué códec usa tu video? Safari y Firefox difieren en el códec de video que ambos admiten. (aunque afortunadamente Google está a punto de cambiar eso) – Earlz

+0

Estoy usando h.264 – mrollinsiv

+0

video confiable en el iPad es el lío más inimaginable - la gran cantidad de soluciones que he tenido que idear me sorprende –

Respuesta

1

Compruebe si el navegador puede reproducir el vídeo antes de intentar cargarlo:

function canPlayVorbis() { 
    var v = document.createElement('video'); 
    return !!(v.canPlayType && v.canPlayType('video/ogg; codecs="theora, vorbis"').replace(/no/, '')); 
} 

function canPlayMP4() { 
    var v = document.createElement('video'); 
    return !!(v.canPlayType && v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '')); 
} 

function canPlayWebM() { 
    var v = document.createElement('video'); 
    return !!(v.canPlayType && v.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, '')); 
} 

Tomado de Dive Into HTML5 Appendix A.

+0

lamentablemente ese no es el problema . El iPad es compatible con video h.264 y ese es el video que estoy cargando. El problema es que cuando el video se está cargando, muestra el signo de no se puede reproducir hasta que se haya cargado lo suficiente. Quiero ocultar este elemento de video todos juntos hasta que esté listo para reproducirse a través de – mrollinsiv

+0

En ese caso, tal vez necesite ocultar el elemento de alguna manera y consultar el estado listo (sin importar qué tan bien sea compatible): http: // dev.w3.org/html5/spec/video.html#the-ready-states – robertc

4

En el iPad no se cargará el video hasta que el usuario inicie un evento, esto es por diseño de manzana para evitar que los usuarios de iPhone o iPad quemen sus planes de datos. Entonces no podrás hacer lo que quieras, lo siento.

Consulte este link y busque la sección Consideraciones específicas del dispositivo para obtener más información. Pero no comenzará a cargar datos, por lo que no podría disparar el evento canplaythrough hasta que el usuario lo toque.

+0

justo eso lo entiendo, así que lo que sucede es que llamo a new_video.load(); después de que el usuario haga clic en un video. Después de eso adjunto los oyentes del evento. En teoría, esto debería funcionar, ya que una vez que el usuario hace clic en el video, se carga y luego se agregan todos los oyentes del evento. – mrollinsiv

+0

Después de llamar a cargar, el usuario hace clic en el video y comenzará a reproducirse tan pronto como sea posible. No creo que los eventos se disparen de tal manera que te permitan desvanecerse en el video. –

+0

Esta respuesta parece ser correcta: recibo los eventos de canplay y can playthrough solo una vez que el usuario ha hecho clic en el video. –

1

se inicia automáticamente en el reproductor para ipad/iphone:

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 = $("#mobileVideo").get(0); 

    fakeClick(function() { 
     video.play(); 
    }); 
}); 
+3

Acabo de probarlo. Ya no funciona, [presuntamente desde iOS 4.X] (http://stackoverflow.com/questions/3009888/autoplay-audio-files-on-ipad-with-html5/3056220#3056220). – feklee

7

La manera de resolver este problema visual es ocultar el elemento de vídeo hasta que esté listo para ser jugado. Tenga en cuenta que no puede establecer display:none (el video no se cargará si lo hace) y visibility:hidden tampoco resolverá el problema.

Para solucionarlo, ajuste el elemento de video en un DIV con overflow:hidden y configure -webkit-transform:translateX(1024px) (un número lo suficientemente alto como para empujar el video fuera de la pantalla).

Que usted tiene que escuchar los canplay o canplaythroughload o eventos (en base a su necesidad) y establecer el translateX a cero después de eso.

+1

Dos cosas que no están directamente relacionadas con la respuesta: - En lugar de cambiar la opacidad del video, generalmente es un mejor enfoque para cambiar la opacidad de una superposición en la parte superior del elemento de video. (la opacidad no funciona en elementos de video en Google Chrome si la aceleración de la GPU no está habilitada) - Evite usar 'setAttribute', use en su lugar las propiedades DOM:' video.id', 'video.className',' video.width ', etc. –

1

el problema parece estar creando dinámicamente el objeto de vídeo - que de alguna manera rompe el código en el IPAD. Escribí un reproductor de video que mueve el presente elemento de video presente en un contenedor e inmediatamente el video deja de funcionar. sin embargo, no hay problema en otros sistemas ... supongo que tienes que encontrar la manera de tener el elemento de video en su lugar y luego agregar todos tus otros códigos arriba y abajo ...

1

cuenta de esto es una cuestión de edad, pero si alguien se tropieza otra persona a través de esto, me encontré con un problema similar.

Al observar los eventos enviados por el elemento de video, parece que el iPad comenzará a cargar el video y luego lo suspenderá casi inmediatamente (parece ser simultáneo con el primer evento de 'progreso').

Se no fuego los eventos "canplaythrough" hasta "canplay" o después de la reproducción ha comenzado realmente, por lo que debe escuchar a uno de los 3 eventos que hacen fuego antes de la reproducción se inicie:

  • loadstart
  • progreso
  • suspender

que cambiaría su mango r a 'loadstart' y dar una oportunidad.