이 사람이 저에게 적어도 일주일 간 가도록했습니다. AMS에 비디오 파일을 녹화하려고합니다. 거의 모든 시간 동안 작동하지만 10 또는 15 회의 녹화 세션 중 1 회를 제외하고는 스트림을 닫을 때 AMS의 넷 스트림에서 'NetStream.Unpublish.Success'를받지 못합니다. 이 문제가 발생하면 rtmpt를 사용하여 AMS에 연결하고 있는데 rtmp보다 정상적으로 작동하는 것 같습니다. 또한, 이것은 단지 Mac에서 사파리에서 발생하는 것처럼 보이지만 그 간헐적 인 이후로 나는 그것을 정말로 신뢰하지 않습니다. 지금 연결 시도마다 새로운 NetConnection을을 사용하고 있습니다 (아래에있는 내 '대답'참조) 포트 (80)를 강제하고 있지 않다 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
}
업데이트 : 여기 내 기본 흐름이다. 이것은 나의 연결 비참함을 해결하지 못했고 단지 인스턴스를 드물게 만들었습니다. 지금 매주마다 또는 이렇게 나는 암 또는 섬광의 어떤 무작위 실패가 아직도있다. 최근에 누군가가 녹음을 한 다음 플래시 플레이어가 재생을 위해 동영상을로드 할 수 없었습니다. ams 로그에 연결 시도가 표시되고 아무 것도 표시되지 않습니다. 최소한 메타 데이터를로드 할 때 재생 이벤트가 기록되어야합니다. 이것은 매우 실망스럽고 디버깅이 불가능합니다.
wireshark를 사용하여 실제로 시도 했습니까? – bond
** "확인하기에는 너무 빠름"** 문제 일 수 있습니까? try/catch를 할 수 있습니까? 게시 취소 명령을 실패하면 다시 게시를 시도하기 전에 잠시 기다려주세요. RTMPT (RTMP 외의 HTTP 래퍼가되는)의 특성으로 인해 때로는 딸꾹질이 발생하여 시간이 초과 된 시도가 도움이 될 수 있다고 생각합니다. –
정확히 같은 문제가 발생했는데 해결책을 찾았습니까? 'NetStream.Unpublish.Success'가 수신되지 않으면 일정 기간 후에 close()를 다시 호출하는 방법은 무엇입니까? – SoftForge