2009-02-02 12 views
6

Ich benutze das VideoDisplay, um FLV's, MOV's und MP4's zu spielen und alles funktioniert super. Sie werden alle über progressiven Download geladen und werden nicht gestreamt. Was ich tun möchte, ist ein einzelnes spezifiziertes Bild (wie das, was bei der 10-Sekunden-Marke angezeigt wird) zu erfassen, es in eine Bitmap umzuwandeln und dieses Bitmap als Vorschaubild für das Video zu verwenden. Ich möchte dies zur Laufzeit tun, damit ich kein Vorschaubild für jedes Video erstellen muss, das angezeigt wird.Flex: Dynamisch ein Vorschaubild für ein Video erstellen

Irgendwelche Ideen, wie man das macht? Ich würde es lieber nicht vortäuschen, indem ich es spiele - suche nach dem spezifischen Rahmen und mache dann Pause, aber ich habe keine andere Wahl?

Antwort

2

Ryan und James sind richtig - der richtige Weg ist wahrscheinlich, Frames beim Upload/Transcode zu extrahieren. Aber wenn das keine Option ist, könntest du ein eigenes Standard/Platzhalter-Bild verwenden (etwas Generisches oder Irgendwie passend für alle Videos, deren Thumbs noch nicht erfasst wurden) und einfach DisplayObject von VideoDisplay verwenden packen und dann einen Rahmen auf den Server laden, zB:

<mx:Script> 
    <![CDATA[ 

     var captured:Boolean; 

     private function creationCompleteHandler(event:Event):void 
     { 
      videoDisplay.source = "http://yourserver/yourvideo.flv"; 
     } 

     private function videoDisplay_playheadUpdate(event:VideoEvent):void 
     { 
      if (!captured && videoDisplay.playheadTime >= 10) 
       capture(); 
     } 

     private function capture():void 
     { 
      var bmpData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height); 
      bmpData.draw(videoDisplay); 

      captured = true; 

      // Now just upload the byte array to your server for the next user 
      var loader:URLLoader = new URLLoader(); 
      loader.dataFormat = URLLoaderDataFormat.BINARY; 

      // ... etc. 
     } 

    ]]> 
</mx:Script> 

<mx:VideoDisplay id="videoDisplay" playheadUpdate="videoDisplay_playheadUpdate(event)" /> 

Wieder ist es vielleicht nicht die eleganteste Lösung, aber es funktioniert sicher. Auf diese Weise sieht der erste Benutzer das generische Bild, aber jeder Benutzer erhält danach das generierte Bild. (Was Sie natürlich bis dahin hochgeladen und richtig zugeordnet haben.) Macht Sinn?

+0

Ich habe etwas sehr ähnliches getan (ich hätte wahrscheinlich festlegen müssen, dass die App offline ausgeführt werden muss, so dass ich meistens keinen einfachen Zugriff auf den Server habe), aber am Ende habe ich es programmiert Ein Hack, bei dem das Video geladen und bei dem von mir benötigten Frame angehalten wurde. Vielen Dank! – onekidney

+0

Super, froh, dass es geholfen hat. –

1

Ich bin mir ziemlich sicher, dass das nicht möglich ist. Es kann gut sein ... aber denke nicht. Ich denke, die einzige Möglichkeit zum Laden von Videos besteht darin, das NetStream- und NetConnection-Objekt zu verwenden, das, wie Sie wissen, das Laden des Videos gerade startet.

Wenn dies benutzergenerierte Video ist, denke ich, die beste Wette ist, etwas serever Side-Skript zu haben, das das Vorschaubild erzeugt. Ich habe keine Ahnung, wie das gemacht wird, aber denke, so funktionieren die meisten Clip-Seiten.

Wenn alle Videos in Ihrer Kontrolle sind, kann es möglich sein, ein Skript für eines der Videobearbeitungsprogramme zu schreiben, um das Bild für einen bestimmten Frame aus einer Liste von Dateien zu generieren. Ich denke, dies ist wahrscheinlich Ihre beste Route als Alternative, dass Sie schnell aufstehen können.

Entschuldigung für die vage Antwort ... es kann Sie in die richtige Richtung zeigen, wenn Sie eine schnelle Lösung benötigen.

-1

Ich stimme James zu, der einzige Weg dies wirklich zu tun wäre, es mit einem serverseitigen Skript zu machen und bestimmte Frames aus dem Video zu ziehen. Selbst wenn Sie dies mit flex machen könnten, würden Sie die Last, die das auf dem Client-Rechner tun würde (die Prozessor-intensiv wäre, würde ich denken), wirklich nicht aufbringen. Ganz zu schweigen davon, dass es viel effizienter ist, das Bild vor der Hand zu erstellen, als Flex zu bestimmen, dass das Vorschaubild bei jedem Laden angezeigt wird.

Verwandte Themen