Mit Flash Player 10.1 kommt die langersehnte Möglichkeit, der NetStream-Klasse auch ein ByteArray als Input zu übergeben. Somit ist man nicht mehr darauf beschränkt, eine fertiges Videofile von einem Server abzuspielen, sondern kann direkt einen Datenstrom einlesen und abspielen.

Die neue Methode im Flash Player 10. dazu heißt NetStream.appendBytes().

Passes a ByteArray into a NetStream for playout. Call this method on a NetStream in "Data Generation Mode". To put a NetStream into Data Generation Mode, call NetStream.play(null) on a NetStream created on a NetConnection connected to null. Calling appendBytes() on a NetStream that isn't in Data Generation Mode is an error and raises an exception.

NetStream-Beispiel mit ByteArray

Um das folgendes Beispiel ausprobieren, benötigt man den aktuellsten Flash Player 10.1 (RC4) aus den Adobe Labs. Ein Klick auf den Button „Open FLV” öffnet den Datei-Browser, in dem man einfach eine lokale FLV-Datei auswählt. Diese wird als ByteArray geöffnet und abgespielt.

Get Adobe Flash player

Quellcode

Zu beachten ist, dass man NetStream.play(null) ausführen muss, bevor man das ByteArray zuweist.

Um das Projekt zu kompilieren, habe ich den Flash Builder 4 benutzt. Das Projekt muss man auf Flash Player 10.1 als Mindestvoraussetzung umstellen. Die fehlende playerglobal.swc für Flash Player 10.1 findet man in den Adobe Labs und kopiert sie an den Pfad aus der Fehlermeldung.

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. :Application xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.                xmlns:s="library://ns.adobe.com/flex/spark"
  4.                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
  5.                creationComplete="init()">
  6.    
  7.     :Script>
  8.        
  9.            
  10.             import flash.net.NetConnection;
  11.             import flash.net.NetStream;
  12.            
  13.             import flash.net.FileReference;
  14.             import flash.net.FileFilter;
  15.             import flash.utils.ByteArray;
  16.                          
  17.              private var myFileRef:FileReference;         
  18.              private var myByteArray:ByteArray;
  19.  
  20.  
  21.            
  22.             public function init():void {
  23.                
  24.                 // new FileReference
  25.                 myFileRef = new FileReference();
  26.                        
  27.                 // event listeners for File Reference
  28.                 myFileRef.addEventListener(Event.SELECT, selectFile);
  29.                 myFileRef.addEventListener(Event.COMPLETE, playFile);
  30.                        
  31.                 // event listener for Buttons
  32.                 myOpenButton.addEventListener(MouseEvent.CLICK,browserForFile);                         
  33.             }
  34.            
  35.                          
  36.             private function browserForFile(e:MouseEvent):void{
  37.                 myFileRef.browse([new FileFilter("Flash-Videos (*.flv)", "*.flv;")]);
  38.             }
  39.                
  40.              
  41.             private function selectFile(e:Event):void {
  42.                 myFileRef.load();
  43.             }
  44.              
  45.             private function playFile(e:Event):void {
  46.                  
  47.                 // save data in byte array
  48.                 myByteArray = myFileRef.data;
  49.                        
  50.                 // video stuff
  51.                 var myVideo:Video = new Video(400,300);  
  52.                 var nc:NetConnection = new NetConnection();
  53.                 nc.connect(null);             
  54.                 var ns:NetStream = new NetStream(nc);
  55.                 ns.client = new Object();
  56.                 myVideo.attachNetStream(ns);
  57.                
  58.                 // important: play(null), otherwise exception
  59.                 ns.play(null);
  60.                
  61.                 // play byte array
  62.                 ns.appendBytes(myByteArray);
  63.                
  64.                 myUIComponent.addChild(myVideo);                                           
  65.                 }
  66.                         
  67.         ]]>
  68.     :Script>
  69.    
  70.     :UIComponent id="myUIComponent" width="100%" height="100%" />
  71.     :Button label="Open FLV" id="myOpenButton" />
  72. :Application>

Link: ByteArray Access to NetStream in Flash Player 10.1
Link: NetStream.appendBytes