2009-11-03 8 views
1

J'ai plusieurs vidéos stockées en tant qu'objets MovieClip et je voudrais les fusionner en un seul objet vidéo MovieClip afin de les lire toutes en séquence (de sorte qu'un utilisateur pense qu'il s'agit d'une seule vidéo)).Fusionner plusieurs MovieClips en un seul MovieClip

Merci beaucoup!

EDIT: Je veux le faire par programmation dans ActionScript dans Flash Player.

Répondre

-1

Ajoutez-les à la chronologie l'une après l'autre, assurez-vous que chaque MovieClip existe sur la timeline tant que la durée du film qu'il contient est. Vous pouvez le faire en ajoutant des images clés au scénario qui contiendra les clips vidéo. Assurez-vous également que votre fréquence d'images vidéo et que le framerate du lecteur Flash sont les mêmes.

Ce n'est pas vraiment une question de programmation.

+0

Je viens de clarifier que j'ai besoin de le faire en ActionScript dans Flash Player, donc c'est une question de programmation. – bartekb

1

Serait bien s'il y avait un événement TIMELINE_COMPLETE. Mais il n'y en a pas! Donc la prochaine meilleure chose est la méthode non documentée addFrameScript.

Vous pouvez utiliser addFrameScript() pour ajouter du code à la dernière image de vos MovieClips (ou de tout autre cadre). Ce code pourrait supprimer l'ancien MovieClip (celui qui vient juste de finir), et ajouter le nouveau MovieClip (le suivant dans la file d'attente).

public function Main() 
{ 
    // Remember addFrameScript() is zero based. 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, frameFunction); 
} 

private function frameFunction():void 
{ 
    //delete frame script by passing null as second parameter 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, null); 

    removeChild(currentVidMc); 
    addChild(newVidMc); 
    newVidMc.gotoAndPlay(1); 
} 

EDIT *

Pour faire une transition en douceur, vous pouvez essayer de charger dans le nouveau clip tôt (environ 15 images sonne bien pour moi, mais vous devrez essayer) avec l'ensemble visible faux, et arrêté. Ensuite, lorsque la dernière image du clip en cours tourne, supprimez simplement le clip en cours et définissez la propriété visible des nouveaux clips sur true, puis jouez-la. La plupart du saut provient du chargement du clip sur la scène, donc le pré-rendu du clip peut aider.

+0

Merci. Malheureusement, cela ne résout pas mon problème. J'ai fait quelque chose de similaire en utilisant l'événement ENTER_FRAME de MovieClip. Lorsque l'événement ENTER_FRAME est déclenché, je compare currentFrame avec totalFrames et si elles sont égales, je commence à jouer le MovieClip suivant. Cependant, j'ai un retard notable sur les points d'assemblage de MovieClips. J'ai pensé que je pourrais me débarrasser des retards s'il était possible de combiner les MovieClips en un seul. C'est possible? – bartekb

+0

Vous avez tout à fait raison. C'est un problème commun. J'ai ajouté une modification à ma réponse qui pourrait aider. –

+0

Merci. J'ai essayé de tout précharger, mais quand j'appelle play() ou gotoAndPlay() en changeant de MovieClips, le retard est perceptible même sur une machine assez rapide. On dirait qu'il n'y a pas moyen de contourner cela. – bartekb

0

Pas vraiment une réponse mais 2 choses que vous pourriez peut-être essayer.

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class OneMovieToRuleThemAll extends MovieClip { 

     public subClips:Array; //vector for cs4 
     private var index:int = 0; 

     public function OneMovieToRuleThemAll(subClips:Array) { 
      this.subClips = subClips; 
     } 

     //pre subClips.length > 0 
     public function playAll() { 
      for(var i:int = 0; i < subClips.length; i++) { 
       subClips[i].visible = i == 0; 
       subClips[i].stop(); 
       addChild(subClips[i]); 
      } 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     private function onEnterFrame(e:Event) { 
      if(index >= subClips.length) { 
       //dispatchEvent finished 
       removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
      } 

      if(subClips[index].currentFrame < subClips[index].totalFrames) { 
       subClips[index].gotoAndStop(subClips[index].currentFrame + 1); 
      }else{ 
       subClips[index].visible = false; 
       index++; 
       subClips[index].visible = true; 
      } 

     } 
    } 

} 

Il est généralement déconseillé d'utiliser ENTER_FRAME et gotoAndStop (currentFrame) parce qu'il est lent, mais peut-être cela est tout aussi lent pour chaque trame de sorte que vous pourrez même participer « couture »

Une alternative pourrait également construire un nouveau movieclip avec un bitmap pour chaque image de chaque film avec BitmapData.draw (..); Utilisez ensuite la même boucle enter_frame et basculez les propriétés visibles pour chaque image. Utilise probablement allot de la mémoire et je n'ai aucune idée si c'est même à distance réalisable sage.

0

si je vous j'avais wright un emballage simple, il voudrais simplement: * connaître l'ordre des fichiers à montrer de certaines config xml * lors de la lecture de la première mesure fichier fps (ou RAM disponible ou une connexion Internet - dépend de la façon dont vous livrez vos fichiers sur le PC en jouant à vedia) * quand enfin l'encapsuleur décide que c'est juste 200% -300% du temps prognosé du chargement du second fichier à un pourcentage jouable. * si votre algorithme de pronostic est assez cool - vous avez la deuxième vid avant le premier arrêt. Donc, voici la partie la plus facile imho [si vos dernières et premières images correspondent assez bien]: vous venez de mettre en pause la deuxième vid sur le cadre dont vous avez besoin et de mettre son alpha à 0 en le plaçant sous le premier. quand le premier arrive à l'image correspondante, vous commencez à diminuer, c'est l'alpha qui augmente les secondes à la place et le libère de la pause.La seule tâche humaine (sauf coder l'encapsuleur, mais il ressemble à un couple d'écrans de code maximum) est la recherche de cadres correspondants et de tout mettre à config, mais vous pouvez même l'éviter en utilisant le BitmapData.compare() méthode. bonne chance!

Questions connexes