2016-10-10 2 views
2

グッドモーニング、複製ビデオストリームActionScript 3の

iはストリーミング用のCRTMP Serverを使用して、ビデオクラスに取り組んでいます。これはうまく動作しますが、私のソリューションでは、ビデオストリームを複製する必要があります(一部のエフェクトの場合)。

映画クリップを重複して探して、このような動画を複製しようとしました。

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

の2つのインスタンスを作成することです。これは私が望むものではありません。私はこれをやろうとしましたが、ビデオは同期していませんでした。他のアイデア? – Glowhollow

+0

私はBitmap.cloneごとにビデオを複製しようとしました。しかし、私にはサンドボックス違反があります。何か案は ?私は自分で調べようとします...しかし、助けは本当に感謝しています:) – Glowhollow

答えて

0
  • 「これは私がのNetStreamを倍増しなければならないことを意味します。これは私が欲しいものではありません。」
  • "ビデオをBitmap.cloneで複製しようとしましたが、サンドボックス違反があります。"

あなたは回避策がここで提案しようとすることができますNetstream Play(null) Bitmapdata Workaround

を、私はそれはあなたのコードに適用する方法の簡単なデモを紹介します。 このデモコードでは、キャンバスの幅= 550 &高さ= 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); 

     } 


    } 
}