2013-04-12 4 views
5

Я работаю над прототипом, в котором я должен воспроизводить видео через протокол RTMP. Мой код выглядит следующим образом:Как воспроизвести RTMP-видео через netConnection и 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); 
} 

}

Но это не играет, не происходит каких-либо ошибку и не сгибая, если кто-нибудь есть какие-либо идеи, пожалуйста, помогите мне.

+0

Я хотел бы добавить обработчик событий 'nc.addEventListener' перед вызовом' nc.connect', также положить какой-то след в 'onConnectionStatus'. –

+0

Я установил nc.addEventListener выше nc.connect, но все равно ничего не происходит, и есть трассировка трассировки («Создание NetStream»), я получаю эту трассировку на своем выходе. – Vipul

+0

Хорошо, что вы получаете созданный сетевой поток, но это не единственное сообщение, которое вы можете получить, проследите 'e.info.code' как первую строку в обработчике. –

ответ

10

делая так, работающий для меня. Я просто использовал ссылку на новостной канал в качестве примера, поэтому попробуйте заменить его собственным URL-адресом канала. (ps: игнорировать пикселизацию, это ссылка с низким разрешением).

Также .. у вас была опечатка, в которой вы сказали vid = new video(); (имеется в виду = new Video ??). Может ли это быть проблемой для линии addChild(vid)? Во-вторых вам нужна функция как asyncErrorHandler, onFCSubscribe и onBWDone, что я включил при работе с RTMP, чтобы остановить ошибки, что некоторые потоки выкидывать (в моем прошлом опыте в любом случае). Этот пример кода переходит в класс документа под названием RTMP_test.as (переименовать, как предпочтительный) ...

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 

ОБНОВЛЕНО КОД:


  1. Новая демо ссылка: Теперь QVC (UK шоппинг) вместо Russia Today (World News).
  2. Добавлена ​​строка: nc.client = {onBWDone: function(): void {}}; (так как Flash Player теперь более строгий. До того, как он отлично работал без этой строки).
+0

Спасибо, VC.one, он работает. Но когда я ставлю свой RTMP-URL, он не работает, кажется, что есть некоторые проблемы в моем URL-адресе, так или иначе, спасибо. – Vipul

+0

Трудно сказать, что не так с вашим собственным url, но эта строка 'streamID =" mp4: myVideo ";' не похоже, что она может подключаться к потоку. Попробуйте это так: 'streamID =" myVideo ";' или даже попробуйте это. 'StreamID =" *********. Mp4 "; videoURL = "rtmp: //fms.xstream.dk/"; "Помимо этого, я не могу предложить, не видя полного URL-адреса. Также, если это всего лишь «найденный в сети», тогда поток можно каким-то образом защитить. Например: их собственный игрок настраивает что-то в публичной видимой ссылке, чтобы получить фактический поток.Поскольку вы сказали, что это демонстрационный прототип, возможно, любая другая ссылка достаточно хороша, чтобы показать как часть вашей концепции? –

+0

спасибо VC.One, сейчас он работает, но у меня есть еще один вопрос, я хочу воспроизвести его на своем устройстве (iPad2), но когда я упакую его файл IPA и устанавливаю его на ipad, он показывает пустой белый экран , есть ли у вас какие-либо идеи об этом, которые могут воспроизводить видео MP4 на IOS или нет, если нет, то что это за альтернатива? – Vipul

0

Возможно, более полная версия кода выглядит следующим образом. он должен воспроизводить RT-канал в прямом эфире.

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

вы не должны копировать правильный ответ. – Vipul