这个至少让我去了一个星期。我正在尝试将视频文件录制到AMS。它几乎在所有时间都运行良好,除了每10或15个录制 session 中大约有1个,当我关闭流时,我从未从AMS的netstream上收到“NetStream.Unpublish.Success”。发生这种情况时,我正在使用rtmpt连接到AMS,它似乎可以在rtmp上正常工作。另外,这似乎只发生在Mac上的safari中,但是由于它是如此的断断续续,所以我真的不相信这一点。这是我的基本流程:
// 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
}
更新
我现在每次连接尝试都使用新的NetConnection,并且也没有强制使用端口80(请参见下面的“答案”)。这并没有解决我的连接问题,只是使实例变得更不常见了。现在像每周大约一样,我仍然会因ams或flash出现一些随机故障。最近有人录制了视频,然后Flash播放器无法加载视频进行播放。 ams日志显示连接尝试,然后不显示任何内容。加载元数据时,至少应记录一个播放事件。这非常令人沮丧,无法调试。
最佳答案
我会尝试2个不同的NetConnection对象,一个用于记录,另一个用于重播。这将消除您在监听器添加/删除和连接/重新连接/断开逻辑周围的复杂性,并且使IMO更加干净。
NetConnections便宜,而且我经常在每个任务上使用一个。另一个优点是您可以在启动时同时连接两者,以便立即准备好重放连接。
我以前没有在这里看到过Promise,但是如果这可能引起问题,那么我没有资格发表评论。
关于actionscript-3 - AMS在rtmpt上未收到取消发布命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27116218/