Utilisation des API StageVideo

La vidéo sur la scène est un mécanisme intégré au moteur d’exécution qui optimise la lecture de vidéos et les performances des périphériques. Le moteur d’exécution crée et gère ce mécanisme. En tant que développeur, il vous incombe de configurer l’application de sorte à l’exploiter pleinement.

Pour utiliser la vidéo sur la scène, vous mettez en œuvre une structure de gestionnaires d’événement qui détectent la disponibilité ou la non-disponibilité de la vidéo sur la scène. Lorsque vous êtes averti de la disponibilité de la vidéo sur la scène, vous récupérez un objet StageVideo de la propriété Stage.stageVideos . Le moteur d’exécution insère dans l’objet Vector un ou plusieurs objets StageVideo. Vous pouvez alors afficher une vidéo en flux continu par le biais de l’un des objets StageVideo fournis, plutôt qu’un objet Video.

Sur Flash Player, lorsque vous êtes averti que la vidéo sur la scène n’est plus disponible, réactivez l’utilisation d’un objet Video pour afficher le flux vidéo.

Remarque : il est impossible de créer des objets StageVideo.

Propriété Stage.stageVideos

La propriété Stage.stageVideos est un objet Vector qui permet d’accéder aux occurrences de StageVideo. Selon les ressources matérielles et système disponibles, ce vecteur peut contenir jusqu’à quatre objets StageVideo. Il est possible de limiter à un ou zéro les périphériques mobiles.

Si la vidéo sur la scène n’est pas disponible, ce vecteur ne contient pas d’objet. Pour éviter les erreurs d’exécution, veillez à n’accéder aux membres de cet objet vectoriel que si l’événement StageVideoAvailability le plus récent indique la disponibilité de la vidéo sur la scène.

Evénements StageVideo

La structure de l’API StageVideo propose les événements suivants :

StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
Evénement envoyé en cas de modification de la propriété Stage.stageVideos . La propriété StageVideoAvailabilityEvent.availability indique soit AVAILABLE , soit UNAVAILABLE . Cet événement permet de déterminer si la propriété stageVideos contient des objets StageVideo, plutôt que de vérifier directement la longueur de l’objet vectoriel Stage.stageVideos .

StageVideoEvent.RENDER_STATE
Envoyé lorsqu'un objet NetStream ou Camera a été associé à un objet StageVideo et est en cours d'exécution. Indique le type de décodage actuellement utilisé : matériel, logiciel ou non disponible (aucune valeur affichée). L’événement cible contient les propriétés videoWidth et videoHeight , dont l’utilisation est adaptée au redimensionnement de la fenêtre d’affichage de la vidéo.
Important : étant donné qu’elles ne figurent pas dans la liste d’affichage standard, les coordonnées issues de l’objet StageVideo cible utilisent les coordonnées Stage.

VideoEvent.RENDER_STATE
Evénement envoyé si un objet Video est en cours d’utilisation. Il indique le type de décodage en cours d’utilisation (matériel ou logiciel). Si cet événement indique un décodage à accélération matérielle, utilisez de préférence un objet StageVideo. L’événement Video cible contient les propriétés videoWidth et videoHeight , dont l’utilisation est adaptée au redimensionnement de la fenêtre d’affichage de la vidéo.

Flux de travail de mise en œuvre de la fonction StageVideo

Procédez comme suit pour mettre en œuvre la fonction StageVideo :

  1. Ecoutez l’événement StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY pour savoir quand l’objet vectoriel Stage.stageVideos a changé. Voir Utilisation de l’événement StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY .

  2. Si l’événement StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY indique que la vidéo sur la scène est disponible, utilisez l’objet vectoriel Stage.stageVideos à l’intérieur du gestionnaire d’événement pour accéder à un objet StageVideo.

  3. Associez un objet NetStream à l'aide de StageVideo.attachNetStream() ou associez un objet Camera à l'aide de StageVideo.attachCamera() .

  4. Lisez la vidéo à l’aide de NetStream.play() .

  5. Ecoutez l’événement StageVideoEvent.RENDER_STATE sur l’objet StageVideo afin de déterminer l’état de lecture de la vidéo. La réception de cet événement indique également que les propriétés width et height de la vidéo ont été initialisées ou modifiées. Voir Utilisation des événements StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE .

  6. Ecoutez l’événement VideoEvent.RENDER_STATE sur l’objet Video. Cet événement indique les mêmes états que l’événement StageVideoEvent.RENDER_STATE ; vous pouvez donc également l’utiliser pour déterminer si l’accélération par processeur graphique est disponible. La réception de cet événement indique également que les propriétés width et height de la vidéo ont été initialisées ou modifiées. Voir Utilisation des événements StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE .

Initialisation des écouteurs d’événements StageVideo

Configurez les écouteurs StageVideoAvailabilityEvent et VideoEvent lors de l’initialisation de l’application. Vous pouvez, par exemple, initialiser ces écouteurs dans le gestionnaire d’événement flash.events.Event.ADDED_TO_STAGE . Cet événement assure la visibilité de l’application sur la scène :

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

Utilisation de l’événement StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY

Dans le gestionnaire StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY , optez pour un objet Video ou StageVideo selon la disponibilité de StageVideo. Si la propriété StageVideoAvailabilityEvent.availability est définie sur StageVideoAvailability.AVAILABLE , utilisez StageVideo. Dans ce cas de figure, attendez-vous à ce que le vecteur Stage.stageVideos contienne un ou plusieurs objets StageVideo. Obtenez un objet StageVideo à partir de la propriété Stage.stageVideos et associez-lui l’objet NetStream. Etant donné que les objets StageVideo s’affichent toujours en arrière-plan, supprimez tout objet Video existant (toujours affiché au premier plan). Ce gestionnaire d’événement permet également d’associer un écouteur à l’événement StageVideoEvent.RENDER_STATE .

Si la propriété StageVideoAvailabilityEvent.availability est définie sur StageVideoAvailability.UNAVAILABLE , n’utilisez pas l’objet StageVideo et n’accédez pas à l’objet vectoriel Stage.stageVideos . Associez dans ce cas l’objet NetStream à un objet Video. Ajoutez enfin l’objet StageVideo ou Video à la scène et appelez la méthode NetStream.play() .

Le code suivant illustre le traitement de l’événement StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY :

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); 
    } 
} 
Important : la première fois qu’une application accède à l’élément vectoriel au niveau Stage.stageVideos[0], le rectangle par défaut est défini sur 0,0,0,0 et les propriétés de panoramique et zoom utilisent les valeurs par défaut. Réinitialisez toujours ces valeurs sur les paramètres de votre choix. Vous disposez des propriétés videoWidth et videoHeight de l’événement cible StageVideoEvent.RENDER_STATE ou VideoEvent.RENDER_STATE pour calculer les dimensions de la fenêtre d’affichage de la vidéo.

Téléchargez le code source complet de cet exemple d’application à l’adresse Getting Started with Stage Video (disponible en anglais uniquement).

Utilisation des événements StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE

Les objets StageVideo et Video envoient des événements qui indiquent aux applications tout changement de l’environnement d’affichage. Ces événements sont StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE .

Un objet StageVideo ou Video distribue un événement d’état de rendu lorsqu’un objet NetStream est associé et que sa lecture débute. Il envoie également cet événement lorsque l’environnement d’affichage est modifié (en cas de redimensionnement de la fenêtre d’affichage de la vidéo, par exemple). Ces notifications permettent de réinitialiser la fenêtre d’affichage sur les valeurs videoHeight et videoWidth actuelles de l’objet événement cible.

Les états de rendu indiqués sont les suivants :

  • RENDER_STATUS_UNAVAILABLE

  • RENDER_STATUS_SOFTWARE

  • RENDER_STATUS_ACCELERATED

Les états de rendu indiquent quand le décodage à accélération matérielle est en cours d’utilisation, quelle que soit la classe qui lit actuellement la vidéo. Vérifiez la propriété StageVideoEvent.status pour savoir si le décodage requis est disponible. Si elle est définie sur « unavailable », l’objet StageVideo ne peut pas lire la vidéo. Cet état nécessite que vous associiez à nouveau immédiatement l’objet NetStream à un objet Video. Les autres états indiquent à l’application les conditions de rendu en cours.

Le tableau ci-dessous décrit les implications de toutes les valeurs d’état de rendu pour les objets StageVideoEvent et VideoEvent dans Flash Player :

VideoStatus.ACCELERATED

VideoStatus.SOFTWARE

VideoStatus.UNAVAILABLE

StageVideoEvent

Le décodage et la présentation relèvent tous deux du matériel (performances optimales).

La présentation relève du matériel, le décodage du logiciel (performances satisfaisantes).

Aucune ressource du processeur graphique n’est disponible pour traiter la vidéo et aucun élément n’est affiché. Utilisez un objet vidéo.

VideoEvent

La présentation relève du logiciel, le décodage du matériel. (Performances satisfaisantes sur un système de bureau moderne uniquement. Elles sont dégradées en mode Plein écran.)

La présentation et le décodage relèvent tous deux du logiciel. (Performances les moins satisfaisantes. Elles sont dégradées en mode Plein écran.)

(S/O)

Espaces colorimétriques

La vidéo sur la scène fait appel aux capacités matérielles sous-jacentes pour prendre en charge les espaces colorimétriques. Un contenu SWF peut fournir des métadonnées qui indiquent l’espace colorimétrique préféré. Le matériel graphique du périphérique détermine toutefois s’il est possible d’utiliser l’espace colorimétrique. Un périphérique peut prendre en charge plusieurs espaces colorimétriques, tandis qu’un autre périphérique n’en prend en charge aucun. Si le matériel ne prend pas en charge l’espace colorimétrique requis, Flash Player tente d’identifier la correspondance la plus proche parmi les espaces colorimétriques gérés.

Pour déterminer les espaces colorimétriques pris en charge par le matériel, faites appel à la propriété StageVideo.colorSpaces . Cette propriété renvoie la liste des espaces colorimétriques pris en charge dans un vecteur String :

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

Pour savoir quel espace colorimétrique utilise la vidéo en cours de lecture, faites appel à la propriété StageVideoEvent.colorSpace . Vérifiez cette propriété dans le gestionnaire associé à l’événement StageVideoEvent.RENDER_STATE :

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

Si Flash Player ne détecte pas de valeur de substitution pour un espace colorimétrique non pris en charge, la vidéo sur la scène utilise l’espace colorimétrique par défaut, BT.601. Ainsi, les flux vidéo à codage H.264 utilisent généralement l’espace colorimétrique BT.709. Si le matériel du périphérique ne prend pas en charge BT.709, la propriété colorSpace renvoie « BT601 » . La valeur StageVideoEvent.colorSpace « unknown » indique que le matériel ne fournit pas de technique d’identification de l’espace colorimétrique.

Si l’application considère que l’espace colorimétrique actif est inacceptable, vous pouvez basculer d’un objet StageVideo à un objet Video. La classe Video prend en charge tous les espaces colorimétriques par le biais d’une composition logicielle.