2013-04-12 5 views
5

abspielen Ich arbeite an einem Prototyp, in dem ich ein Video über RTMP-Protokoll wiedergeben muss. Mein Code ist folgende:Wie kann ich ein RTMP-Video über netConnection und 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); 
} 

}

Aber es ist nicht zu spielen, keine Fehler auftreten und nicht Zwirnen, wenn jemand eine Idee haben, bitte helfen Sie mir.

+0

Ich würde Ereignishandler 'nc.addEventListener' vor dem Aufruf von' nc.connect', auch eine Spur setzen im 'onConnectionStatus' hinzuzufügen. –

+0

Ich legte nc.addEventListener über nc.connect, aber immer noch nichts passiert, und es gibt eine Ablaufverfolgung ("Creating NetStream"), ich bekomme diese Spur in meiner Ausgabe. – Vipul

+0

Gut, dass Sie den creating netstream bekommen, aber es ist nicht die einzige Nachricht, die Sie bekommen können, verfolgen Sie den 'e.info.code' als erste Zeile im Handler. –

Antwort

10

tun es so für mich gearbeitet. Ich habe gerade einen Link zu einem Nachrichtensender als Beispiel verwendet, also versuche ihn durch deine eigene Stream-URL zu ersetzen. (ps: ignoriere die Pixelierung, es ist ein Low-Res-Beispiel Link).

Auch .. zuerst hatten Sie einen Tippfehler, wobei Sie vid = new video(); (gemeint war = new Video ??). Könnte das ein Problem für die addChild(vid) Linie weiter sein? Zweitens müssen Sie Funktionen wie die asyncErrorHandler, onFCSubscribe und onBWDone, die ich aufgenommen habe, wenn sie mit RTMP Arbeits Fehler zu stoppen, die einige Bäche werfen (in meinen früheren Erfahrungen sowieso). Dieses Beispiel-Code geht in einer Dokumentenklasse RTMP_test.as (umbenennen bevorzugt) ...

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 

AKTUALISIERT CODE genannt:


  1. Neue Demo-Link: Jetzt QVC (UK Einkaufen) anstelle von Russia Today (World News).
  2. Zeile hinzugefügt: nc.client = {onBWDone: function(): void {}}; (seit Flash Player ist jetzt strenger. Bevor es ohne diese Linie gut funktionierte).
+0

Danke VC.one, es funktioniert. Aber wenn ich meine RTMP-URL einstelle, funktioniert es nicht, siehe, es gibt ein Problem in meiner URL, jedenfalls vielen Dank. – Vipul

+0

Schwer zu sagen, was mit deiner eigenen URL nicht stimmt, aber diese Zeile 'streamID =" mp4: myVideo ";' klingt nicht so, als könnte sie sich mit einem Stream verbinden. Probieren Sie es wie folgt aus: streamID = "myVideo"; oder versuchen Sie es selbst. 'StreamID =" *********. Mp4 "; videoURL = "rtmp: //fms.xstream.dk/"; "Darüber hinaus kann ich nicht vorschlagen, ohne die volle URL zu sehen. Auch wenn dies nur ein "gefunden im Internet" Link ist, könnte der Stream irgendwie geschützt werden. Bsp: Ihr eigener Player passt etwas im öffentlich sichtbaren Link an, um den tatsächlichen Stream zu erhalten.Da du gesagt hast, dass es ein Demo-Prototyp ist, ist vielleicht ein anderer Link gut genug, um ihn als Teil deines Konzepts zu zeigen? –

+0

danke VC.One, es funktioniert jetzt, aber ich habe noch eine Frage, ich möchte es auf meinem Gerät (iPad2) spielen, aber wenn ich IPA-Datei kiste und es auf iPad installiert, zeigt es leere weiße Bildschirm Hast du irgendeine Idee darüber, dass MP4 Video auf IOS spielen kann oder nicht, wenn nicht, was ist die Alternative ?? – Vipul

0

Vielleicht ist eine vollständigere Version des Codes wie folgt. Es sollte RT-Kanal live spielen.

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

sollten Sie nicht die richtige Antwort kopieren. – Vipul

Verwandte Themen