2

無法在此獲得任何喜愛,並且很難相信。實時流媒體和NetStream上的緩衝區不會混合。爲什麼?該文件並沒有說你不能這樣做。Flex +緩衝區+通過RTMP的直播流=災難

回放變得紊亂。緩衝區應該填滿您在播放前設置的內容。相反,大約有一半的時間,玩家會立即開始玩,並無視您設置的緩衝時間。然後,您會陷入短暫的緩衝和重新緩衝循環,從而降低播放體驗。

自己試一試。這裏是最簡單的直播視頻播放器。沒有多餘的裝飾。通過在ns.play()語句中更改defaultURL字符串和流名稱,將其連接到您的實時流。

在Flex調試模式下運行它。它會每秒檢查並打印ns.bufferLength屬性。緩衝區當前設置爲20秒。上次我運行它時,我從未在緩衝區中超過2秒。玩家馬上開始玩,而不是先緩衝整個20秒。有時你會達到滿20歲,有時候不會。爲什麼?不知道。

您不能可靠地緩衝直播流,或者代碼有問題嗎?

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    initialize="init()"> 
    <mx:Script> 
     <![CDATA[ 
      import flash.media.Video; 
      import flash.net.NetConnection; 
      import flash.net.NetStream; 
      import mx.core.UIComponent; 

      private var vid:Video; 
      private var videoHolder:UIComponent; 
      private var nc:NetConnection; 
      private var defaultURL:String="rtmp://your_streaming_server_url_here"; 
      private var ns:NetStream; 
      private var msg:Boolean; 

      private var intervalMonitorBufferLengthEverySecond:uint; 

      private function init():void 
      { 
       vid=new Video(); 
       vid.width=864; 
       vid.height=576; 
       vid.smoothing = true;        
       //Attach the video to the stage    
       videoHolder = new UIComponent(); 
       videoHolder.addChild(vid); 
       addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
       this.addChild(videoHolder); 
       connect(); 
      } 

      public function onSecurityError(e:SecurityError):void 
      { 
       trace("Security error: "); 
      } 

      public function connect():void 
      { 
       nc = new NetConnection(); 
       nc.client = this; 
       nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
       nc.connect(defaultURL);     
      } 

      public function netStatusHandler(e:NetStatusEvent):void 
      { 
       switch (e.info.code) { 
        case "NetConnection.Connect.Success": 
         trace("Connected successfully"); 
         createNS();     
         break; 
        case "NetConnection.Connect.Closed": 
         trace("Connection closed");     
         connect(); 
         break; 
        case "NetConnection.Connect.Failed": 
         trace("Connection failed");     
         break; 
        case "NetConnection.Connect.Rejected": 
         trace("Connection rejected");         
         break; 
        case "NetConnection.Connect.AppShutdown": 
         trace("App shutdown");         
         break;   
        case "NetConnection.Connect.InvalidApp": 
         trace("Connection invalid app");          
         break;                          
       }   
      } 

      public function createNS():void 
      { 
       trace("Creating NetStream"); 
       ns=new NetStream(nc); 
       //nc.call("FCSubscribe", null, "live_production"); // Only use this if your CDN requires it 
       ns.addEventListener(NetStatusEvent.NET_STATUS, netStreamStatusHandler); 
       vid.attachNetStream(ns); 

       //Handle onMetaData and onCuePoint event callbacks: solution at http://tinyurl.com/mkadas 
       //See another solution at http://www.adobe.com/devnet/flash/quickstart/metadata_cue_points/ 
       var infoClient:Object = new Object(); 
       infoClient.onMetaData = function oMD():void {}; 
       infoClient.onCuePoint = function oCP():void {};   
       ns.client = infoClient; 
       ns.bufferTime = 20; 
       ns.play("your_stream_name");  
       ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
       function asyncErrorHandler(event:AsyncErrorEvent):void { 
        trace(event.text); 
       } 
       intervalMonitorBufferLengthEverySecond = setInterval(monPlayback, 1000); 
      } 

      public function netStreamStatusHandler(e:NetStatusEvent):void 
      { 
       switch (e.info.code) { 
        case "NetStream.Buffer.Empty": 
         trace("Buffer empty: "); 
         break; 
        case "NetStream.Buffer.Full": 
         trace("Buffer full:"); 
         break; 
        case "NetStream.Play.Start": 
         trace("Play start:"); 
         break;      
       }  
      } 

      public function monPlayback():void { 
       // Print current buffer length 
       trace("Buffer length: " + ns.bufferLength); 
      } 

      public function onBWDone():void { 
       //Do nothing 
      }   

      public function onFCSubscribe(info:Object):void {  
       // Do nothing. Prevents error if connecting to CDN.  
      } 

      public function onFCUnsubscribe(info:Object):void {  
       // Do nothing. Prevents error if connecting to CDN.  
      } 

     ]]> 
    </mx:Script>  
</mx:Application> 

我最後的運行:

Connected successfully 
Creating NetStream 
Play start: 
Buffer length: 0.001 
Buffer full: //Obviously the buffer is not full here. Bogus. 
Buffer length: 2.202 
Buffer length: 2.369 
Buffer length: 2.102 
Buffer length: 2.402 
Buffer length: 2.302 
Buffer length: 2.369 
Buffer length: 2.269 
Buffer length: 2.269 
Buffer length: 2.302 
Buffer length: 2.369 
Buffer length: 1.926 
Buffer length: 2.336 
Buffer length: 2.286 
Buffer length: 2.336 
Buffer length: 2.336 
Buffer length: 2.403 
Buffer length: 2.388 
Buffer length: 2.402 
Buffer length: 2.335 
Buffer length: 2.369 
Buffer length: 2.336 
Buffer length: 2.339 
Buffer length: 2.369 
Buffer length: 2.402 
Buffer length: 2.369 
Buffer length: 2.396 
Buffer length: 2.436 
Buffer length: 2.336 
Buffer length: 2.269 

回答

0

更多的是思想的,但這裏有雲:Flash Player的內部流發條可能會拒絕緩存比它認爲有什麼更多的直播「的必要。」這個想法是,如果你有一個直播流,你有一個直播流。在大多數情況下,由於緩衝區而延遲(認爲一對一視頻聊天)會很荒謬而且非常令人沮喪。

這些事情可能實際上是由服務器控制的,但我可能是錯誤的。希望你能找到問題:-)

3

AS3 reference一個很好的解決辦法明確規定,你不能做到這一點:

直播內容當流媒體直播內容,將bufferTime屬性設置爲0

鑑於此,如果您告訴我們您要實現的目標,那麼或許我們可以提出另一種解決方案。