Antes de continuar gostaria de dizer que este componente é baseado na idéia de David Hassoun da RealEyes Media.

Este componente estende UIComponent e adiciona um objeto vídeo em sua estrutura, o código segue abaixo.

              package br.com.fmsguru
              {
                  import flash.events.NetStatusEvent;
                  import flash.media.Video;
                  import flash.net.NetConnection;
                  import flash.net.NetStream;
                  import mx.controls.Alert;
                  import mx.core.UIComponent;
              
                  public class FmsGuruVideo extends UIComponent
                  {
                      private var vid:Video;      
                      private var nc:NetConnection;      
                      private var ns:NetStream;      
                      private var cli:Object;      
                      private var _caminho:String; 
              
                      public function FmsGuruVideo()
                      {
                           super();
                           init();
                      }
                      }
              }
              

A idéia básica aqui é bem parecida com uma conexão com o servidor FMS, porém, em vez de conectar ao servidor, vamos abrir uma conexão nula que não irá fazer streaming e sim criar um download progressivo do vídeo.

              public function init():void      
              {      
                   vid = new Video();          
              
                   nc = new NetConnection();      
                   nc.connect(null);           
              
                   ns = new NetStream(nc);
                   ns.bufferTime=0.2;      
              
                   cli = new Object();      
                   ns.client = cli;      
                   ns.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
              
                   vid.attachNetStream(ns);
              
                   this.addChild(vid);
              
                   if(_caminho)      
                   {      
                      ns.play(_caminho);      
                   }                 
              }
              

Criamos uma instância de NetConnection e uma instância para o NetStream ns, que faz um buffer para melhorar a leitura do vídeo, em seguida adicionamos um listener para respoder o status da conexão para com o arquivo e anexamos a um objeto de video.

              private function onStatus(obj:NetStatusEvent):void
              { 
              }
              

Na função onStatus simplesmente comparamos as mensagens para serem mostradas ao usuário.

E para finalizar nosso componente criamos dois métodos get e set para mostrar o caminho do arquivo que queremos dar um play.

              [Bindable]
              public function get filePath():String      
              {      
                  return _caminho;      
              }      
              
              public function set filePath(p_path:String):void
              {      
                  _caminho = p_path;      
                  ns.play(_caminho);      
              } 
              

Prontinho o componente esta pronto para uso. Para testar basta adiciona-lo assim:

              <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
                                      layout="absolute" 
                                      xmlns:video="br.com.fmsguru.*">
              
                  <video:FmsGuruVideo id="_videoGuru" 
                                      filePath="curtacircuito007.m4v"/>
              
              </mx:WindowedApplication>
              

Neste exemplo estamos fazendo a leitura do arquivo .M4V direto pelo file system, vale lembrar que o sandbox do AIR deixa acessar a máquina local, mas se este componente for usado em uma aplicação Flex, o arquivo só poderá ser lido diretamente de alguma url.

Para fazer o download da aplicação e do componente basta clicar aqui

Grande abraço!