·您当前的位置:首页 > 技术教程 > FMS教程 >

[FMS]FLV动态控制FMS直播的实现参考代码

时间:2013-09-27 17:03cuplayer.com
[FMS]FLV动态控制FMS直播的实现参考代码,fms视频,as3视频直播,FMS直播

[FMS]FLV动态控制FMS直播的实现参考代码

  1. //main.asc 
  2.  
  3. load("NetServices.asc");     // for Flash remoting 
  4. //load("WebServices.asc");     // for SOAP web services 
  5. load("JSON.asc");     // for JSON 
  6. trace('load json.asc'); 
  7. trace(typeof JSON); 
  8. isLoadCab=0;// 
  9. isLoadVideo=0;//0,-1,1,-2 
  10. Cablist=[];//台列表 
  11. flvCurr=[]; 
  12. videoList=[]; 
  13. Data_array2=[]; 
  14. xmlFile ="http://www.cuplayer.com/x.xml"
  15. gateway = "http://www.cuplayer.com/member/amfphp/gateway.php"
  16. application.playStream = [];//new Object(); 
  17. /* 
  18. * application.onAppStart: 
  19. *                    is called when application load. It contains Live (out of the box) 
  20. * application specific initializations. 
  21. */ 
  22.  
  23. application.onAppStart = function() 
  24.     // Logging 
  25.     trace("Starting Live Service..."); 
  26.     //  Turning on the Authentication by default 
  27.     this.HTMLDomainsAuth =    true
  28.     this.SWFDomainsAuth =    true
  29.      
  30.     // Populating the list of domains which are allowed to host HTML file 
  31.     // which in turn may embed a SWF that connects to this application 
  32.     thisthis.allowedHTMLDomains = this.readValidDomains("allowedHTMLdomains.txt","HTMLDomains"); 
  33.  
  34.     // Populating the list of domains which are allowed to host a SWF file 
  35.     // which may connect to this application 
  36.     thisthis.allowedSWFDomains = this.readValidDomains("allowedSWFdomains.txt","SWFDomains"); 
  37.      
  38.     // Logging 
  39.     if(this.HTMLDomainsAuth){ 
  40.         trace("Authentication of HTML page URL domains is enabled"); 
  41.     } 
  42.     if(this.SWFDomainsAuth){ 
  43.         trace("Authentication of SWF URL domains is enabled"); 
  44.     } 
  45.     trace("...loading completed."); 
  46.      
  47.     this.onTime(); 
  48.     //setInterval(onTime,1000); 
  49.  
  50. application.loadCabList = function(){ 
  51.     isLoadCab = -1; 
  52.     var myCablist = new  NetConnection(); 
  53.     myCablist.connect(gateway); 
  54.     var myCablistResponse = new Object(); 
  55.     myCablistResponse.onResult = function(returnData){ 
  56.      //"[{"id":"1","cabname":"\u767e\u5bb6\u4e5001","cabtype":"1","order":"1"}]"     
  57.       Cablist = JSON.parse(returnData); 
  58.       isLoadCab=1
  59.     } 
  60.     myCablistResponse.onError = function(error) { 
  61.         trace(error.description); 
  62.         isLoadCab=-2    ; 
  63.     } 
  64.  
  65.     myCablist.call("HelloWorld.cablist",myCablistResponse,"");     
  66.      
  67.  
  68. application.loadVideoList = function(){ 
  69.     isLoadVideo = -1; 
  70.     var myVideolist = new  NetConnection(); 
  71.     myVideolist.connect(gateway); 
  72.     var myVideolistResponse = new Object(); 
  73.     myVideolistResponse.onResult = function(returnData){ 
  74.       videoList = JSON.parse(returnData); 
  75.       trace("videoList:"); 
  76.       trace(outarr(videoList)); 
  77.       isLoadVideo=1
  78.     } 
  79.     myVideolistResponse.onError = function(error) { 
  80.         trace(error.description); 
  81.         isLoadVideo=-2    ; 
  82.     } 
  83.  
  84.     myVideolist.call("HelloWorld.videolist",myVideolistResponse,"",videoList,"");     
  85.      
  86. application.playlist = function(CabKey){ 
  87.     //添加一个虚拟的流 
  88.     trace('--------- '+CabKey); 
  89.     //trace(CabKey);    trace(videoList);    trace(flvCurr); 
  90.      
  91.      
  92.     if(!flvCurr[CabKey]){ 
  93.         flvCurr[CabKey]=[]; 
  94.         flvCurr[CabKey]['key']=0; 
  95.     } 
  96.     if(!videoList[CabKey]){ 
  97.         trace('videoList['+CabKey+'] is undefined'); 
  98.         return false; 
  99.     } 
  100.     if( videoList[CabKey].length >0 && (flvCurr[CabKey]['key'] < videoList[CabKey].length) ){ 
  101.         //trace(outarr(videoList[CabKey])); 
  102.          
  103.         if(!application.playStream[CabKey]){//第一次播放 
  104.             trace(CabKey+":第一次播放:添加一个虚拟的流:"+"fo"+CabKey); 
  105.             application.playStream[CabKey] = Stream.get("fo"+CabKey);     
  106.              
  107.             //var flv = videoList[CabKey].shift(); 
  108.             var flv = videoList[CabKey][0]; 
  109.              
  110.             flvCurr[CabKey]['key'] = 0;         
  111.             flvCurr[CabKey]['name'] = flv.flvname;//当前的文件名 
  112.             flvCurr[CabKey]['time'] = 0;//当前的文件已经播放时间 
  113.             flvCurr[CabKey]['starttime'] = 0;//当前文件从总时间开始播放 
  114.             flvCurr[CabKey]['len'] = Stream.length("flv:"+flv.flvname); 
  115.             if(flvCurr[CabKey]['len']==0){//文件错误 
  116.                 videoList[CabKey][0]['status']=-1; 
  117.             }else{ 
  118.                 application.playStream[CabKey].play("flv:"+flv.flvname, 0, false);     
  119.             } 
  120.             trace(outarr(flvCurr)); 
  121.              
  122.         }else{//后面             
  123.             //接近播放结束时,开始播放下一个 
  124.             flvCurr[CabKey]['time'] = application.playStream[CabKey].time - flvCurr[CabKey]['starttime']; 
  125.             if( flvCurr[CabKey]['len'] -  flvCurr[CabKey]['time'] < 1 ){//当前文件马上要播放完了 
  126.                 trace(CabKey+":第N次播放:播放下一条"); 
  127.                 var videoKey = flvCurr[CabKey]['key']; 
  128.                 var flv = videoList[CabKey][videoKey+1]; 
  129.                 flvCurr[CabKey]['key'] = videoKey+1; 
  130.                 flvCurr[CabKey]['name'] = flv.flvname;//当前的文件名 
  131.                 flvCurr[CabKey]['time'] = 0;//当前的文件已经播放时间 
  132.                 flvCurr[CabKey]['starttime'] = application.playStream.time;//当前文件从总时间开始播放 
  133.                 flvCurr[CabKey]['len'] = Stream.length("flv:"+flv.flvname); 
  134.                  
  135.                  
  136.                 if(flvCurr[CabKey]['len']==0){//文件错误 
  137.                     videoList[CabKey][videoKey+1]['status']=-1; 
  138.                 }else{ 
  139.                     application.playStream[CabKey].play("flv:"+flv.flvname, 0, false); 
  140.                     videoList[CabKey][videoKey+1]['status']=1; 
  141.                 } 
  142.                 //将上一条标志为播放完毕 
  143.                 if(videoList[CabKey][videoKey]['status']==1) videoList[CabKey][videoKey]['status']=2; 
  144.                  
  145.                 //将本条视频标志为正在播放 
  146.  
  147.             }else{//当前文件播放中... 
  148.                 trace(CabKey+":第N次播放:当前文件播放中:"); 
  149.                 trace(outarr(flvCurr[CabKey])); 
  150.             } 
  151.          
  152.              
  153.         }         
  154.     }else{ 
  155.         //无播放列表 
  156.         trace(CabKey+":无播放列表"); 
  157.     } 
  158.     //trace('my_video:'+Stream.length("flv:my_video")); 
  159.     //trace('my_video2:'+Stream.length("flv:my_video2")); 
  160.      
  161.      
  162.     //application.playStream.pause(); 
  163.     /* 
  164. array( 
  165.   "name"=>"foo2" 
  166.   "type"=>"flv" 
  167.   "bufferTime"=>"0" 
  168.   "time"=>"0" 
  169.   "publishQueryString"=>"" 
  170.   "maxQueueDelay"=>"500" 
  171.   "maxQueueSize"=>"4096" 
  172.   "syncWrite"=>"false" 
  173.      
  174.      
  175.     */ 
  176.     //playStream.addEventListener(fl.video.VideoEvent.COMPLETE,Flvpcomplete); 
  177.     //playStream.addEventListener(fl.video.MetadataEvent.CUE_POINT,Flvpvuepoint); 
  178.      
  179.  
  180. application.onTime = function(){ 
  181.     clearInterval(application.s); 
  182.     switch(isLoadCab){ 
  183.         case 0: 
  184.             application.loadCabList(); 
  185.             break; 
  186.         case -1:         
  187.             trace('LoadCab...');     
  188.             break; 
  189.         case 1://载入正常 
  190.             switch(isLoadVideo){ 
  191.                 case 0: 
  192.                     //this.LoadXML(xmlFile); 
  193.                     application.loadVideoList(); 
  194.                     break; 
  195.                 case -1: 
  196.                     trace(videoList); 
  197.                     trace('LoadVideo...'); 
  198.                     break; 
  199.                 case 1: 
  200.                     trace("outarr(Cablist):"); 
  201.                     trace(JSON.stringify(Cablist)); 
  202.                     for(i in Cablist){ 
  203.                         application.playlist(Cablist[i].id); 
  204.                     } 
  205.                     break;     
  206.                 case -2://读取xml失败         
  207.                     isLoadVideo=0;     
  208.                     break;     
  209.                 default:             
  210.                     break;     
  211.                      
  212.             } 
  213.              
  214.             break; 
  215.         case -2: 
  216.             isLoadCab=0
  217.             break; 
  218.         default:break; 
  219.     } 
  220.      
  221. /*    if(isLoadVideo==0){ 
  222.         application.LoadXML(xmlFile); 
  223.     } 
  224.     if(isLoadVideo==-1){ 
  225.         //还在读取xml 
  226.     }     
  227.     if(isLoadVideo==1){ 
  228.         application.playlist(); 
  229.         //isLoadVideo=0
  230.     } 
  231.     if(isLoadVideo==-2){ 
  232.          
  233.         isLoadVideo=0
  234.     }*/ 
  235.     application.s = setInterval(application.onTime,500); 
  236.     //setInterval(onTime,1000); 
  237.     //setInterval(onTime,1000); 
  238.  
  239. /* 
  240. *  application.validate: 
  241. *                 function to validate a given URL by matching through a list of 
  242. * allowed patterns. 
  243. * Parameters: 
  244. *     url:        contains the input url string. 
  245. *     patterns:    Array; an array of permmited url patterns. 
  246. * return value: 
  247. *             true; when 'url domain" contains a listed domains as a suffix. 
  248. *              false; otherwise. 
  249. */ 
  250.  
  251. application.validate = function( url, patterns ) 
  252.     // Convert to lower case 
  253.     urlurl = url.toLowerCase(); 
  254.     var domainStartPos = 0; // domain start position in the URL 
  255.     var domainEndPos = 0; // domain end position in the URL 
  256.      
  257.     switch (url.indexOf( "://" )) 
  258.     { 
  259.         case 4: 
  260.             if(url.indexOf( "http://" ) ==0) 
  261.                 domainStartPos = 7
  262.             break; 
  263.         case 5: 
  264.             if(url.indexOf( "https://" ) ==0) 
  265.                 domainStartPos = 8
  266.             break; 
  267.     } 
  268.     if(domainStartPos == 0) 
  269.     { 
  270.         // URL must be HTTP or HTTPS protocol based 
  271.         return false; 
  272.     } 
  273.     domainEndPos = url.indexOf("/", domainStartPos); 
  274.     if(domainEndPos>0) 
  275.     { 
  276.         colonPos = url.indexOf(":", domainStartPos); 
  277.         if( (colonPos>0) && (domainEndPos > colonPos)) 
  278.         { 
  279.             // probably URL contains a port number 
  280.             domainEndPos = colonPos; // truncate the port number in the URL 
  281.         } 
  282.     } 
  283.     for ( var i = 0; i < patterns.length; i++ ) 
  284.     { 
  285.         var pos = url.lastIndexOf( patterns[i]); 
  286.         if ( (pos > 0) && (pos  < domainEndPos) && (domainEndPos == (pos + patterns[i].length)) ) 
  287.             return true; 
  288.     } 
  289.     return false; 
  290.  
  291.  
  292. /* 
  293. *     application.onConnect: 
  294. *                 Implementation of the onConnect interface function (optional). 
  295. *  it is invoked whenever a client connection request connection. Live app uses this 
  296. *  function to authenticate the domain of connection and authorizes only 
  297. *  for a subscriber request. 
  298. */ 
  299.  
  300.  
  301. application.onConnect = function( p_client, p_autoSenseBW ) 
  302.     // Check if pageUrl is from a domain we know.     
  303.     // Check pageurl 
  304.  
  305.     // A request from Flash Media Encoder is not checked for authentication 
  306.     if( (p_client.agent.indexOf("FME")==-1) && (p_client.agent.indexOf("FMLE")==-1)) 
  307.     { 
  308.  
  309.         // Authenticating HTML file's domain for the request : 
  310.         // Don't call validate() when the request is from localhost 
  311.         // or HTML Domains Authentication is off. 
  312.         if ((p_client.ip != "127.0.0.1") && application.HTMLDomainsAuth 
  313.                 &&  !this.validate( p_client.pageUrl, this.allowedHTMLDomains ) ) 
  314.         { 
  315.             trace("Authentication failed for pageurl: " + p_client.pageUrl + ", rejecting connection from "+p_client.ip); 
  316.             return false; 
  317.         } 
  318.      
  319.         // Authenticating the SWF file's domain for the request : 
  320.         // Don't call validate() when the request is from localhost 
  321.         // or SWF Domains Authentication is off. 
  322.         if ((p_client.ip != "127.0.0.1") && application.SWFDomainsAuth 
  323.                 &&  !this.validate( p_client.referrer, this.allowedSWFDomains ) ) 
  324.         { 
  325.             trace("Authentication failed for referrer: " + p_client.referrer + ", rejecting connection from "+p_client.ip); 
  326.             return false; 
  327.         } 
  328.             // Logging 
  329.         trace("Accepted a connection from IP:"+ p_client.ip 
  330.                         + ", referrer: "+ p_client.referrer 
  331.                         + ", pageurl: "+ p_client.pageUrl); 
  332.  
  333.     }else{ 
  334.         // Logging 
  335.         trace("Adobe Flash Media Encoder connected from "+p_client.ip); 
  336.     } 
  337.      
  338.  
  339.     // As default, all clients are disabled to access raw audio and video and data bytes in a stream 
  340.     // through the use of BitmapData.draw() and SoundMixer.computeSpectrum()., Please refer 
  341.     // Stream Data Access doccumentations to know flash player version requirement to support this restriction 
  342.     // Access permissions can be allowed for all by uncommenting the following statements 
  343.      
  344.     //p_client.audioSampleAccess = "/"
  345.      //p_client.videoSampleAccess = "/";     
  346.  
  347.     this.acceptConnection(p_client); 
  348.          
  349.     // A connection from Flash 8 & 9 FLV Playback component based client 
  350.     // requires the following code. 
  351.  
  352.     if (p_autoSenseBW) 
  353.         p_client.checkBandwidth(); 
  354.     else 
  355.         p_client.call("onBWDone"); 
  356.          
  357.  
  358. /* 
  359. * Client.prototype.getPageUrl 
  360. *                 Public API to return URL of the HTML page.                 
  361. */ 
  362.  
  363. Client.prototype.getPageUrl = function() { 
  364.     return this.pageUrl; 
  365.  
  366. /* 
  367. * Client.prototype.getReferrer 
  368. *                 Public API to return Domain URL of the client SWF file.                 
  369. */ 
  370. Client.prototype.getReferrer = function() { 
  371.     return this.referrer; 
  372.  
  373. /* 
  374. * FCPublish : 
  375. * FME calls FCPublish with the name of the stream whenever a new stream 
  376. * is published. This notification can be used by server-side action script 
  377. * to maintain list of all streams or also to force FME to stop publishing. 
  378. * To stop publishing, call "onFCPublish" with an info object with status 
  379. * code set to "NetStream.Publish.BadName". 
  380. */ 
  381.  
  382. Client.prototype.FCPublish = function( streamname ) 
  383.   
  384.     // setup your stream and check if you want to allow this stream to be published 
  385.     if ( true) // do some validation here 
  386.     {      // this is optional. 
  387.         this.call("onFCPublish", null, {code:"NetStream.Publish.Start", description:streamname}); 
  388.     } 
  389.     else 
  390.     { 
  391.         this.call("onFCPublish", null, {code:"NetStream.Publish.BadName", description:streamname}); 
  392.     } 
  393.          
  394.  
  395. /* 
  396. * FCUnpublish : 
  397. * FME notifies server script when a stream is unpublished. 
  398. */ 
  399.  
  400. Client.prototype.FCUnpublish = function( streamname ) 
  401.     // perform your clean  up 
  402.     this.call("onFCUnpublish", null, {code:"NetStream.Unpublish.Success", description:streamname}); 
  403.  
  404. /* 
  405. * releaseStream : 
  406. * When FME connection to FMS drops during a publishing session it will 
  407. * try and republish the stream when connection is restored. On certain 
  408. * occasions FMS will reject the new stream because server is still 
  409. * unaware of the connection drop, sometimes this can take a few minutes. 
  410. * FME calls "releaseStream" method with the stream name and this can be 
  411. * used to forcibly clear the stream. 
  412. */ 
  413. Client.prototype.releaseStream = function(streamname) 
  414.      s = Stream.get(streamname); 
  415.      s.play(false); 
  416.  
  417.  
  418. /* 
  419. * application.readValidDomains 
  420. *             Function to read Allowed domain file 
  421. * Parameters: 
  422. *         fileName: 
  423. *             name of the file in the application directory 
  424. * which contains one valid domain name per line. This file can contain 
  425. * comments followed by a '#' as the very first charector in that line. 
  426. * a non-comment entry with a space is considered as an error case. 
  427. *   
  428. * returns 
  429. *         an array in which each entry contains a domain name 
  430. * listed in the file. 
  431. */ 
  432.  
  433. application.readValidDomains = function( fileName , domainsType ) 
  434.     var domainFile = new File(fileName); 
  435.     var domainsArray = new Array(); 
  436.     var index = 0
  437.     var lineCount = 0
  438.     var tempLine; 
  439.     domainFile.open("text", "read"); 
  440.      
  441.     // Read the file line-by-line and fill the domainsArray 
  442.     // with valid entries 
  443.     while (domainFile.isOpen && ! domainFile.eof() ) 
  444.     { 
  445.          
  446.         tempLine = domainFile.readln(); 
  447.         lineCount++; 
  448.         if( !tempLine  || tempLine.indexOf("#") == 0) 
  449.         { 
  450.             continue; 
  451.         } 
  452.         tempLinetempLine = tempLine.trim(); 
  453.         if(tempLine.indexOf(" ")!=-1) 
  454.         { 
  455.             trace("undesired <space>, domain entry ignored. "+fileName+":"+(lineCount+1)); 
  456.         } 
  457.         else 
  458.         { 
  459.             domainsArray[index] =  tempLine.toLowerCase(); 
  460.             index++; 
  461.              
  462.             if(tempLine == "*") 
  463.             { 
  464.                 switch (domainsType){ 
  465.                      
  466.                     case "HTMLDomains": 
  467.                         trace ("Found wildcard (*) entry: disabling authentication for HTML file domains ")    ; 
  468.                         application.HTMLDomainsAuth =    false;         
  469.                         break; 
  470.                      
  471.                     case "SWFDomains": 
  472.                         trace ("Found wildcard (*) entry: disabling authentication for SWF file domains ")    ; 
  473.                         this.SWFDomainsAuth =    false;         
  474.                         break; 
  475.                          
  476.                     default: 
  477.                         // Do nothing 
  478.                         break;     
  479.                 } 
  480.             } 
  481.         } 
  482.     } // End while 
  483.      
  484.     // Something is wrong! the domains file must be accessible. 
  485.     if( !domainFile.isOpen){ 
  486.         trace("Error: could not open '"+fileName+"', rejecting all clients except localhost. "); 
  487.          
  488.     } 
  489.     else 
  490.     { 
  491.         domainFile.close(); 
  492.     } 
  493.  
  494.     return domainsArray; 
  495.  
  496.  
  497. application.LoadXML = function(xmlFile){ 
  498.     trace('LoadXML:' + xmlFile); 
  499.     isLoadVideo = -1; 
  500.     var _loc6 = new XML(); 
  501.     trace('Load XML'); 
  502.     _loc6.load(xmlFile); 
  503.     _loc6._parent = this
  504.     _loc6.ignoreWhite = true
  505.     _loc6.getBytesLoaded(); 
  506.     _loc6.onLoad = function(e) 
  507.     { 
  508.         trace('Load'); 
  509.         if (e) 
  510.         { 
  511.             trace(e); 
  512.             //var _loc5 = new XMLNode(); 
  513.             //trace(_loc5); 
  514.             trace(this); 
  515.             _loc5 = this.childNodes; 
  516.             trace(_loc5); 
  517.             trace(_loc5[0].childNodes.length); 
  518.  
  519.             Data_array2 = new Array(); 
  520.             for (var _loc3 = 0; _loc3 < _loc5[0].childNodes.length; ++_loc3) 
  521.             { 
  522.  
  523.                 Data_array2[_loc3] = new Object();                 
  524.                 Data_array2[_loc3].flvname = _loc5[0].childNodes[_loc3].attributes.flvname 
  525.                 Data_array2[_loc3].start = _loc5[0].childNodes[_loc3].attributes.start; 
  526.             }// end of for 
  527.             trace('isLoadVideo:xml'); 
  528.             //trace(outarr(Data_array2)); 
  529.             videoList = Data_array2
  530.          
  531.             isLoadVideo = 1
  532.         } 
  533.         else 
  534.         { 
  535.             isLoadVideo = -2; 
  536.             trace("Load Error"); 
  537.         }// end else if 
  538.     }; 
  539. }// End of the function 
  540.  
  541. outarr  = function(arr, level) 
  542.  
  543.     var astring = ''
  544.     if (level == undefined || isNaN(level)) 
  545.     { 
  546.         level = 0
  547.     } 
  548.  
  549.     for (a = 0; a < level; a++) 
  550.     { 
  551.         astring += '  '; 
  552.     } 
  553.     //trace('astring:' + astring); 
  554.  
  555.     out = 'array(\r'
  556.     for (i in arr) 
  557.     { 
  558.         if (typeof (arr[i]) == 'object') 
  559.         { 
  560.             out += astring + '  "' + i + '"=>' + outarr(arr[i], level + 1); 
  561.         } 
  562.         else 
  563.         { 
  564.             out += astring + '  "' + i + '"=>"' + arr[i] + '"\r'; 
  565.         } 
  566.     } 
  567.     out += astring + ')\r'; 
  568.     return out; 
  569.  
  570. /** 
  571. * String.prototype.trim: 
  572. *             Function to trim spaces in start an end of an input string. 
  573. * returns: 
  574. *         a trimmed string without any leading & ending spaces. 
  575. *          
  576. */ 
  577. String.prototype.trim = function () { 
  578.      
  579.     return this.replace(/^\s*/, "").replace(/\s*$/, ""); 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器