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
[as]
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.geom.Rectangle;
import flash.media.*;
import flash.net.*;
import flash.text.*;
[SWF(width=“640″, height=“360″)]
public class StageVideoDemo extends Sprite
{
private var stageVideoAvailable:Boolean;
private var stageVid:StageVideo;
public function StageVideoDemo()
{
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onAvailable);
}
/**
* Wird aufgerufen und enthält Info, ob StageVideo verfügbar
*
*/
protected function onAvailable(event:StageVideoAvailabilityEvent):void
{
stageVideoAvailable = (event.availability == StageVideoAvailability.AVAILABLE);
initVideo();
}
/**
* Video starten
*
*/
private function initVideo():void
{
// dummy text feld auf display list platzieren
addTextField();
// verbindung initialisieren
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = this;
// stage video verfügbar?
if(stageVideoAvailable) {
// erstes Objekt aus dem Vektor für StageVideos nehmen
stageVid = stage.stageVideos[0];
stageVid.addEventListener(StageVideoEvent.RENDER_STATE, onRender);
stageVid.attachNetStream(ns);
}
// wenn kein stage video verfügbar
else {
var vid:Video = new Video(640,360);
addChild(vid);
vid.attachNetStream(ns);
}
// video abspielen
ns.play(„http://mediapm.edgesuite.net/osmf/content/test/logo_animated.flv“);
}
protected function onRender(event:StageVideoEvent):void
{
// darstellungsgröße festlegen
stageVid.viewPort = new Rectangle(0,0,640,360);
}
/**
* Dummy Textfeld
*/
private function addTextField():void {
var tf:TextField = new TextField();
tf.text = „Text field on display list“;
tf.width = 500;
var format:TextFormat = new TextFormat();
format.color = 0xffffff;
format.size = 20;
tf.setTextFormat(format);
addChild(tf);
}
/**
* Delegates für NetStream
*/
public function onMetaData(e:Object):void {
}
public function onXMPData(e:Object):void {
}
}
}
[/as]
Link: New Tutorial Introducing the StageVideo API
[ad]