sanych_dv

StreamVideoPublisher: test

Feb 20th, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import com.junkbyte.console.Cc;
  4.     import flash.events.AsyncErrorEvent;
  5.     import flash.events.NetStatusEvent;
  6.     import flash.events.ProgressEvent;
  7.     import flash.events.SecurityErrorEvent;
  8.     import flash.events.TimerEvent;
  9.     import flash.filesystem.File;
  10.     import flash.filesystem.FileMode;
  11.     import flash.filesystem.FileStream;
  12.     import flash.media.SoundTransform;
  13.     import flash.media.Video;
  14.     import flash.net.GroupSpecifier;
  15.     import flash.net.NetConnection;
  16.     import flash.net.NetGroup;
  17.     import flash.net.NetStream;
  18.     import flash.net.NetStreamAppendBytesAction;
  19.     import flash.utils.ByteArray;
  20.     import flash.utils.Timer;
  21.    
  22.     public class StreamVideoPublisher
  23.     {
  24.        
  25.         static private var _timer:Timer = new Timer(40);
  26.         static private var _currentPoint:int;
  27.         static private var _oldPoint:int = 0;
  28.        
  29.         static private var _ns:NetStream;
  30.         static private var _video:Video;
  31.        
  32.         static private var _nc_broadcasting:NetConnection;
  33.         static private var _ns_broadcasting:NetStream;
  34.         static private var _groupSpec:GroupSpecifier;
  35.         static private var _netGroup:NetGroup;
  36.        
  37.         static private var _metadata:Object;
  38.        
  39.         static private var _bytesLimit:int = 1024 * 1024 * 5;
  40.         static private var _currentBytesLimit:int;
  41.         static private var _bufferLimit:int = 10;
  42.         static private var _filesize:int = 0;
  43.         static private var _fs:FileStream;
  44.         static private var _bytes:ByteArray;
  45.         static private var _bytesLoaded:int = 0;
  46.         static private var _bytesTotal:int = 0;
  47.         static private var _isChunkLoaded:Boolean = false;
  48.         static private var _chunkCounter:int = 0;
  49.         static private var _isLoaded:Boolean = false;
  50.        
  51.         public function StreamVideoPublisher()
  52.         {
  53.        
  54.         }
  55.        
  56.         static public function setClass():void
  57.         {
  58.             _timer.addEventListener(TimerEvent.TIMER, onTimer);
  59.         }
  60.        
  61.         static public function start():void
  62.         {
  63.            
  64.             buildBroadcasting();
  65.         }
  66.        
  67.         static public function buildBroadcasting():void
  68.         {
  69.             _nc_broadcasting = new NetConnection();
  70.             _nc_broadcasting.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityHandler);
  71.             _nc_broadcasting.addEventListener(NetStatusEvent.NET_STATUS, broadcastingStatusHandler);
  72.             _nc_broadcasting.connect("rtmfp:");
  73.        
  74.         }
  75.        
  76.         static private function setupNetGroup():void
  77.         {
  78.             _groupSpec = new GroupSpecifier("videoGroup");
  79.             _groupSpec.serverChannelEnabled = true;
  80.             _groupSpec.postingEnabled = true;
  81.             _groupSpec.multicastEnabled = true;
  82.             _groupSpec.ipMulticastMemberUpdatesEnabled = true;
  83.            
  84.             _groupSpec.addIPMulticastAddress("225.225.0.1:30300");
  85.            
  86.             _netGroup = new NetGroup(_nc_broadcasting, _groupSpec.groupspecWithoutAuthorizations());
  87.            
  88.             _netGroup.addEventListener(NetStatusEvent.NET_STATUS, broadcastingStatusHandler);
  89.        
  90.         }
  91.        
  92.                 static private function buildBroadcastingStream():void
  93.            {
  94.        
  95.            _ns_broadcasting = new NetStream(_nc_broadcasting, _groupSpec.groupspecWithoutAuthorizations());
  96.            _ns_broadcasting.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
  97.            _ns_broadcasting.addEventListener(NetStatusEvent.NET_STATUS, broadcastingStatusHandler);
  98.        
  99.            var broadcastClient:Object = new Object();
  100.        
  101.            broadcastClient.onPeerConnect = function(caller_ns:NetStream):Boolean
  102.            {
  103.        
  104.            Cc.log("broadcast onPeerConnect: ", caller_ns.farID);
  105.        
  106.            return true;
  107.            }
  108.        
  109.            _ns_broadcasting.client = broadcastClient;
  110.        
  111.            _ns_broadcasting.publish("video");
  112.        
  113.            }
  114.        
  115.         static private function broadcastingStatusHandler(e:NetStatusEvent):void
  116.         {
  117.            
  118.             Cc.log("BROADCASTING STATUS: ", e.info.code);
  119.            
  120.             switch (e.info.code)
  121.             {
  122.                 case "NetConnection.Connect.Success":
  123.                    
  124.                     setupNetGroup();
  125.                    
  126.                     break;
  127.                
  128.                 case "NetGroup.Connect.Success":
  129.                    
  130.                 buildBroadcastingStream();
  131.                    
  132.                     //startVideoStream();
  133.                    
  134.                     break;
  135.                
  136.                 case "NetGroup.Neighbor.Connect":
  137.                    
  138.                 //  _netGroup.post( { act: "videoData", metadata: _metadata } );
  139.                    
  140.                     _ns_broadcasting.send("onMetaData", _metadata);
  141.                    
  142.                     Cc.log("Send video metadata to neighbor client");
  143.                    
  144.                     break;
  145.                
  146.                 case "NetStream.Connect.Success":
  147.                    
  148.                     startVideoStream();
  149.                    
  150.                     break;
  151.                
  152.             }
  153.        
  154.         }
  155.        
  156.         static private function loadData():void
  157.         {
  158.            
  159.             var file:File = new File(Main.__config.video);
  160.            
  161.             if (!file.exists)
  162.             {
  163.                 Cc.log("File or directory does not exist. ", Main.__config.video);
  164.                 return;
  165.             }
  166.            
  167.             _bytes = new ByteArray;
  168.            
  169.             _bytesTotal = file.size;
  170.            
  171.             _fs = new FileStream();
  172.            
  173.             _fs.readAhead = _bytesLimit;
  174.            
  175.             _fs.addEventListener(ProgressEvent.PROGRESS, onBytesRead);
  176.            
  177.             var remainBytes:int = _bytesTotal - _bytesLoaded;
  178.            
  179.             _currentBytesLimit = remainBytes > _bytesLimit ? _bytesLimit : remainBytes;
  180.            
  181.             _fs.openAsync(file, FileMode.READ);
  182.            
  183.             _fs.position = _bytesLoaded;
  184.            
  185.             if (_bytesTotal == _bytesLoaded)
  186.             {
  187.                 _isLoaded = true;
  188.             }
  189.        
  190.         }
  191.        
  192.         static private function onBytesRead(e:ProgressEvent):void
  193.         {
  194.            
  195.             _fs.readBytes(_bytes, _bytes.length, _fs.bytesAvailable);
  196.            
  197.             if (_bytes.length >= _currentBytesLimit)
  198.             {
  199.                 chunkReady();
  200.             }
  201.        
  202.         }
  203.        
  204.         static private function chunkReady():void
  205.         {
  206.             _fs.removeEventListener(ProgressEvent.PROGRESS, onBytesRead);
  207.             _fs.close();
  208.            
  209.             _bytesLoaded += _bytes.length;
  210.            
  211.             if (_chunkCounter == 0)
  212.             {
  213.                 // decrypt the first megabyte
  214.                
  215.                 bytesDecode(_bytes);
  216.                
  217.             }
  218.            
  219.             _ns.appendBytes(_bytes);
  220.            
  221.         //  _netGroup.post({act: "videoChunk", data: _bytes});
  222.            
  223.          _ns_broadcasting.send("onVideoBytes", _bytes);
  224.            
  225.             _bytes.clear();
  226.            
  227.             _isChunkLoaded = true;
  228.            
  229.             Cc.log("chunkReady", _currentBytesLimit);
  230.         }
  231.        
  232.         static public function startVideoStream():void
  233.         {
  234.             var nc:NetConnection = new NetConnection();
  235.             nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityHandler);
  236.             nc.addEventListener(NetStatusEvent.NET_STATUS, connectionStatusHandler);
  237.             nc.connect(null);
  238.            
  239.             if (_ns != null)
  240.             {
  241.                 _ns.close();
  242.             }
  243.            
  244.             _ns = new NetStream(nc);
  245.             _ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
  246.             _ns.addEventListener(NetStatusEvent.NET_STATUS, streamStatusHandler);
  247.            
  248.             _ns.client = {};
  249.            
  250.             _ns.client.onMetaData = function(metadata:Object):void
  251.             {
  252.                
  253.                 var obj:Object = {};
  254.                
  255.                 for (var key:String in metadata)
  256.                 {
  257.                     obj[key] = metadata[key];
  258.                 }
  259.                
  260.                 _metadata = obj;
  261.                
  262.                 Cc.log("Video metadata:");
  263.                
  264.                 obj.o();
  265.                
  266.                 Cc.log("Video duration: ", Math.ceil(metadata.duration), " sec");
  267.            
  268.             }
  269.            
  270.             var soundTransform:SoundTransform = new SoundTransform();
  271.             soundTransform.volume = 0;
  272.             _ns.soundTransform = soundTransform;
  273.            
  274.             /*  _video = new Video();
  275.            
  276.                _video.width = 3840;
  277.                _video.height = 1080;
  278.                _video.opaqueBackground = 0x000000;
  279.                Main.__stage1.addChild(_video);
  280.            
  281.                _video.attachNetStream(_ns);
  282.            
  283.              */
  284.            
  285.             _ns.play(null);
  286.            
  287.             _ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
  288.            
  289.             _timer.start();
  290.            
  291.             Cc.log("Video stream started, waiting for bytes...");
  292.            
  293.             // then load data
  294.             loadData();
  295.        
  296.         }
  297.        
  298.         static private function securityHandler(e:SecurityErrorEvent):void
  299.         {
  300.             Cc.log(e);
  301.         }
  302.        
  303.         static private function asyncErrorHandler(e:AsyncErrorEvent):void
  304.         {
  305.             Cc.log(e.error);
  306.         }
  307.        
  308.         static private function streamStatusHandler(e:NetStatusEvent):void
  309.         {
  310.             // End of video
  311.            
  312.             if (e.info.code == "NetStream.Buffer.Empty" && _isLoaded)
  313.             {
  314.                
  315.                 //Main.onAppClose();
  316.             }
  317.            
  318.             Cc.log(e.info.code);
  319.         }
  320.        
  321.         static private function connectionStatusHandler(e:NetStatusEvent):void
  322.         {
  323.             Cc.log(e.info.code);
  324.         }
  325.        
  326.         static private function onTimer(e:TimerEvent):void
  327.         {
  328.            
  329.             _currentPoint = Math.floor(_ns.time - 0.025);
  330.            
  331.             if (_currentPoint != _oldPoint)
  332.             {
  333.                
  334.                 if (_isChunkLoaded && _ns.bufferLength < _bufferLimit)
  335.                 {
  336.                    
  337.                     _isChunkLoaded = false;
  338.                    
  339.                     _chunkCounter++;
  340.                    
  341.                     loadData();
  342.                    
  343.                 }
  344.                
  345.                 var fx:String = Main.__fx[_currentPoint];
  346.                
  347.                 if (fx != null)
  348.                 {
  349.                    
  350.                     var str:String = "";
  351.                     str += "\n";
  352.                    
  353.                     str += "Video real time: " + _ns.time + " sec" + "\n";
  354.                     str += "Video current point: " + _currentPoint + " sec" + "\n";
  355.                     str += "FX data send to Cinema control panel" + "\n";
  356.                         //str += "FX data: " + fx + "\n";
  357.                    
  358.                         //  Cc.log(str);
  359.                    
  360.                 }
  361.             }
  362.            
  363.             _oldPoint = _currentPoint;
  364.         }
  365.        
  366.         static private function bytesDecode(bytes:ByteArray):void
  367.         {
  368.            
  369.             var i:int = 0;
  370.            
  371.             while (i++ < 1024 * 1024)
  372.             {
  373.                 if (bytes[i] <= 127)
  374.                 {
  375.                     bytes[i] -= 128;
  376.                    
  377.                 }
  378.                 else
  379.                 {
  380.                     bytes[i] += 128;
  381.                 }
  382.                
  383.             }
  384.        
  385.         }
  386.    
  387.     }
  388.  
  389. }
Add Comment
Please, Sign In to add comment