6

Bu, en azından bir haftalığına gitmemi sağladı. AMS'ye bir video dosyası kaydetmeye çalışıyorum. Neredeyse 10 veya 15 kayıt seansı dışında neredeyse her zaman harika çalışıyor, akışı kapattığımda AMS'den netstream'de asla 'NetStream.Unpublish.Success' alıyorum. Bu olduğunda rtmpt kullanarak AMS'ye bağlanıyorum, rtmp üzerinde iyi çalışıyor gibi görünüyor. Ayrıca, bu sadece Mac'te safari'de olduğu gibi görünüyor, ama o kadar aralıklı olduğu için gerçekten ona güvenmiyorum. Şimdi bağlantı girişimi başına yeni bir NetConnection'ı kullanarak ve aynı zamanda (aşağıda benim 'cevabını' bakınız) portu 80 zorlama değilim AMS, yayından kaldırma komutunu alır. SOMETIMES, rtmpt üzerinden

// just a way to use promises with netStatusEvents 
private function netListener(code:String, netObject:*):Promise { 
    var deferred:Deferred = new Deferred(); 

    var netStatusHandler:Function = function (event:NetStatusEvent):void { 
     if (event.info.level == 'error') { 
      deferred.reject(event); 
     } else if (event.info.code == code) { 
      deferred.resolve(netObject); 
      // we want this to be a one time listener since the connection can swap between record/playback 
      netObject.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
     } 

    }; 

    netObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 

    return deferred.promise; 
} 

// set up for recording 
private function initRecord():void { 

    Settings.recordFile = Settings.uniquePrefix + (new Date()).getTime(); 

    // detach any existing NetStream from the video 
    _view.video.attachNetStream(null); 

    // dispose of existing NetStream 
    if (_videoStream) { 
     _videoStream.dispose(); 
     _videoStream = null; 
    } 

    // disconnect before connecting anew 
    (_nc.connected ? netListener('NetConnection.Connect.Closed', _nc) : Promise.when(_nc)) 
    .then(function (nc:NetConnection):void { 

     netListener('NetConnection.Connect.Success', _nc) 
     .then(function (nc:NetConnection):void { 

      _view.video.attachCamera(_webcam); 
      // get new NetStream 
      _videoStream = getNetStream(_nc); 

      ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecordReady", true); 

     }, function(error:NetStatusEvent):void { 
      ExternalInterface.call("CTplayer." + Settings.instanceName + ".onError", error.info); 
     }); 

     _nc.connect(Settings.recordServer); 

    }); // end ncClose 

    if (_nc.connected) _nc.close(); 

} 

// stop recording 
private function stop():void { 

    netListener('NetStream.Unpublish.Success', _videoStream) 
    .then(function (ns:NetStream):void {   
     ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecordStop", Settings.recordFile); 
    }); 

    _videoStream.attachCamera(null); 
    _videoStream.attachAudio(null); 
    _videoStream.close(); 
} 

// start recording 
private function record():void { 

    netListener('NetStream.Publish.Start', _videoStream) 
    .then(function (ns:NetStream):void { 
     ExternalInterface.call("CTplayer." + Settings.instanceName + ".onRecording"); 
    }); 

    _videoStream.attachCamera(_webcam); 
    _videoStream.attachAudio(_microphone); 
    _videoStream.publish(Settings.recordFile, "record"); // fires NetStream.Publish.Success 

} 

Güncelleme: İşte benim temel akışıdır. Bu benim bağlantı sıkıntılarımı çözmedi, sadece örnekleri daha seyrek yaptı. Şimdi her hafta olduğu gibi ya da ams ya da flaşın hala rastgele bir başarısızlığı var. Son zamanlarda birisi bir kayıt yaptı ve daha sonra flash player, videoyu oynatma için yükleyemedi. Ams kayıtları bir bağlantı girişimi gösterir ve sonra hiçbir şey göstermez. Meta verileri yüklediğimde en azından bir oyun olayı olması gerekir. Bu oldukça sinir bozucu ve hata ayıklaması imkansız.

+0

wireshark kullanmayı denediniz mi ve gerçekten kontrol ettiniz mi? – bond

+0

Bu "** kontrol etmek için çok hızlı" bir sorun olabilir mi? Bir yayına/yakalamaya çalışabilirseniz, yayından kaldırma komutu başarısız olursa, yeniden yayından kaldırmayı denemeden önce bir dakika beklersiniz ..? RTMPT'nin (RTMP ve diğerleri için bir HTTP sarıcısı olmak) doğasının bazen hıçkırıklara neden olabileceğini düşünüyorum, bu yüzden belki de bir zamanlanmış tekrar denemeye yardımcı olabilir .. –

+0

Tam olarak aynı sorunu yaşıyorum, bir çözüm buldunuz mu? NetStream.Unpublish.Success' alınmazsa bir süre sonra tekrar close() nasıl çağırılır? – SoftForge

cevap

0

Ben 2 farklı NetConnection nesneleri kayıt için bir tane ve tekrar izlemek için denemek istiyorum. Bu, dinleyicilerin ekleme/çıkarma ve bağlanma/yeniden bağlanma/bağlantı kesme mantığı etrafında karmaşıklıklarınızı ortadan kaldıracak ve IMO daha temiz olacaktır. NetConnections, ucuzdur ve her zaman görev başına bir tane kullanıyorum. Diğer avantajı, başlangıçta her ikisini de bağlayabilmeniz, böylece tekrar bağlantı bağlantısının anında hazır olmasıdır.

Daha önce burada kullanılan bir Promise görmedim, ama bu bir soruna neden veya olmayabilir eğer yorumlamak nitelikli değilim.

0

Sorununun bağlantı noktası 80 üzerinden bağlandığını düşünüyorum. Başlangıçta, bağlantı noktası 80'i rtmpt ile kullanmam gerektiğini düşündüğümden, Settings.recordServer değişkenimi rtmpt://myamsserver.net:80/app olarak ayarlıyorum. Şu anda bir av tüfeği/protokol kombinasyonunu bir kerede denediğim ve bağlanacak ilk tanesini seçtiğim bir av tüfeği yaklaşımı kullanıyorum. Hemen hemen her zaman 80'den fazla daha hızlı ve daha istikrarlı görünen rtmpt üzerinden 443 numaralı bağlantı noktasını seçiyor ve bu yana bu sorunu yaşamadım. Ayrıca, Stefan'ın önerdiği gibi aynı NetConnection nesnesinin tekrar kullanılmaması nedeniyle de söylenebilir.