У меня был хотя бы неделю. Я пытаюсь записать видеофайл в AMS. Он отлично работает почти все время, за исключением 1 из 10 или 15 сеансов записи, я никогда не получаю «NetStream.Unpublish.Success» в моем сетевом потоке от AMS, когда я закрываю поток. Я подключаюсь к AMS, используя rtmpt, когда это происходит, кажется, что он работает нормально над rtmp. Кроме того, похоже, что это происходит только в сафари на Mac, но, поскольку он настолько прерывистый, я на это не верю. Вот мой основной поток:AMS не получает неопубликованную команду ИНОГДА по 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
}
Update Я сейчас, используя новый NetConnection за попытку подключения, а также не форсирует порт 80 (см мой «ответ» ниже). Это не разрешило мои проблемы с подключением, только делали случаи более нечастыми. Теперь, как каждую неделю или около того, у меня все еще есть случайный сбой ams или flash. Совсем недавно кто-то сделал запись, а затем флеш-плеер не смог загрузить видео для воспроизведения. Журналы ams показывают попытку подключения, а затем ничего. По крайней мере, должно быть событие воспроизведения, зарегистрированное для загрузки метаданных. Это довольно сложно и невозможно отладить.
Вы пробовали использовать wirehark и на самом деле проверить? – bond
Может ли это быть «слишком быстро проверить» ** вопрос? Можете ли вы попробовать/поймать, где, если он не выполнит команду unublish, которую вы ждете, прежде чем повторять попытку отменить публикацию ...? Я думаю, что характер RTMPT (являющийся HTTP-оберткой для RTMP и др.) Иногда вызывает икоты, поэтому возможно временная повторная попытка может помочь. –
У меня точно такая же проблема, вы когда-нибудь находили решение? Как насчет вызова close() снова через какое-то время, если 'NetStream.Unpublish.Success' не получен? – SoftForge