2013-04-12 23 views
5

Tôi đang làm việc trên mẫu thử nghiệm mà tôi phải phát video thông qua giao thức RTMP. Mã của tôi là như sau:Làm cách nào để phát video RTMP qua netConnection và 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); 
} 

}

Nhưng nó không chơi, không xảy ra bất kỳ lỗi và không miệt mài, Nếu ai có bất kỳ ý tưởng, hãy giúp tôi.

+0

tôi sẽ thêm xử lý sự kiện 'nc.addEventListener' trước khi gọi' nc.connect', cũng đặt một số dấu vết trong 'onConnectionStatus'. –

+0

Tôi đặt nc.addEventListener lên trên nc.connect, nhưng vẫn không có gì xảy ra và có dấu vết ("Tạo NetStream"), tôi nhận được dấu vết đó trong đầu ra của mình. – Vipul

+0

Tốt là bạn đang tạo luồng mạng nhưng đó không phải là thư duy nhất bạn có thể nhận được, theo dõi 'e.info.code' làm dòng đầu tiên trong trình xử lý. –

Trả lời

10

làm theo cách này làm việc cho tôi. Tôi vừa sử dụng liên kết đến kênh tin tức làm ví dụ để thử thay thế nó bằng url luồng của riêng bạn. (ps: bỏ qua pixelation, đó là liên kết ví dụ về độ phân giải thấp).

Ngoài ra .. trước tiên bạn có lỗi đánh máy, theo đó bạn đã nói vid = new video(); (có nghĩa là = new Video ??). Có thể đó là vấn đề cho dòng addChild(vid) hơn nữa không? Thứ hai, bạn cần có các chức năng như asyncErrorHandler, onFCSubscribeonBWDone mà tôi đã bao gồm khi làm việc với RTMP để ngăn chặn các lỗi mà một số luồng phát sinh (trong các trải nghiệm trước đây của tôi). mã ví dụ này đi trong một lớp tài liệu gọi là RTMP_test.as (đổi tên như ưa thích) ...

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 

CẬP NHẬT Mã sản phẩm:


  1. New link demo: Bây giờ QVC (UK mua sắm) thay vì Nga hôm nay (World News).
  2. Đã thêm dòng: nc.client = {onBWDone: function(): void {}}; (vì Flash Player bây giờ nghiêm ngặt hơn. Trước khi nó hoạt động tốt mà không có dòng này).
+0

Cảm ơn bạn VC.one, nó đang hoạt động. Nhưng khi tôi đặt URL RTMP của tôi, nó không hoạt động, dường như có một số vấn đề trong URL của tôi, anyways cảm ơn rất nhiều. – Vipul

+0

Khó để nói có gì sai với url của riêng bạn nhưng dòng này 'streamID =" mp4: myVideo ";' không có vẻ như nó có thể kết nối với luồng. Hãy thử nó như thế này 'streamID =" myVideo ";' hoặc thậm chí thử điều này .. 'streamID =" *********. Mp4 "; videoURL = "rtmp: //fms.xstream.dk/"; 'Ngoài ra, tôi không thể đề xuất mà không thấy url đầy đủ. Ngoài ra nếu đây chỉ là một số "tìm thấy trên mạng" liên kết sau đó dòng có thể được bảo vệ bằng cách nào đó. Ví dụ: trình phát của riêng họ điều chỉnh thứ gì đó trong liên kết hiển thị công khai để nhận luồng thực tế.Vì bạn đã nói đó là một nguyên mẫu demo có thể bất kỳ liên kết nào khác đủ tốt để hiển thị như là một phần của khái niệm của bạn ?? –

+0

cảm ơn bạn VC.One, bây giờ nó đang hoạt động, nhưng tôi có một câu hỏi khác, tôi muốn chơi nó trên thiết bị của mình (iPad2), nhưng khi tôi crate tập tin IPA của nó và cài đặt nó trên ipad, nó cho thấy màn hình trắng trống , bạn có bất kỳ ý tưởng về nó mà có thể chơi video MP4 trên IOS hay không, nếu không phải là những gì là thay thế ?? – Vipul

0

Có lẽ phiên bản hoàn chỉnh hơn của mã giống như thế này. nó sẽ phát trực tiếp kênh 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

bạn không nên sao chép câu trả lời đúng. – Vipul