6

Questo mi ha fatto andare almeno per una settimana. Sto cercando di registrare un file video su AMS. Funziona benissimo quasi tutto il tempo, tranne circa 1 su 10 o 15 sessioni di registrazione, non ricevo mai "NetStream.Unpublish.Success" sul mio netstream da AMS quando chiudo lo stream. Mi sto collegando ad AMS usando rtmpt quando questo accade, sembra funzionare bene su rtmp. Inoltre, sembra che questo avvenga solo in Safari su Mac, ma dal momento che è così intermittente non mi fido di quello. Qui è il mio flusso di base:AMS non riceve il comando di non pubblicazione SOMETIMES su rtmpt

// 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 

} 

Aggiornamento ora sto usando un nuovo NetConnection per tentativo di connessione e, inoltre, non forzare la porta 80 (vedere la mia 'risposta' al di sotto). Questo non ha risolto i miei problemi di connessione, solo reso le istanze più rare. Ora, come ogni settimana, ho ancora qualche errore casuale di ams o flash. Più recentemente qualcuno ha fatto una registrazione e quindi il flash player non è stato in grado di caricare il video per la riproduzione. I log di ams mostrano un tentativo di connessione e quindi nulla. Ci dovrebbe essere almeno un evento di gioco registrato quando carico i metadati. Questo è abbastanza frustrante e impossibile da eseguire il debug.

+0

Hai provato a utilizzare wireshark e in realtà controllare? – bond

+0

Potrebbe essere un ** "troppo veloce per controllare" ** problema? Puoi provare/catturare dove se fallisce il comando di non pubblicazione ti aspetti un attimo prima di riprovare a non pubblicare ..? Penso che la natura di RTMPT (essendo un wrapper HTTP per RTMP et al) a volte causi singhiozzo quindi forse un tentativo temporizzato potrebbe aiutare .. –

+0

Sto avendo esattamente lo stesso problema, hai mai trovato una soluzione? Che ne dici di chiamare close() di nuovo dopo un periodo di tempo se 'NetStream.Unpublish.Success' non viene ricevuto? – SoftForge

risposta

0

Vorrei provare 2 oggetti NetConnection distinti, uno per la registrazione e uno per la riproduzione. Ciò rimuoverà le tue complessità intorno agli ascoltatori aggiungendo/rimuovendo e connettendo/ricollegando/disconnettendo la logica e renderebbe IMO più pulito. Le connessioni NetConnections sono economiche e ne ho sempre utilizzato uno per attività. L'altro vantaggio è che è possibile connettersi entrambi all'avvio in modo che la connessione di riproduzione sia pronta all'istante.

Non ho visto una promessa usata qui prima, ma non sono qualificato per commentare se ciò potrebbe causare un problema oppure no.

0

Penso che il mio problema fosse la connessione sulla porta 80. Inizialmente pensavo di dover usare la porta 80 con rtmpt, quindi ho impostato la mia variabile Settings.recordServer su rtmpt://myamsserver.net:80/app. Ora sto usando un approccio shotgun in cui provo un sacco di combo port/protocol contemporaneamente e scelgo il primo da connettere. Sta quasi sempre selezionando la porta 443 su rtmpt, che sembra molto più veloce e più stabile in tutto rispetto a 80, e da allora non ho più avuto questo problema. Potrebbe anche essere dovuto a non riutilizzare lo stesso oggetto NetConnection come suggerito da Stefan, è difficile dirlo.

Problemi correlati