Wie im Artikel „Dynamic Streaming: FMS 3.5 im Anmarsch” beschrieben, geht es bei „Dynamic Streaming“ darum, die Qualität des Videostreams dynamisch an die Bandbreite des Nutzers anzupassen. Sinkt oder steigt die Bandbreite während der Betrachtung, wird das Video auf eine andere Qualitätsstufe umgeschaltet. Um es für den Betrachter angenehm zu machen, geschieht dies unterbrechungsfrei.

Ein weiteres Problem, das mit Dynamic Streaming gelöst wird, können Videos in hoher Auflösung (HD) sein. Hat der Rechner des Nutzers zu wenig Rechenleistung, kann der Videostream nicht schnell genug dekodiert werden. Die Folge ist, dass es stottert und Einzelbilder verworfen werden (dropped frames). Auch hier ist es sinnvoll, stattdessen auf ein Video mit niedriger Datenrate zu wechseln, da dieses weniger CPU-Leistung benötigt.

QoS: Quality of Service

Damit man auf Änderungen (z.B. geringere Bandbreite) überhaupt reagieren kann, muss man die aktuellen Qualitätsdaten der Verbindung (QoS / Dienstgüte) ständig erfassen.

Dazu gibt es die neue Eigenschaft info der NetStream-Klasse. Dort finden sich in einem Objekt vom Typ NetStreamInfo aktuelle Informationen, z.B. wie schnell der Buffer gefüllt werden kann oder wie viele „Dropped Frames” es bisher gab. Man muss die Eigenschaft jedoch nicht selbst auswerten: Die Klassen DynamicStream (Erweiterung der NetStream-Klasse) und DynamicStreamItem vereinfachen die Handhabung.

Noch einfacher geht's mit der vor kurzem aktualisierten FLV Playback Komponente 2.5, die nun auch das Dynamic Streaming des Flash Media Server 3.5 unterstützt. Sie enthält die entsprechenden Klassen und APIs, um auf einfache Weise das dynamische Streaming des FMS zu verwenden (siehe unten).

Voraussetzungen (Server + Client)

Serverseitig muss nichts eingerichtet werden, da alle Varianten des FMS 3.5 (Flash Media Interactive Server, Flash Media Streaming Server, Flash Media Development Server) das dynamische Streaming automatisch unterstützen. Die Videos müssen einfach in verschiedenen Bitraten auf dem Server liegen. Ein Set an Beispielvideos liegt der Developer Edition bei.

Clientseitig wird der Flash Player 10 oder AIR 1.5 vorausgesetzt.

Dynamic Streaming mit der FLV Playback Komponente (ActionScript)

Actionscript:
  1. var dsi:DynamicStreamItem = new DynamicStreamItem()
  2. dsi.uri = "rtmp://192.168.2.108/vod/"
  3. dsi.addStream("mp4:sample1_150kbps.f4v", 150)
  4. dsi.addStream("mp4:sample1_700kbps.f4v", 700)
  5. dsi.addStream("mp4:sample1_1500kbps.f4v", 1500);     
  6. vid.play2(dsi);

Die wesentlichen Neuerungen sind in den obigen Codezeilen enthalten. Man erstellt ein DynamicStreamItem (Zeile 1), dem man die Videos mit den verschiedenen Bitraten hinzufügt (Zeile 3-5). Außerdem wird die URL zum FMS und der verwendeten Applikation „vod“ übergeben (Zeile 2). Mit der neuen Methode play2 startet man das „dynamische Video”.

Die Videoqualität passt sich nun selbstständig an.

Ein komplettes Flex-Beispiel sieht so aus:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()" layout="absolute">
  3.     <mx:Script>
  4.         <![CDATA[
  5.             import mx.core.UIComponent;
  6.             import fl.video.*;
  7.            
  8.             private var vid:FLVPlayback;
  9.            
  10.             private function onCreationComplete():void  {
  11.                
  12.                 VideoPlayer.iNCManagerClass = NCManagerDynamicStream;
  13.                            
  14.                 vid = new FLVPlayback();
  15.                 var ui:UIComponent = new UIComponent();
  16.                 this.addChild( ui );
  17.                 ui.addChild( vid );
  18.                 
  19.                 vid.width = 640;           
  20.                 vid.height = 480;
  21.                 vid.skin = "SkinUnderPlaySeekMute.swf";
  22.                 
  23.                 var dsi:DynamicStreamItem = new DynamicStreamItem(); 
  24.                 dsi.uri = "rtmp://192.168.2.108/vod/"; 
  25.                 dsi.addStream("mp4:sample1_150kbps.f4v", 150); 
  26.                 dsi.addStream("mp4:sample1_700kbps.f4v", 700); 
  27.                 dsi.addStream("mp4:sample1_1500kbps.f4v", 1500); 
  28.    
  29.                 vid.play2(dsi);                                          
  30.             }    
  31.         ]]>
  32.     </mx:Script> 
  33. </mx:Application>


Es basiert auf dem Beispiel im oben bereits erwähnten Artikel zur FLV Playback Komponente 2.5.

Testen von Bandbreitenschwankungen

Da bei einem lokalen Flash Media Server quasi immer ausreichend Bandbreite verfügbar, ist ein Test nicht einfach. Man muss die Bandbreite künstlich begrenzen. Hier hilft z.B. der Artikel Bandwidth Throttling on the Mac Using WaterRoof/ipfw.