50 votes

Comment utiliser la fonction play2() pour effectuer un changement de flux rapide des vidéos ?

Je travaille actuellement sur un webplayer Flash avec une fonctionnalité de changement de résolution. J'essaie d'utiliser la fonction de changement de résolution de la classe NetStream play2() dans Actionscript.

Le problème que je rencontre est que les vidéos ne changent pas rapidement. Pour ceux qui connaissent le play2() fonction, je crois que le joueur effectue une "standard switch" plutôt qu'un "fast switch."

La documentation indique que lorsque le paramètre de décalage est égal à -1, une commutation rapide se produit. Ce qui se passe réellement, c'est qu'une fois que le paramètre "NetStream.Play.Transition" est reçu, le joueur attend jusqu'à ce que le moment indiqué par ns.time + ns.bufferLength a été atteint, avant d'effectuer l'aiguillage.

Je pensais que la commutation rapide effaçait le tampon, mais lors d'une vérification de ns.backbufferlength j'ai constaté que tout est toujours en cache. Il est également mentionné : "Lorsque le décalage est de -1, le changement se produit à la première image clé disponible après netstream.time + 3 C'est pourquoi je suis confus.

Toute aide ou information à ce sujet serait très appréciée.

Voici un extrait de code décrivant ce qui se passe ( newStream() est appelé lorsqu'un utilisateur clique pour passer à une nouvelle résolution, style youtube) :

public function newStream(address:String):void
{
    var opts:NetStreamPlayOptions = new NetStreamPlayOptions();
    opts.streamName = address;
    opts.transition = NetStreamPlayTransitions.SWITCH;
    opts.offset = -1;
    ns.play2(opts);
}

private function nsCallback(event:NetStatusEvent)
{
    switch(event.info.code)
    {
        case "NetStream.Play.Transition":
        {
            trace("Current time (on Transition): " + 
                  ns.time, "Buffer: " + ns.bufferLength);
            var estTime:Number = ns.time + ns.bufferLength;
            trace("Estimated Completion Time: " + estTime);
            break;
        }
    }
}

1voto

yaa110 Points 343

Comme le dit la documentation : " La valeur par défaut de l'offset est -1, ce qui fait que le comportement de commutation est par défaut standard. Dans ce mode, le serveur détermine un bon point de transition entre les flux en avançant dans le temps à partir du moment où il reçoit l'appel de commutation, et commute à ce point."

Vous devez donc changer le paramètre "offset" en une valeur supérieure à la durée de lecture actuelle (Netstream.time). Si la valeur est inférieure, un événement d'état NetStream.Play.Failed est envoyé.

1voto

Tim Waijers Points 31

Il se peut que le serveur essaie de trouver la i-frame la plus proche de l'offset actuel et que cela prenne du temps. Si vous connaissez le nombre d'images par seconde et le temps entre deux i-frames, vous pouvez essayer de rechercher un moment très proche de l'i-frame suivante ou précédente, ce qui accélèrerait la recherche et le service.

plus d'infos sur i-frame : http://en.wikipedia.org/wiki/Video_compression_picture_types

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X