Använda StageVideo-API:erna

Scenvideo är en funktion i körningstiden som förbättrar videouppspelning och enhetsprestanda. Funktionen skapas och bibehålls av körningstiden. Som utvecklare består ditt arbete av att konfigurera ditt program så att det kan utnyttja funktionen.

För att utnyttja scenvideo implementerar du ett ramverk med händelsehanterare, som identifierar när scenvideo är tillgängligt och inte. När du får ett meddelande om att scenvideo är tillgängligt hämtar du ett StageVideo-objekt från egenskapen Stage.stageVideos . Det här Vector-objektet fylls automatiskt i med ett eller flera StageVideo-objekt. Du kan sedan använda ett av dessa StageVideo-objekt, i stället för ett Video-objekt, för att visa direktuppspelad video.

När du får ett meddelande i Flash Player om att scenvideo inte längre är tillgängligt växlar du tillbaka videoströmmen till ett Video-objekt.

Obs! Du kan inte skapa StageVideo-objekt.

Egenskapen Stage.stageVideos

Egenskapen Stage.stageVideos är ett Vector-objekt som ger dig tillgång till StageVideo-instanser. Den här vektorn kan innehålla upp till fyra StageVideo-objekt, beroende på maskinvara och systemresurser. Mobilenheter kan vara begränsade till ett eller inga alls.

När scenvideo inte är tillgängligt innehåller den här vektorn inga objekt. Se till att du bara använder medlemmar i den här vektorn när den senaste StageVideoAvailability -händelsen anger att scenen är tillgänglig, annars kan du råka ut för körningsfel.

StageVideo-händelser

Ramverket för StageVideo-API:t tillhandahåller följande händelser:

StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
Skickas när egenskapen Stage.stageVideos ändras. Egenskapen StageVideoAvailabilityEvent.availability anger antingen AVAILABLE eller UNAVAILABLE . Använd den här händelsen för att avgöra om egenskapen stageVideos innehåller några StageVideo-objekt, i stället för att kontrollera längden på Stage.stageVideos -vektorn direkt.

StageVideoEvent.RENDER_STATE
Skickas när ett NetStream- eller Camera-objekt har kopplats till ett StageVideo-objekt och håller på att spelas upp. Anger vilken typ av avkodning som används: maskinvara, programvara eller ej tillgängligt (inget visas). Händelsemålet innehåller egenskaperna videoWidth och videoHeight som utan risk kan användas för att ändra storlek på videovisningsrutan.
Viktigt! Koordinater som hämtas från StageVideo-målobjektet använder Stage-koordinater eftersom de inte ingår i standardvisningslistan.

VideoEvent.RENDER_STATE
Skickas när ett Video-objekt används. Anger om programvaruavkodning eller maskinvaruaccelererad avkodning används. Om den här händelsen visar på maskinvaruaccelererad avkodning växlar du om möjligt till ett StageVideo-objekt. Video-händelsemålet innehåller egenskaperna videoWidth och videoHeight som utan risk kan användas för att ändra storlek på videovisningsrutan.

Arbetsflöde för att implementera funktionen StageVideo

Följ de här stegen om du vill implementera funktionen StageVideo:

  1. Lyssna efter händelsen StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY om du vill veta när vektorn Stage.stageVideos har ändrats. Mer information finns i Använda händelsen StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY .

  2. Om händelsen StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY rapporterar att scenvideo är tillgängligt använder du vektorobjektet Stage.stageVideos i händelsehanteraren för att få åtkomst till ett StageVideo-objekt.

  3. Bifoga ett NetStream-objekt med StageVideo.attachNetStream() eller bifoga ett Camera-objekt med StageVideo.attachCamera() .

  4. Spela upp videofilmen med NetStream.play() .

  5. Lyssna efter händelsen StageVideoEvent.RENDER_STATE på StageVideo-objektet om du vill fastställa statusen för den video som spelas upp. Ett kvitto på den här händelsen anger även att bredd- och höjdegenskaperna för den videon har initierats eller ändrats. Mer information finns i Använda händelserna StageVideoEvent.RENDER_STATE och VideoEvent.RENDER_STATE .

  6. Lyssna efter händelsen VideoEvent.RENDER_STATE på Video-objektet. Den här händelsen tillhandahåller samma status som StageVideoEvent.RENDER_STATE , så du kan använda den om du vill fastställa om GPU-acceleration är tillgänglig. Ett kvitto på den här händelsen anger även att bredd- och höjdegenskaperna för den videon har initierats eller ändrats. Mer information finns i Använda händelserna StageVideoEvent.RENDER_STATE och VideoEvent.RENDER_STATE .

Initiera StageVideo-händelseavlyssnare

Konfigurera StageVideoAvailabilityEvent- och VideoEvent-avlyssnare under programinitieringen. Du kan till exempel initiera dessa lyssnare i flash.events.Event.ADDED_TO_STAGE -händelsehanteraren. Den här händelsen garanterar att programmet syns på scenen:

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); 
        //... 
    }

Använda händelsen StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY

I StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY -hanteraren avgör du om du ska använda ett Video- eller ett StageVideo-objekt baserat på tillgängligheten för StageVideo. Om egenskapen StageVideoAvailabilityEvent.availability är inställd på StageVideoAvailability.AVAILABLE använder du StageVideo. I det här fallet kan du vara säker på att Stage.stageVideos-vektorn innehåller ett eller flera StageVideo-objekt. Hämta ett StageVideo-objekt från egenskapen Stage.stageVideos och bifoga NetStream-objektet till det. Eftersom StageVideo-objekt alltid visas i bakgrunden tar du bort eventuella Video-objekt (alltid i förgrunden). Du använder även den här händelsehanteraren för att lägga till en avlyssnare för StageVideoEvent.RENDER_STATE -händelsen.

Om egenskapen StageVideoAvailabilityEvent.availability är inställd på StageVideoAvailability.UNAVAILABLE använder du inte StageVideo och öppnar inte heller Stage.stageVideos -vektorn. Bifoga i så fall NetStream-objektet till ett Video-objekt. Lägg till slut till StageVideo- eller Video-objektet till scenen och anropa NetStream.play() .

Följande kod visar hur händelsen StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY ska hanteras:

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); 
    } 
} 
Viktigt! Den första gången ett program öppnar vektorelementet vid Stage.stageVideos[0] anges standardrektangeln till 0,0,0,0, och för panorerings- och zoomegenskaperna används standardvärden. Återställ alltid de här värdena som du vill ha dem. Du kan använda egenskaperna videoWidth och videoHeight för händelsemålet StageVideoEvent.RENDER_STATE eller VideoEvent.RENDER_STATE för att beräkna videovisningsrutans dimensioner.

Hämta den fullständiga källkoden för det här exempelprogrammet på Komma igång med scenvideo .

Använda händelserna StageVideoEvent.RENDER_STATE och VideoEvent.RENDER_STATE

StageVideo- och Video-objekt skickar händelser som informerar program när återgivningsmiljön visas. Händelserna är StageVideoEvent.RENDER_STATE och VideoEvent.RENDER_STATE .

Ett StageVideo- eller Video-objekt skickar en återgivningstillståndshändelse när ett NetStream-objekt bifogas och börjar spelas upp. Dessutom skickas den här händelsen när återgivningsmiljön ändras, till exempel om videovisningsrutan får en ny storlek. Använd dessa aviseringar för att återställa visningsrutan till aktuella videoHeight - och videoWidth -värden för händelsemålobjektet.

Rapporterade återgivningstillstånd omfattar:

  • RENDER_STATUS_UNAVAILABLE

  • RENDER_STATUS_SOFTWARE

  • RENDER_STATUS_ACCELERATED

Återgivningstillstånden anger när maskinvaruaccelererad avkodning används, oavsett vilken klass som för närvarande spelar upp video. Kontrollera egenskapen StageVideoEvent.status om du vill ta reda på om den nödvändiga avkodningen är tillgänglig. Om egenskapen anges som "unavailable" kan StageVideo-objektet inte spela upp videon. Vid det här tillståndet krävs det att du omedelbart bifogar NetStream-objektet igen till ett Video-objekt. Andra tillstånd informerar programmet om aktuella återgivningsförhållanden.

I följande tabell beskrivs innebörden av alla värden för återgivningstillstånd för StageVideoEvent- och VideoEvent- objekt i Flash Player:

VideoStatus.ACCELERATED

VideoStatus.SOFTWARE

VideoStatus.UNAVAILABLE

StageVideoEvent

Både avkodning och presentation sker i maskinvaran. (Bästa prestanda.)

Presentation i maskinvara, avkodning i programvara. (Acceptabla prestanda.)

Inga GPU-resurser är tillgängliga för att hantera videon och inget visas. Fall tillbaka på ett Video-objekt.

VideoEvent

Presentation i programvara, avkodning i maskinvara. (Acceptabla prestanda endast på modern, stationär dator. Försämrade helskärmsprestanda.)

Presentation i programvara, avkodning i programvara. (Sämst för prestanda. Försämrade helskärmsprestanda.)

(Ej tillämpligt)

Färgrymder

Scenvideo använder underliggande maskinvarufunktioner för att ge stöd åt färgrymder. SWF-innehåll kan tillhandahålla metadata som anger önskad färgrymd. Det är emellertid enhetens maskinvara för grafik som avgör om den färgrymden kan användas. Vissa enheter har stöd för flera färgrymder, andra inga alls. Om maskinvaran saknar stöd för den begärda färgrymden försöker Flash Player hitta den bästa matchningen bland de färgrymder som stöds.

Om du vill veta vilka färgrymder maskinvaran har stöd för använder du egenskapen StageVideo.colorSpaces . Den här egenskapen returnerar en lista över de färgrymder som stöds i en String-vektor:

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

Om du vill veta vilken färgrymd den video som spelas upp använder kontrollerar du egenskapen StageVideoEvent.colorSpace . Kontrollera den här egenskapen i händelsehanteraren för händelsen StageVideoEvent.RENDER_STATE :

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

Om det inte går att hitta en ersättning för en färgrymd som inte stöds använder scenvideon standardfärgrymden BT.601. Videoströmmar med H.264-kodning använder till exempel oftast BT.709-färgrymden. Om enhetens maskinvara saknar stöd för BT.709 returnerar egenskapen colorSpace värdet "BT601" . Ett StageVideoEvent.colorSpace -värde på "unknown" anger att maskinvaran saknar funktioner för att fråga efter färgrymden.

Om den aktuella färgrymden inte kan användas av ditt program kan du välja att växla från ett StageVideo-objekt till ett Video-objekt. Klassen Video har stöd för alla färgrymder via programvarusammansättning.