2016-10-10 1 views
2

안녕하세요,비디오 스트림 액션 스크립트 3 복제하기

저는 스트리밍을 위해 CRTMP 서버를 사용하는 비디오 클래스 작업을하고 있습니다. 이 잘 작동하지만 내 솔루션에 대한 일부 효과) 비디오 스트림을 복제해야합니다.

중복 된 MovieClips를 검색하여 이와 같은 비디오를 복제하려고했습니다.

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

public class Main extends MovieClip 
{ 
    public var netStreamObj:NetStream; 
    public var nc:NetConnection; 
    public var vid:Video; 
    public var vid2:Video; 
    public var streamID:String; 
    public var videoURL:String; 
    public var metaListener:Object; 

    public function Main() 
    { 
     init_RTMP(); 
    } 

    private function init_RTMP():void 
    { 

     streamID = "szene3.f4v"; 
     videoURL = "rtmp://213.136.73.230/maya"; 

     vid = new Video(); //typo! was "vid = new video();" 
     vid2 = 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); 
      //vid2.attachNetStream(netStreamObj); // wont work 
      addChild(vid); 
      // addChild(vid2); // wont work either 

       //intervalID = setInterval(playback, 1000); 
     } 
    } 

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





    private 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; 

     vid2.x = 0; 
     vid2.y = _aspectH ; 
    } 
} 

비디오 스트림을 복제 할 수 있어야합니다. 2 동일한 videoStream의 인스턴스. 내가 도대체 ​​뭘 잘못하고있는 겁니까 ?

도움 주셔서 감사합니다.

+0

가장 쉬운 가능한 방법이 내가 NetStream을 두 배로해야 함을 의미 플레이어 클래스 – www0z0k

+0

의 두 인스턴스를 만드는 것입니다. 이것은 내가 원하는 것이 아닙니다. 나는 이것을하려고 애썼지 만 비디오는 동기가 아니었다. 다른 생각? – Glowhollow

+0

Bitmap.clone 당 비디오를 복제하려고했습니다. 하지만 샌드 박스 위반이 있습니다. 어떤 아이디어? 내 스스로 조사하려고 ...하지만 도움이 정말 감사합니다 :) – Glowhollow

답변

0
  • "이것은 내가 NetStream을 배가 할 필요가 있다는 것을 의미한다. 이것은 내가 원하는 것이 아니다."
  • "나는 Bitmap.clone 당 비디오를 복제하려고했지만 샌드 박스 위반이 있습니다." 당신은 해결 방법을 시도 할 수 있습니다

여기 제안 : Netstream Play(null) Bitmapdata Workaround

나는이 코드에 적용 할 수있는 방법에 대한 간단한 데모를 보여 드리겠습니다. 이 데모 코드에서는 캔버스의 너비가 550 & height = 400 인 것으로 가정합니다. 규모를 키우면 그 비율을 유지하십시오.

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

    import flash.geom.*; 
    import flash.filters.ColorMatrixFilter; 

    public class Main 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 vid1_sprite : Sprite = new Sprite(); 
     public var vid2_sprite : Sprite = new Sprite(); 

     public var vid2_BMP : Bitmap; 
     public var vid2_BMD : BitmapData; 

     public var colMtx:Array = new Array(); //for ColorMatrix effects 
     public var CMfilter:ColorMatrixFilter; 


     public function Main() 
     { 
      init_RTMP(); 
     } 

     private function init_RTMP():void 
     { 

      streamID = "szene3.f4v"; 
      videoURL = "rtmp://213.136.73.230/maya"; 

      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(null); //for file playback 
      nc.connect(videoURL); //for RTMP streams 

     } 

     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("vid.flv"); //if File 
       netStreamObj.play(streamID); //if RTMP 

       vid.attachNetStream(netStreamObj); 

      } 
     } 

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

     private function received_Meta(data:Object):void 
     { 
      trace("Getting metadata"); 

      var _stageW:int = stage.stageWidth; 
      var _stageH:int = stage.stageHeight; 

      var _videoW:int = data.width; 
      var _videoH:int = data.height; 
      var _aspectH:int = 0; 

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

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

      trace("_videoW : " + _videoW); 
      trace("_videoW : " + _videoH); 
      trace("_aspectH : " + _aspectH); 

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

      setup_Copy(); //# Do this after video resize 
     } 

     public function setup_Copy() : void 
     { 
      vid2_BMD = new BitmapData(vid.width, vid.height, false, 0); 
      vid2_BMP = new Bitmap(vid2_BMD); 

      vid1_sprite.addChild(vid); 
      vid1_sprite.x = 0; 
      vid1_sprite.y = 0; 
      addChild(vid1_sprite); 

      vid2_sprite.addChild(vid2_BMP); 
      vid2_sprite.x = 0; 
      vid2_sprite.y = vid.height + 5; 

      addChild(vid2_sprite); 

      stage.addEventListener(Event.ENTER_FRAME, draw_Video); 
     } 

     public function draw_Video (evt:Event) : void 
     { 
      if (netStreamObj.client.decodedFrames == netStreamObj.decodedFrames) { return; } // Here we skip multiple readings 

      //# Get bitmapdata directly from container of video 
      if (vid1_sprite.graphics.readGraphicsData().length > 0) 
      { 
       vid2_BMD = GraphicsBitmapFill(vid1_sprite.graphics.readGraphicsData()[0]).bitmapData; 
      } 

      effect_BitmapData(); //# Do an effect to bitmapdata 

     } 

     public function effect_BitmapData () : void 
     { 
      //# Matrix for Black & White effect 
      colMtx = colMtx.concat([1/3, 1/3, 1/3, 0, 0]); // red 
      colMtx = colMtx.concat([1/3, 1/3, 1/3, 0, 0]); // green 
      colMtx = colMtx.concat([1/3, 1/3, 1/3, 0, 0]); // blue 
      colMtx = colMtx.concat([0, 0, 0, 1, 0]); // alpha 

      CMfilter = new ColorMatrixFilter(colMtx); 
      vid2_BMP.bitmapData.applyFilter(vid2_BMD, new Rectangle(0, 0, vid.width, vid.height), new Point(0, 0), CMfilter); 

     } 


    } 
}