Wie bereits berichtet, führt Adobe mit Flash Player 10.2 das StageVideo ein. In diesem Artikel geht es darum, wie man die hardwarebeschleunigte Darstellung von Videos in ActionScript genau verwendet.

Voraussetzungen

Um das StageVideo zu verwenden, benötigt man aktuell noch den Flash Player 10.2 aus den Adobe Labs (später dann den finalen Flash Player 10.2). Außerdem muss man das Flex SDK ab Build 18623 zum Kompilieren einsetzen und zusätzlich den Kompilerbefehler "-swf-version=11" ergänzen.

Vektor mit StageVideo-Objekten

Zuerst fängt man das Event StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY ab. Dadurch erkennt man, ob die Verwendung von StageVideo möglich ist oder nicht.

Sollte StageVideo vorhanden sein, muss keine eigene Instanz davon erstellen werden, sondern man bekommt diese aus einem Vektor mit StageVideo-Objekten. Der Vektor enthält so viele Objekte, wie StageVideos gleichzeitig möglich sind (siehe voriger Artikel).

Als Fallback folgt ein gewöhnliches Video-Objekt, falls StageVideo nicht möglich sein sollte.

Zuletzt legt man noch den Viewport (also die dargestellte Größe) des StageVideo fest.

Display List vor dem StageVideo

Um zu zeigen, dass das StageVideo tatsächlich hinter der Display-List liegt, habe ich noch ein Textfeld eingefügt. Das normale Video-Objekt legt sich über das Textfeld, da es nach ihm zur Bühne hinzugefügt wird. Nicht so jedoch beim StageVideo: Das Textfeld ist sichtbar, da sich das StageVideo hinter allen Objekten befindet.

Quellcode

Actionscript:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.*;
  5.     import flash.geom.Rectangle;
  6.     import flash.media.*;
  7.     import flash.net.*;
  8.     import flash.text.*;
  9.    
  10.     [SWF(width="640", height="360")]
  11.     public class StageVideoDemo extends Sprite
  12.     {
  13.        
  14.         private var stageVideoAvailable:Boolean;
  15.         private var stageVid:StageVideo;
  16.        
  17.        
  18.         public function StageVideoDemo()
  19.         {
  20.             stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onAvailable);
  21.         }
  22.        
  23.         /**
  24.          * Wird aufgerufen und enthält Info, ob StageVideo verfügbar
  25.          *
  26.          */  
  27.         protected function onAvailable(event:StageVideoAvailabilityEvent):void
  28.         {
  29.             stageVideoAvailable = (event.availability == StageVideoAvailability.AVAILABLE);
  30.             initVideo();
  31.         }
  32.        
  33.         /**
  34.          * Video starten
  35.          *
  36.          */  
  37.         private function initVideo():void
  38.         {
  39.            
  40.             // dummy text feld auf display list platzieren
  41.             addTextField();
  42.            
  43.             // verbindung initialisieren
  44.             var nc:NetConnection = new NetConnection();
  45.             nc.connect(null);
  46.             var ns:NetStream = new NetStream(nc);
  47.             ns.client = this;
  48.            
  49.             // stage video verfügbar?
  50.             if(stageVideoAvailable) {
  51.                 // erstes Objekt aus dem Vektor für StageVideos nehmen
  52.                 stageVid = stage.stageVideos[0];
  53.                 stageVid.addEventListener(StageVideoEvent.RENDER_STATE, onRender);
  54.                 stageVid.attachNetStream(ns);
  55.             }
  56.             // wenn kein stage video verfügbar
  57.             else {
  58.                 var vid:Video = new Video(640,360);
  59.                 addChild(vid);
  60.                 vid.attachNetStream(ns);
  61.             }
  62.            
  63.             // video abspielen
  64.             ns.play("http://mediapm.edgesuite.net/osmf/content/test/logo_animated.flv");
  65.            
  66.         }
  67.  
  68.        
  69.         protected function onRender(event:StageVideoEvent):void
  70.         {
  71.             // darstellungsgröße festlegen
  72.             stageVid.viewPort = new Rectangle(0,0,640,360);
  73.         }      
  74.  
  75.        
  76.         /**
  77.          * Dummy Textfeld
  78.          */  
  79.         private function addTextField():void {
  80.             var tf:TextField = new TextField();
  81.             tf.text = "Text field on display list";
  82.             tf.width = 500;
  83.            
  84.             var format:TextFormat = new TextFormat();
  85.             format.color = 0xffffff;
  86.             format.size = 20;
  87.            
  88.             tf.setTextFormat(format);
  89.             addChild(tf);         
  90.         }
  91.        
  92.        
  93.         /**
  94.          * Delegates für NetStream
  95.          */  
  96.         public function onMetaData(e:Object):void {   
  97.         }
  98.         public function onXMPData(e:Object):void {     
  99.         }            
  100.        
  101.     }
  102. }

Link: New Tutorial Introducing the StageVideo API