2010-05-25 6 views
17

J'ai une galerie vidéo dynamique et cela fonctionne très bien sur un ordinateur. Lorsque vous passez à un iPad, la vidéo commence à se charger et l'icône ne peut pas être lue. Au lieu de cela, je préférerais que la vidéo n'apparaisse pas avant d'être prête à jouer. J'ai essayé d'ajouter des écouteurs d'événements pour "Canplaythrough" et "Canplay" et quand ils se produisent pour la vidéo de fondu avant de jouer. L'iPad ne prend-il pas en charge ces événements?HTML5 vidéo sur 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

Quel codec utilise votre vidéo? Safari et Firefox diffèrent sur le codec vidéo qu'ils supportent tous les deux. (bien que j'espère que Google est sur le point de changer cela) – Earlz

+0

J'utilise h.264 – mrollinsiv

+0

vidéo fiable sur l'iPad est le désordre le plus inimaginable - le grand nombre de solutions de contournement que j'ai eu à me surprendre –

Répondre

1

Vérifiez si le navigateur peut lire la vidéo avant de tenter de le charger:

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/, '')); 
} 

Taken de Dive Into HTML5 Appendix A.

+0

malheureusement ce n'est pas le problème . L'iPad prend en charge la vidéo h.264 et c'est la vidéo que je charge. Le problème est que lorsque la vidéo est en cours de chargement, le signe ne peut pas être lu jusqu'à ce que le chargement soit suffisant. Je veux masquer cet élément vidéo jusqu'à ce qu'il soit prêt à être lu jusqu'au bout – mrollinsiv

+0

Dans ce cas, vous devrez peut-être masquer l'élément et interroger l'état prêt (aucune idée de la façon dont il est supporté): http: // dev.w3.org/html5/spec/video.html#the-ready-states – robertc

4

Sur l'iPad, il ne sera pas charger la vidéo jusqu'à ce qu'un utilisateur démarre un événement c'est par conception de pomme pour empêcher les utilisateurs iPhone ou iPad de brûler leurs plans de données. Donc, vous ne serez pas en mesure de faire ce que vous voulez désolé.

Consultez ce link et recherchez la section Considérations spécifiques au périphérique pour plus d'informations. Mais il ne commencera pas à charger les données de sorte qu'il ne pourrait pas déclencher l'événement canplaythrough jusqu'à ce qu'un utilisateur le touche.

+0

à droite, je reçois ça, alors qu'est-ce que j'appelle new_video.load(); après que l'utilisateur clique sur une vidéo. Après cela, je joins les auditeurs de l'événement. Ceci en théorie devrait fonctionner car une fois que l'utilisateur clique sur la vidéo, il appelle le chargement puis il ajoute tous les écouteurs d'événement. – mrollinsiv

+0

Après avoir appelé load, l'utilisateur clique sur la vidéo qu'il va commencer à jouer dès que possible. Je ne pense pas que les événements se déclencheront de telle sorte que vous pourrez vous fondre dans la vidéo. –

+0

Cette réponse semble être correcte - Je reçois les événements Canplay et Canplaythrough seulement une fois que l'utilisateur a cliqué sur la vidéo. –

1

démarre automatiquement sur le lecteur 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

Juste testé. Ne fonctionne plus, [prétendument depuis iOS 4.X] (http://stackoverflow.com/questions/3009888/autoplay-audio-files-on-a-ipad-with-html5/3056220#3056220). – feklee

7

La façon de résoudre ce problème visuel est de cacher l'élément vidéo jusqu'à ce qu'il soit prêt à être joué. Notez que vous ne pouvez pas définir display:none (la vidéo ne se chargera pas si vous faites cela) et visibility:hidden ne résoudra pas non plus le problème. Pour corriger cela, enroulez l'élément vidéo sur un DIV avec overflow:hidden et définissez -webkit-transform:translateX(1024px) (un nombre suffisamment élevé pour pousser la vidéo en dehors de l'écran).

Que vous devez écouter les canplay ou canplaythrough ou load événements (en fonction de vos besoins) et définissez le translateX à zéro après.

+1

Deux choses qui ne sont pas directement liées à la réponse: - Au lieu de changer l'opacité de la vidéo, il est généralement préférable de changer l'opacité d'une superposition par-dessus l'élément vidéo. (L'opacité ne fonctionne pas sur les éléments vidéo sur Google Chrome si l'accélération GPU n'est pas activée) - Évitez d'utiliser 'setAttribute', utilisez plutôt les propriétés DOM:' video.id', 'video.className',' video.width ', etc. –

1

le problème semble créer dynamiquement l'objet vidéo - qui casse en quelque sorte le code sur l'iPad. J'ai écrit un lecteur vidéo qui déplace l'élément vidéo actuel alreay dans un conteneur et immédiatement la vidéo cesse de fonctionner. pas de problème sur d'autres systèmes cependant ... devinez que vous devez trouver un moyen d'avoir l'élément vidéo déjà en place et ensuite ajouter tous vos autres codes au-dessus et en dessous ....

1

Réalisez que c'est un vieux problème, mais si quelqu'un d'autre trébuche à travers cela, j'ai rencontré un problème similaire. En regardant les événements envoyés par l'élément vidéo, il semblerait que l'iPad commencera à charger la vidéo, puis la suspendra presque immédiatement (semble être simultanée avec le premier événement 'progression').

Il ne incendie « JOUONS » ou événements « canplaythrough » jusqu'à ce que après la lecture a effectivement commencé, vous devez donc écouter l'un des 3 événements qui font le feu avant la reproduction:

  • loadstart
  • progrès
  • suspendent

je changerais votre poignée r pour «charger» et donner un coup de feu.