Verwenden der StageVideo-APIs

Bühnenvideo ist ein Mechanismus in der Laufzeit, der die Videowiedergabe und die Geräteleistung optimiert. Die Laufzeit erstellt und verwaltet diesen Mechanismus – Ihre Aufgabe als Entwickler ist es, Ihre Anwendung so zu konfigurieren, dass sie den Mechanismus optimal nutzen kann.

Zur Verwendung von Bühnenvideo implementieren Sie verschiedene Ereignisprozeduren, die erkennen, wann Bühnenvideo verfügbar bzw. nicht verfügbar ist. Wenn Sie benachrichtigt werden, dass Bühnenvideo verfügbar ist, rufen Sie ein StageVideo-Objekt von der Stage.stageVideos -Eigenschaft ab. Die Laufzeit füllt dieses Vector-Objekt mit einem oder mehreren StageVideo-Objekten aus. Dann können Sie eines der StageVideo-Objekte anstelle eines Video-Objekts verwenden, um Streaming-Video anzuzeigen.

Wenn Sie in Flash Player benachrichtigt werden, dass das Bühnenvideo nicht mehr verfügbar ist, schalten Sie den Videostream zurück auf das Video-Objekt.

Hinweis: Sie können keine StageVideo-Objekte erstellen.

Stage.stageVideos-Eigenschaft

Die Stage.stageVideos -Eigenschaft ist ein Vector-Objekt, das Ihnen Zugriff auf StageVideo-Instanzen ermöglicht. Je nach Hardware- und Systemressourcen kann dieses Vector-Objekt maximal vier StageVideo-Objekte enthalten. Auf Mobilgeräten steht möglicherweise nur ein oder auch gar kein StageVideo-Objekt zur Verfügung.

Wenn kein Bühnenvideo verfügbar ist, enthält dieses Vector-Objekt keine Objekte. Um Laufzeitfehler zu vermeiden, darf der Zugriff auf Mitglieder dieses Vektors nur erfolgen, wenn das neueste StageVideoAvailability -Ereignis darauf hinweist, dass Bühnenvideo verfügbar ist.

StageVideo-Ereignisse

Die StageVideo-API bietet die folgenden Ereignisse:

StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
Wird gesendet, wenn die Stage.stageVideos -Eigenschaft sich ändert. Die StageVideoAvailabilityEvent.availability -Eigenschaft hat den Wert AVAILABLE (VERFÜGBAR) oder UNAVAILABLE (NICHT VERFÜGBAR). Verwenden Sie dieses Ereignis, um zu ermitteln, ob die stageVideos -Eigenschaft StageVideo-Objekte enthält, anstatt direkt die Länge des Stage.stageVideos -Vektors zu überprüfen.

StageVideoEvent.RENDER_STATE
Wird gesendet, wenn ein NetStream- oder Camera-Objekt einem StageVideo-Objekt zugeordnet wurde und abgespielt wird. Gibt an, welches Dekodierverfahren gerade verwendet wird: Hardware, Software oder nicht verfügbar (nichts wird angezeigt). Das Ereignisziel enthält die videoWidth - und videoHeight -Eigenschaften, mit denen die Größe des Video-Viewports auf sichere Weise geändert werden kann.
Wichtig: Die vom StageVideo-Zielobjekt abgerufenen Koordinaten stützen sich auf Bühnenkoordinaten, da sie nicht zur Standardanzeigeliste gehören.

VideoEvent.RENDER_STATE
Wird gesendet, wenn ein Video-Objekt verwendet wird. Das Ereignis gibt an, ob die Dekodierung über die Software oder über die Hardwarebeschleunigung durchgeführt wird. Wenn dieses Ereignis auf eine hardwarebeschleunigte Dekodierung hinweist, sollten Sie nach Möglichkeit zu einem StageVideo-Objekt wechseln. Das Video-Ereignisziel enthält die videoWidth - und videoHeight -Eigenschaften, mit denen die Größe des Video-Viewports auf sichere Weise geändert werden kann.

Arbeitsablauf zum Implementieren der StageVideo-Funktion

Das Implementieren der StageVideo-Funktion besteht aus den folgenden Hauptschritten:

  1. Verwenden Sie einen Listener für das StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY -Ereignis, um festzustellen, wann sich der Stage.stageVideos -Vektor geändert hat. Siehe Verwenden des StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY-Ereignisses .

  2. Wenn das StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY -Ereignis meldet, dass Bühnenvideo verfügbar ist, greifen Sie mit dem Stage.stageVideos -Vektorobjekt in dieser Ereignisprozedur auf ein StageVideo-Objekt zu.

  3. Fügen Sie ein NetStream-Objekt unter Verwendung von StageVideo.attachNetStream() oder ein Camera-Objekt unter Verwendung von StageVideo.attachCamera() an.

  4. Spielen Sie das Video mit NetStream.play() ab.

  5. Verwenden Sie einen Listener für das StageVideoEvent.RENDER_STATE -Ereignis des StageVideo-Objekts, um den Wiedergabestatus des Videos festzustellen. Der Empfang dieses Ereignisses gibt auch an, dass die width- und height-Eigenschaften (Breite und Höhe) des Videos initialisiert oder geändert wurden. Siehe Verwenden der StageVideoEvent.RENDER_STATE- und VideoEvent.RENDER_STATE-Ereignisse .

  6. Verwenden Sie einen Listener für das VideoEvent.RENDER_STATE -Ereignis des Video-Objekts. Dieses Ereignis stellt dieselben Statusangaben bereit wie StageVideoEvent.RENDER_STATE , sodass Sie damit auch feststellen können, ob die GPU-Beschleunigung verfügbar ist. Der Empfang dieses Ereignisses gibt auch an, dass die width- und height-Eigenschaften (Breite und Höhe) des Videos initialisiert oder geändert wurden. Siehe Verwenden der StageVideoEvent.RENDER_STATE- und VideoEvent.RENDER_STATE-Ereignisse .

Initialisieren von StageVideo-Ereignis-Listenern

Richten Sie die StageVideoAvailabilityEvent- und VideoEvent-Listener während der Anwendungsinitialisierung ein. Beispielsweise können Sie diese Listener in der flash.events.Event.ADDED_TO_STAGE -Ereignisprozedur initialisieren. Dieses Ereignis gewährleistet, dass die Anwendung auf der Bühne sichtbar ist:

public class SimpleStageVideo extends Sprite 
    private var nc:NetConnection; 
    private var ns:NetStream; 
 
    public function SimpleStageVideo() 
    { 
        // Constructor for SimpleStageVideo class 
        // Make sure the app is visible and stage available 
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 
     
    private function onAddedToStage(event:Event):void 
    { 
        //... 
        // Connections 
        nc = new NetConnection(); 
        nc.connect(null); 
        ns = new NetStream(nc); 
        ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
        ns.client = this; 
 
        // Screen 
        video = new Video(); 
        video.smoothing = true; 
 
        // Video Events 
        // the StageVideoEvent.STAGE_VIDEO_STATE informs you whether 
        // StageVideo is available 
        stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, 
            onStageVideoState); 
        // in case of fallback to Video, listen to the VideoEvent.RENDER_STATE 
        // event to handle resize properly and know about the acceleration mode running 
        video.addEventListener(VideoEvent.RENDER_STATE, videoStateChange); 
        //... 
    }

Verwenden des StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY-Ereignisses

Geben Sie für die StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY -Prozedur ein Video- oder ein StageVideo-Objekt an, je nach der Verfügbarkeit von StageVideo. Wenn die StageVideoAvailabilityEvent.availability -Eigenschaft auf StageVideoAvailability.AVAILABLE gesetzt ist, verwenden Sie StageVideo. In diesem Fall können Sie sicher sein, dass der Stage.stageVideos-Vektor mindestens ein StageVideo-Objekt enthält. Rufen Sie ein StageVideo-Objekt von der Stage.stageVideos -Eigenschaft ab und weisen Sie ihm das NetStream-Objekt zu. Da StageVideo-Objekte immer im Hintergrund angezeigt werden, müssen Sie vorhandene Video-Objekte, die immer im Vordergrund erscheinen, entfernen. Fügen Sie mit dieser Ereignisprozedur auch einen Listener für das StageVideoEvent.RENDER_STATE -Ereignis hinzu.

Wenn die StageVideoAvailabilityEvent.availability -Eigenschaft auf StageVideoAvailability.UNAVAILABLE gesetzt ist, dürfen Sie weder StageVideo verwenden noch auf den Stage.stageVideos -Vektor zugreifen. Weisen Sie in diesem Fall das NetStream-Objekt einem Video-Objekt zu. Fügen Sie zum Schluss der Bühne das StageVideo- oder Video-Objekt hinzu und rufen Sie NetStream.play() auf.

Der folgende Code veranschaulicht die Verarbeitung des StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY -Ereignisses:

private var sv:StageVideo; 
private var video:Video; 
 
private function onStageVideoState(event:StageVideoAvailabilityEvent):void 
{     
    // Detect if StageVideo is available and decide what to do in toggleStageVideo 
    toggleStageVideo(event.availability == StageVideoAvailability.AVAILABLE); 
} 
 
private function toggleStageVideo(on:Boolean):void 
{     
    // To choose StageVideo attach the NetStream to StageVideo 
    if (on) 
    { 
        stageVideoInUse = true; 
        if ( sv == null ) 
        { 
            sv = stage.stageVideos[0]; 
            sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange); 
                sv.attachNetStream(ns); 
        } 
 
        if (classicVideoInUse) 
        { 
            // If you use StageVideo, remove from the display list the 
            // Video object to avoid covering the StageVideo object 
            // (which is always in the background) 
            stage.removeChild ( video ); 
            classicVideoInUse = false; 
        } 
    } else 
    { 
        // Otherwise attach it to a Video object 
        if (stageVideoInUse) 
            stageVideoInUse = false; 
        classicVideoInUse = true; 
        video.attachNetStream(ns); 
        stage.addChildAt(video, 0); 
    } 
     
    if ( !played ) 
    { 
        played = true; 
        ns.play(FILE_NAME); 
    } 
} 
Wichtig: Wenn eine Anwendung das erste Mal auf das Vektorelement bei Stage.stageVideos[0] zugreift, ist das Standardrechteck auf 0,0,0,0 eingestellt und für die Eigenschaften zum Verschieben und Ändern der Größe gelten die Standardwerte. Setzen Sie diese Werte immer auf Ihre bevorzugten Einstellungen zurück. Mit den videoWidth - und videoHeight -Eigenschaften des StageVideoEvent.RENDER_STATE - oder VideoEvent.RENDER_STATE -Ereignisziels können Sie die Abmessungen für den Video-Viewport berechnen.

Sie können den vollständigen Quellcode dieser Beispielanwendung von der Website Erste Schritte mit Bühnenvideo herunterladen.

Verwenden der StageVideoEvent.RENDER_STATE- und VideoEvent.RENDER_STATE-Ereignisse

StageVideo- und Video-Objekte senden Ereignisse, um Anwendungen zu informieren, wenn die Anzeigeumgebung sich ändert. Diese Ereignisse heißen StageVideoEvent.RENDER_STATE und VideoEvent.RENDER_STATE .

Ein StageVideo- oder Video-Objekt löst ein Ereignis für den Renderstatus aus, wenn ein NetStream-Objekt zugewiesen ist und dessen Wiedergabe beginnt. Dieses Ereignis wird auch gesendet, wenn die Anzeigeumgebung sich ändert, beispielsweise wenn die Größe des Video-Viewports geändert wird. Verwenden Sie diese Benachrichtigungen, um den Viewport auf die aktuellen videoHeight - und videoWidth -Werte des Ereigniszielobjekts zurückzusetzen.

Für den Renderstatus können folgende Angaben gemeldet werden:

  • RENDER_STATUS_UNAVAILABLE

  • RENDER_STATUS_SOFTWARE

  • RENDER_STATUS_ACCELERATED

Der Renderstatus gibt an, ob die hardwarebeschleunigte Dekodierung verwendet wird, unabhängig davon, welche Klasse derzeit Video abspielt. Überprüfen Sie anhand der StageVideoEvent.status -Eigenschaft, ob die erforderliche Dekodierung verfügbar ist. Wenn diese Eigenschaft auf „unavailable“ eingestellt ist, kann das StageVideo-Objekt das Video nicht abspielen. Bei diesem Status müssen Sie das NetStream-Objekt sofort wieder einem Video-Objekt zuweisen. Andere Statusangaben informieren Ihre Anwendung über die aktuellen Renderbedingungen.

Die folgende Tabelle veranschaulicht die Bedeutung aller Renderstatuswerte für StageVideoEvent- und VideoEvent-Objekte in Flash Player:

VideoStatus.ACCELERATED

VideoStatus.SOFTWARE

VideoStatus.UNAVAILABLE

StageVideoEvent

Das Dekodieren und die Darstellung finden beide in der Hardware statt. (Optimal Leistung.)

Die Darstellung findet in der Hardware statt, das Dekodieren in der Software. (Akzeptable Leistung.)

Keine GPU-Ressourcen sind zum Verarbeiten des Videos verfügbar, es wird nichts angezeigt. Verwenden Sie ein Video-Objekt als Ausweichlösung.

VideoEvent

Die Darstellung findet in der Software statt, das Dekodieren in der Hardware. (Akzeptable Leistung nur auf modernen Desktopsystemen. Eingeschränkte Leistung im Vollbildmodus.)

Die Darstellung und das Dekodieren finden in der Software statt. (Schlechteste Leistung. Eingeschränkte Leistung im Vollbildmodus.)

Farbräume

Bühnenvideo unterstützt Farbräume über die zugrunde liegende Funktionalität der Hardware. SWF-Inhalt kann über Metadaten den bevorzugten Farbraum angeben. Ob dieser Farbraum auch verwendet werden kann, richtet sich jedoch nach der Grafikhardware des Geräts. Manche Geräte bieten Unterstützung für mehrere Farbräume, während andere Geräte gar keine Farbräume unterstützen. Wenn die Hardware den gewünschten Farbraum nicht unterstützt, versucht Flash Player, unter den unterstützten Farbräumen eine möglichst genaue Entsprechung zu finden.

Mit der StageVideo.colorSpaces -Eigenschaft können Sie feststellen, welche Farbräume von der Hardware unterstützt werden. Diese Eigenschaft gibt die Liste der unterstützten Farbräume in einem String-Vektor zurück:

var colorSpace:Vector.<String> = stageVideo.colorSpaces();

Anhand der StageVideoEvent.colorSpace -Eigenschaft können Sie ermitteln, welchen Farbraum das derzeit wiedergegebene Video verwendet. Überprüfen Sie diese Eigenschaft in der Ereignisprozedur für das StageVideoEvent.RENDER_STATE -Ereignis:

var currColorSpace:String; 
 
//StageVideoEvent.RENDER_STATE event handler 
private function stageVideoRenderState(event:Object):void 
{ 
    //... 
    currColorSpace = (event as StageVideoEvent).colorSpace; 
    //... 
}

Wenn Flash Player keinen Ersatz für einen nicht unterstützten Farbraum finden kann, verwendet das Bühnenvideo den standardmäßigen Farbraum, also BT.601. Videostreams mit der H.264-Kodierung verwenden beispielsweise in der Regel den Farbraum BT.709. Wenn die Gerätehardware den Farbraum BT.709 nicht unterstützt, gibt die colorSpace -Eigenschaft den Wert "BT601" zurück. Wenn StageVideoEvent.colorSpace den Wert "unknown" (unbekannt) zurückgibt, bietet die Hardware keine Möglichkeit, den Farbraum abzufragen.

Wenn der aktuelle Farbraum in Ihrer Anwendung als ungeeignet betrachtet wird, können Sie von einem StageVideo-Objekt zu einem Video-Objekt wechseln. Die Video-Klasse unterstützt alle Farbräume über das Software-Compositing.