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.
Hai provato a utilizzare wireshark e in realtà controllare? – bond
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 .. –
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