2013-04-12 22 views
5

Sto lavorando a un prototipo in cui devo riprodurre un video tramite il protocollo RTMP. Il mio codice è il seguente:Come posso riprodurre un video RTMP tramite netConnection e netStream

private function init():void 
    { 
     streamID:String = "mp4:myVideo"; 
     videoURL = "rtmp://fms.xstream.dk/*********.mp4"; 
     vid = new video(); 
     vid.width = 480; 
     vid.height = 320; 

     nc = new NetConnection(); 
     nc.client = {onBWDone: function():void 
      { 
      }}; 
     nc.addEventListener(NetStatusEvent.NET_STATUS, onConnectionStatus); 
     nc.connect(videoURL);   
    } 

    private function onConnectionStatus(e:NetStatusEvent):void 
    { 
     if (e.info.code == "NetConnection.Connect.Success") 
     { 
      trace("Creating NetStream"); 
      netStreamObj = new NetStream(nc); 
      netStreamObj.client = new CustomClient(); 
      netStreamObj.play(streamID); 
      vid.attachNetStream(netStreamObj); 
      addChild(vid); 
      intervalID = setInterval(playback, 1000); 
     } 
    } 

    private function playback():void 
    { 
     trace((++counter) + " Buffer length: " + netStreamObj.bufferLength); 
    } 





class CustomClient 
{ 
public function onMetaData(info:Object):void 
{ 
    trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); 
} 
public function onCuePoint(info:Object):void 
{ 
    trace("cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type); 
} 

}

Ma non giocare, non si verificano errori e non esercizio di un'attività, se qualcuno ha qualche idea, ti prego, aiutami.

+0

vorrei aggiungere gestore di eventi 'nc.addEventListener' prima di chiamare' nc.connect', anche mettere un po 'traccia nel 'onConnectionStatus'. –

+0

Metto nc.addEventListener sopra nc.connect, ma ancora non succede nulla, e c'è una traccia di traccia ("Creating NetStream"), sto ricevendo quella traccia nel mio output. – Vipul

+0

Bene che si sta creando il flusso di rete ma non è l'unico messaggio che si può ottenere, tracciare il file 'e.info.code' come prima riga nel gestore. –

risposta

10

farlo in questo modo ha funzionato per me. Ho appena usato un collegamento a un canale di notizie come esempio, quindi prova a sostituirlo con l'url del tuo stream. (ps: ignora la pixelazione, è un link di esempio a bassa risoluzione).

Inoltre .. prima hai avuto un errore di battitura in cui hai detto vid = new video(); (significato = new Video ??). Potrebbe essere un problema per la linea addChild(vid)? In secondo luogo è necessario funzioni come la asyncErrorHandler, onFCSubscribe e onBWDone che ho incluso quando si lavora con RTMP per fermare gli errori che alcuni flussi di buttare fuori (nelle mie esperienze passate in ogni caso). Questo codice di esempio va in una classe documento chiamato RTMP_test.as (rinomina come preferito) ...

package { 

import flash.display.*; 
import flash.events.*; 
import flash.net.*; 
import flash.media.*; 
import flash.system.*; 
import flash.utils.ByteArray; 

public class RTMP_test extends MovieClip 
{ 
    public var netStreamObj:NetStream; 
    public var nc:NetConnection; 
    public var vid:Video; 

    public var streamID:String; 
    public var videoURL:String; 
    public var metaListener:Object; 

public function RTMP_test() 
{ init_RTMP(); } 

function init_RTMP():void 
{ 
     /* 
     streamID = "mp4:myVideo"; 
     videoURL = "rtmp://fms.xstream.dk/*********.mp4"; 
     */ 
     streamID = "[email protected]"; 
     videoURL = "rtmp://cp79650.live.edgefcs.net/live/"; 

     vid = new Video(); //typo! was "vid = new video();" 

     nc = new NetConnection(); 
     nc.addEventListener(NetStatusEvent.NET_STATUS, onConnectionStatus); 
     nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
     nc.client = { onBWDone: function():void{} }; 
     nc.connect(videoURL);   
} 

private function onConnectionStatus(e:NetStatusEvent):void 
{ 
     if (e.info.code == "NetConnection.Connect.Success") 
     { 
      trace("Creating NetStream"); 
      netStreamObj = new NetStream(nc); 

      metaListener = new Object(); 
      metaListener.onMetaData = received_Meta; 
      netStreamObj.client = metaListener; 

      netStreamObj.play(streamID); 
      vid.attachNetStream(netStreamObj); 
      addChild(vid); 
      //intervalID = setInterval(playback, 1000); 
     } 
} 

private function playback():void 
{ 
    //trace((++counter) + " Buffer length: " + netStreamObj.bufferLength); 
} 

public function asyncErrorHandler(event:AsyncErrorEvent):void 
{ trace("asyncErrorHandler.." + "\r"); } 

public function onFCSubscribe(info:Object):void 
{ trace("onFCSubscribe - succesful"); } 

public function onBWDone(...rest):void 
{ 
    var p_bw:Number; 
    if (rest.length > 0) 
     { p_bw = rest[0]; } 
    trace("bandwidth = " + p_bw + " Kbps."); 
} 

function received_Meta (data:Object):void 
{ 
    var _stageW:int = stage.stageWidth; 
    var _stageH:int = stage.stageHeight; 

    var _videoW:int; 
    var _videoH:int; 
    var _aspectH:int; 

    var Aspect_num:Number; //should be an "int" but that gives blank picture with sound 
    Aspect_num = data.width/data.height; 

    //Aspect ratio calculated here.. 
    _videoW = _stageW; 
    _videoH = _videoW/Aspect_num; 
    _aspectH = (_stageH - _videoH)/2; 

    vid.x = 0; 
    vid.y = _aspectH; 
    vid.width = _videoW; 
    vid.height = _videoH; 
} 

    } //end class 

} //end package 

codice aggiornato:


  1. Nuovo collegamento demo: Ora QVC (UK shopping) invece di Russia Today (World News).
  2. Riga aggiunta: nc.client = {onBWDone: function(): void {}}; (poiché Flash Player ora è più rigido, prima che funzionasse correttamente senza questa linea).
+0

Grazie VC.one, sta funzionando. Ma quando inserisco il mio URL RTMP, non funziona, mi sembra che ci sia qualche problema nel mio URL, comunque grazie mille. – Vipul

+0

Difficile dire cosa c'è che non va nel tuo url ma questa riga 'streamID =" mp4: myVideo ";' non sembra che possa connettersi a uno stream. Provalo come "streamID =" myVideo ";" oppure prova questo .. 'streamID =" *********. Mp4 "; videoURL = "rtmp: //fms.xstream.dk/"; "Oltre a questo non posso suggerire senza vedere l'url completo. Inoltre, se questo è solo un link "trovato sulla rete", lo streaming potrebbe essere protetto in qualche modo. Es: il proprio giocatore aggiusta qualcosa nel link pubblico visibile per ottenere lo stream corrente.Dal momento che hai detto che è un prototipo dimostrativo forse qualsiasi altro link è abbastanza buono da mostrare come parte del tuo concetto ?? –

+0

grazie VC.One, sta funzionando ora, ma ho una domanda a parte, voglio giocare sul mio dispositivo (iPad2), ma quando lo curo con il file IPA e lo installa su ipad, mostra una schermata bianca vuota , hai qualche idea su di esso che può riprodurre video MP4 su IOS o no, se non qual è l'alternativa ?? – Vipul

0

Forse una versione più completa del codice è come questa. dovrebbe riprodurre il canale RT dal vivo.

package { 
import flash.events.NetStatusEvent; 
import flash.events.AsyncErrorEvent; 
import flash.display.MovieClip; 
import flash.net.NetStream; 
import flash.net.NetConnection; 
import flash.media.Video; 
import flash.utils.setInterval; 


public class RTMP_test extends MovieClip { 


    public var netStreamObj:NetStream; 
    public var nc:NetConnection; 
    public var vid:Video; 

    public var streamID:String; 
    public var videoURL:String; 
    public var metaListener:Object; 

    public var intervalID:uint; 
    public var counter:int; 

    public function RTMP_test() 
    { init_RTMP(); } 

    function init_RTMP():void 
    { 

      streamID = "RT_2"; 
      videoURL = "rtmp://fms5.visionip.tv/live/RT_2"; 


      vid = new Video(); //typo! was "vid = new video();" 

      nc = new NetConnection(); 
      nc.addEventListener(NetStatusEvent.NET_STATUS, onConnectionStatus); 
      nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      nc.connect(videoURL);   
    } 

    private function onConnectionStatus(e:NetStatusEvent):void 
    { 
      if (e.info.code == "NetConnection.Connect.Success") 
      { 
       trace("Creating NetStream"); 
       netStreamObj = new NetStream(nc); 

       metaListener = new Object(); 
       metaListener.onMetaData = received_Meta; 
       netStreamObj.client = metaListener; 

       netStreamObj.play(streamID); 
       vid.attachNetStream(netStreamObj); 
       addChild(vid); 
       intervalID = setInterval(playback, 1000); 
      } 
    } 

    private function playback():void 
    { 
     trace((++counter) + " Buffer length: " + netStreamObj.bufferLength); 
    } 

    public function asyncErrorHandler(event:AsyncErrorEvent):void 
    { trace("asyncErrorHandler.." + "\r"); } 

    public function onFCSubscribe(info:Object):void 
    { trace("onFCSubscribe - succesful"); } 

    public function onBWDone(...rest):void 
    { 
     var p_bw:Number; 
     if (rest.length > 0) 
      { p_bw = rest[0]; } 
     trace("bandwidth = " + p_bw + " Kbps."); 
    } 

    function received_Meta (data:Object):void 
    { 
     var _stageW:int = stage.stageWidth; 
     var _stageH:int = stage.stageHeight; 
     var _aspectH:int; 
     var _videoW:int; 
     var _videoH:int; 

     var relationship:Number; 
     relationship = data.height/data.width; 

     //Aspect ratio calculated here.. 
     _videoW = _stageW; 
     _videoH = _videoW * relationship; 
     _aspectH = (_stageH - _videoH)/2; 

     vid.x = 0; 
     vid.y = _aspectH; 
     vid.width = _videoW; 
     vid.height = _videoH; 
    } 

} 

}

+0

non si dovrebbe copiare la risposta corretta. – Vipul