Video-Beispiel: Video Jukebox

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit dem folgenden Beispiel wird eine einfache Video-Jukebox erstellt, die dynamisch eine Liste von Videos lädt, um die darin enthaltenen Videos nacheinander wiederzugeben. Mit diesem Code können Sie eine Anwendung erstellen, die dem Benutzer z. B. das Blättern in einer Reihe von Video-Tutorials ermöglicht oder festlegt, welche Werbung angezeigt werden soll, bevor ein vom Benutzer angefordertes Video geliefert wird. In diesem Beispiel werden die folgenden Funktionen von ActionScript 3.0 veranschaulicht:

  • Aktualisieren des Abspielkopfs basierend auf Wiedergabefortschritt einer Videodatei

  • Überwachen und Einlesen der Metadaten einer Videodatei

  • Verarbeiten von bestimmten Codes in einem Net-Stream

  • Laden, Wiedergeben, Unterbrechen und Anhalten einer dynamisch geladenen FLV-Datei

  • Ändern der Größe eines Video-Objekts in der Anzeigeliste basierend auf den Metadaten im Net-Stream

Die Anwendungsdateien für dieses Beispiel finden Sie unter www.adobe.com/go/learn_programmingAS3samples_flash_de . Die Dateien der Anwendung „Video Jukebox“ befinden sich im Ordner „Samples/VideoJukebox“. Die Anwendung umfasst die folgenden Dateien:

Datei

Beschreibung

VideoJukebox.fla

oder

VideoJukebox.mxml

Die Hauptanwendungsdatei für Flex (MXML) oder Flash (FLA).

VideoJukebox.as

Die Klasse mit den Hauptfunktionen der Anwendung.

playlist.xml

Eine Datei, in der die Videodateien aufgeführt sind, die in die Video Jukebox geladen werden.

Laden einer externen Video-Playliste

Die externe Datei „playlist.xml“ gibt die zu ladenden Videos und die Reihenfolge an, in der sie wiedergegeben werden. Zum Laden der XML-Datei benötigen Sie ein URLLoader-Objekt und ein URLRequest-Objekt. Dies wird im folgenden Code gezeigt:

uldr = new URLLoader(); 
uldr.addEventListener(Event.COMPLETE, xmlCompleteHandler); 
uldr.load(new URLRequest(PLAYLIST_XML_URL));

Dieser Code wird im Konstruktor der VideoJukebox-Klasse eingefügt, sodass die Datei geladen wird, noch bevor anderer Code ausgeführt wird. Sobald die XML-Datei vollständig geladen ist, wird die xmlCompleteHandler() -Methode aufgerufen, die die externe Datei in ein XML-Objekt einliest, wie im folgenden Code dargestellt:

private function xmlCompleteHandler(event:Event):void 
{ 
    playlist = XML(event.target.data); 
    videosXML = playlist.video; 
    main(); 
}

Das playlist -XML-Objekt enthält den unformatierten XML-Code aus der externen Datei, während videosXML ein XMLList-Objekt ist, das lediglich die Videoknoten enthält. Ein Beispiel für eine „playlist.xml“-Datei wird im folgenden Codeausschnitt gezeigt:

<videos> 
    <video url="video/caption_video.flv" /> 
    <video url="video/cuepoints.flv" /> 
    <video url="video/water.flv" /> 
</videos>

Schließlich ruft die xmlCompleteHandler() -Methode die main() -Methode auf, mit der die verschiedenen Komponenteninstanzen in der Anzeigeliste sowie die NetConnection- und NetStream-Objekte festgelegt werden, die zum Laden der externen FLV-Dateien verwendet werden.

Erstellen der Benutzeroberfläche

Zum Erstellen der Benutzeroberfläche müssen Sie fünf Button-Instanzen in die Anzeigeliste ziehen und ihnen die folgenden Instanznamen zuweisen: playButton , pauseButton , stopButton , backButton und forwardButton .

Für jede dieser Button-Instanzen müssen Sie eine Prozedur für das click -Ereignis zuweisen, wie im folgenden Codeausschnitt dargestellt:

playButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); 
pauseButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); 
stopButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); 
backButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); 
forwardButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);

Die buttonClickHandler() -Methode stellt mit einer switch-Anweisung fest, auf welche Schaltflächeninstanz geklickt wurde. Dies wird im folgenden Code gezeigt:

private function buttonClickHandler(event:MouseEvent):void 
{ 
    switch (event.currentTarget) 
    { 
        case playButton: 
            ns.resume(); 
            break; 
        case pauseButton: 
            ns.togglePause(); 
            break; 
        case stopButton: 
            ns.pause(); 
            ns.seek(0); 
            break; 
        case backButton: 
            playPreviousVideo(); 
            break; 
        case forwardButton: 
            playNextVideo(); 
            break; 
    } 
}

Anschließend fügen Sie der Anzeigeliste eine Slider-Instanz hinzu und weisen ihr den Instanznamen volumeSlider zu. Mit dem folgenden Code wird die liveDragging -Eigenschaft der Slider-Instanz auf true gesetzt und ein Ereignis-Listener für das change -Ereignis der Slider-Instanz definiert:

volumeSlider.value = volumeTransform.volume; 
volumeSlider.minimum = 0; 
volumeSlider.maximum = 1; 
volumeSlider.snapInterval = 0.1; 
volumeSlider.tickInterval = volumeSlider.snapInterval; 
volumeSlider.liveDragging = true; 
volumeSlider.addEventListener(SliderEvent.CHANGE, volumeChangeHandler);

Fügen Sie der Anzeigeliste eine ProgressBar-Instanz hinzu und weisen Sie ihr den Instanznamen positionBar zu. Setzen Sie die zugehörige mode -Eigenschaft auf manual, wie im folgenden Code dargestellt:

positionBar.mode = ProgressBarMode.MANUAL;

Fügen Sie schließlich der Anzeigeliste eine Label-Instanz hinzu, und weisen Sie ihr den Instanznamen positionLabel zu. Der Wert dieser Label-Instanz wird mit der Timer-Instanz festgelegt.

Überwachen auf Metadaten eines Video-Objekts

Wenn in Flash Player Metadaten für die einzelnen geladenen Videos gefunden werden, wird die Rückrufprozedur onMetaData() für die client -Eigenschaft des NetStream-Objekts aufgerufen. Mit dem folgenden Code wird ein Objekt initialisiert und die angegebene Rückrufprozedur eingerichtet:

client = new Object(); 
client.onMetaData = metadataHandler;

Die metadataHandler() -Methode kopiert ihre Daten in die meta-Eigenschaft, die bereits im Code definiert wurde. Auf diese Weise können Sie über die gesamte Anwendung auf die Metadaten des aktuellen Videos zugreifen. Als Nächstes wird das Video-Objekt auf der Bühne skaliert, sodass es den Abmessungen entspricht, die von den Metadaten zurückgegeben werden. Abschließend wird die Fortschrittleisten-Instanz positionBar basierend auf der Größe des aktuellen wiedergegebenen Videos verschoben und in der Größe geändert. Der folgende Code enthält die vollständige metadataHandler() -Methode:

private function metadataHandler(metadataObj:Object):void 
{ 
    meta = metadataObj; 
    vid.width = meta.width; 
    vid.height = meta.height; 
    positionBar.move(vid.x, vid.y + vid.height); 
    positionBar.width = vid.width; 
}

Dynamisches Laden von Video

Zum dynamischen Laden von Video-Dateien verwendet die Anwendung ein NetConnection- und ein NetStream-Objekt. Mit dem folgenden Code wird ein NetConnection-Objekt erstellt und der Wert null an die connect() -Methode übergeben. Durch Angabe von null wird in Flash Player eine Verbindung mit einem Video auf dem lokalen Server anstelle einer Verbindung mit einem Remote-Server wie Flash Media Server hergestellt.

Mit dem folgenden Code wird die NetConnection- und die NetStream-Instanz erstellt, ein Ereignis-Listener für das netStatus -Ereignis definiert und der client -Eigenschaft das client -Objekt zugewiesen:

nc = new NetConnection(); 
nc.connect(null); 
 
ns = new NetStream(nc); 
ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
ns.client = client;

Die netStatusHandler() -Methode wird immer aufgerufen, wenn sich der Videostatus ändert. Hierzu gehören das Starten oder Stoppen der Videowiedergabe, das Puffern von Videodaten oder wenn ein Video-Stream nicht gefunden werden kann. Im folgenden Code ist die netStatusHandler() -Ereignisprozedur aufgeführt:

private function netStatusHandler(event:NetStatusEvent):void 
{ 
    try 
    { 
        switch (event.info.code) 
        { 
            case "NetStream.Play.Start": 
                t.start(); 
                break; 
            case "NetStream.Play.StreamNotFound": 
            case "NetStream.Play.Stop": 
                t.stop(); 
                playNextVideo(); 
                break; 
        } 
    }  
    catch (error:TypeError)  
    { 
        // Ignore any errors. 
    } 
}

Im vorangegangenen Code wird die code-Eigenschaft des info-Objekts ausgewertet und ermittelt, ob der Code „NetStream.Play.Start“, „NetStream.Play.StreamNotFound“ oder „NetStream.Play.Stop“ enthält. Alle weiteren Codes werden ignoriert. Beim Starten des Net-Streams startet der Code die Timer-Instanz, die den Abspielkopf aktualisiert. Kann der Net-Stream nicht gefunden werden oder ist er angehalten, wird die Timer-Instanz gestoppt und die Anwendung versucht, das nächste Video in der Playliste wiederzugeben.

Jedes Mal, wenn der Timer ausgeführt wird, aktualisiert die Fortschrittleisten-Instanz positionBar die aktuelle Position, indem die setProgress() -Methode der ProgressBar-Klasse aufgerufen wird. Die Label-Instanz positionLabel wird mit der verstrichenen Zeit und der Gesamtlaufzeit des aktuellen Videos aktualisiert.

private function timerHandler(event:TimerEvent):void 
{ 
    try 
    { 
        positionBar.setProgress(ns.time, meta.duration); 
        positionLabel.text = ns.time.toFixed(1) + " of " meta.duration.toFixed(1) + " seconds"; 
    }  
    catch (error:Error) 
    { 
        // Ignore this error. 
    } 
}

Steuern der Videolautstärke

Sie können die Lautstärke eines dynamisch geladenen Videos steuern, indem Sie die soundTransform -Eigenschaft des NetStream-Objekts festlegen. Mit der Anwendung „Video Jukebox“ können Sie die Lautstärke einstellen, indem Sie den Wert der Slider-Instanz volumeSlider ändern. Im folgenden Code wird gezeigt, wie Sie die Lautstärke ändern können, indem Sie den Wert der Slider-Komponente einem SoundTransform-Objekt zuweisen, das als soundTransform -Eigenschaft des NetStream-Objekts festgelegt ist:

private function volumeChangeHandler(event:SliderEvent):void 
{ 
    volumeTransform.volume = event.value; 
    ns.soundTransform = volumeTransform; 
}

Steuern der Videowiedergabe

Der Rest der Anwendung steuert die Videowiedergabe, wenn das Video das Ende des Video-Streams erreicht oder der Benutzer zum vorherigen oder nächsten Video springt.

Mit der folgenden Methode wird die Video-URL vom XMLList-Objekt für die aktuell ausgewählte Indexposition abgerufen:

private function getVideo():String 
{ 
    return videosXML[idx].@url; 
}

Die playVideo() -Methode ruft die play() -Methode des NetStream-Objekts auf, um das derzeit ausgewählte Video zu laden:

private function playVideo():void 
{ 
    var url:String = getVideo(); 
    ns.play(url); 
}

Die playPreviousVideo() -Methode verringert den aktuellen Videoindex, ruft die playVideo() -Methode auf, um eine neue Videodatei zu laden, und zeigt die Fortschrittleiste an:

private function playPreviousVideo():void 
{ 
    if (idx > 0) 
    { 
        idx--; 
        playVideo(); 
        positionBar.visible = true; 
    } 
}

Die letzte Methode playNextVideo() erhöht den Videoindex und ruft die playVideo() -Methode auf. Wenn das aktuelle Video das letzte Video in der Wiedergabeliste ist, wird die clear() -Methode für das Video-Objekt aufgerufen und die visible -Eigenschaft der Fortschrittleisten-Instanz auf false gesetzt:

private function playNextVideo():void 
{ 
    if (idx < (videosXML.length() - 1)) 
    { 
        idx++; 
        playVideo(); 
        positionBar.visible = true; 
    } 
    else 
    { 
        idx++; 
        vid.clear(); 
        positionBar.visible = false; 
    } 
}