2009-07-03 6 views
4

En utilisant NetStream pour diffuser du contenu à partir de http, j'ai remarqué qu'avec certains h264 exportés, si le joueur rencontre un tampon vide, il s'arrêtera et tamponnera à la longueur demandée (comme prévu). Cependant, une fois que le tampon est plein, la lecture ne reprend pas, mais saute à l'avance, en tant que telle - en lisant instantanément la durée de la mémoire tampon dans un bref instant, et donc en déclenchant à nouveau un tampon vide. et plus. Vraisemblablement, lorsque le flux nets passe en mémoire tampon, la position de la tête de lecture continue, et le joueur tente de s'accrocher à cette position à la reprise, mais cela peut prendre 5 secondes pour créer un tampon de 2 secondes. tampon à nouveau ..Actionscript: bips NetStream après mise en mémoire tampon

(ce qui est une hypothèse)

J'ai essayé de contourner ce problème en écoutant un événement netstatus tampon vide, arrêtant le flux, et en même temps la mise en place d'une boucle pour vérifier la longueur du tampon en cours par rapport à la longueur du tampon demandée .. et en reprenant une fois que la longueur du tampon est supérieure ou égale au tampon demandé. Cependant, cela pose des problèmes lorsqu'il n'y a pas assez de e vidéo restante .. par exemple, un tampon de 10 secondes avec seulement 5 secondes restantes, la boucle se trouve juste là en attente d'une longueur de tampon de 10 secondes quand il n'en reste que 5 ...

Vous penseriez que vous pourriez simplement vérifier ce qui était plus petit, le temps restant ou la longueur du tampon demandé .. Cependant, les temps clignotants ne sont pas précis ..

Si vous ajoutez l'indice de temps actuel des flux nets, plus le temps tampon, le total n'est pas la totalité durée du film (quand à la fin) .. c'est proche mais pas pareil. Ceci me ramène au problème original, et s'il y a un autre moyen de résoudre ce problème, il est clair que flash sait quand le tampon est prêt, alors comment puis-je obtenir une pause flash quand il est en mémoire tampon, et reprendre une fois le tampon prêt ? Actuellement, il ne le fait pas ... il marque une pause et une fois que le tampon est plein, il lit tout le contenu en mémoire tampon dans environ 0,1 seconde. Merci d'avance, Stephen.

Répondre

4

Bon bien, beaucoup de recherche autour (wow, comment est-il difficile de décrire ce problème) .. je suppose que plus le problème est lié à une bande passante plus faible et beaucoup de gens ne peuvent pas tester ce scénario ..

Donc, de toute façon, beaucoup de gens qui connaissent ce problème - semble dépendre des paramètres du codec - peut-être des images clés ou comment les conseils de streaming fonctionnent .. Je ne sais pas.

Ce que je ne sais est cela ne devrait pas être une préoccupation pour le joueur, le flash devient encore une fois une énorme déception ..

MAIS, j'ai réussi à faire un hack pour résoudre ce problème, si vous écoutez l'événement netstatus, et attendez un événement de buffer vide, vous mettez le flux en pause ... idéalement, maintenant vous écoutez un buffer full event, et le reprenez - mais puisque le flux est en pause - le buffer ne se construit pas (mais de Bien sûr, la vidéo est toujours en cours de chargement).

Si vous réglez maintenant une minuterie (je mis un événement sur entrer cadre), et écouter une des deux conditions pour devenir vrai:

  • a) la bufferLength est supérieure à ou égale à la bufferTime (tampon réelle est au moins demandé tampon taille)
  • b) les octets chargés comptent est égal au nombre total d'octets comptent

Condition A ne suffit pas bec ause à la fin de la vidéo, bufferLength peut ne pas être en mesure de s'adapter à la taille de tampon demandée car le temps restant est inférieur, et vérifier la position actuelle de la tête de lecture + la longueur réelle du buffer n'est pas égale à la durée du film C'est pourquoi la condition B est nécessaire, vous vérifiez que le film réel est complètement chargé, et en tant que tel jouable.

Voici mon code si utile du tout à tout le monde:

function onNetStatus(e:NetStatusEvent):void 

    if (e.info.code == "NetStream.Buffer.Empty") { 

     ns.pause(); 

     playerRoot.addEventListener(Event.ENTER_FRAME, function() { 
      if (ns.bufferLength >= ns.bufferTime || ns.bytesLoaded == ns.bytesTotal) { 
       playerRoot.removeEventListener(Event.ENTER_FRAME, arguments.callee); 
       ns.resume(); 
      } 
     }); 
    } 
} 

Vive.

0

Je n'ai jamais rencontré le problème que vous avez décrit. Cela arrive-t-il sur toutes les vidéos?

Une chose que vous pouvez essayer est de diffuser votre vidéo avec JW Player pour voir si le même problème se produit (http://www.longtailvideo.com/players/jw-flv-player/). Ceci est un lecteur vidéo open source construit en AS3.

+0

Salut David, non ça n'arrive pas sur toutes les vidéos, donc c'est probablement un problème d'encodage ... ce qui est un cauchemar. Il est codé en h264 depuis camtasia, keyframes à chaque seconde. Je pense que je vais essayer quelques exports différents pour essayer de résoudre le problème. Si je le trouve, je le posterai. Merci – meandmycode

Questions connexes