これは、少なくとも1週間は行っていました。ビデオファイルを AMS に記録しようとしています。10 回または 15 回のレコーディング セッションに 1 回を除いて、ほぼ常に問題なく機能します。これが発生した場合、rtmpt を使用して AMS に接続しています。rtmp では問題なく動作しているようです。また、これは Mac のサファリでのみ発生するようですが、非常に断続的であるため、あまり信頼できません。これが私の基本的な流れです:
// 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 を強制していません (以下の「回答」を参照してください)。これは私の接続の問題を解決したわけではなく、インスタンスがよりまれになっただけです. 毎週かそこらのように、まだamまたはフラッシュのランダムな障害が発生しています。ごく最近、誰かが録画を行った後、Flash Player がビデオを読み込んで再生できませんでした。ams のログには、接続試行が表示された後、何も表示されません。メタデータをロードするときに、少なくとも再生イベントがログに記録されている必要があります。これは非常に苛立たしく、デバッグが不可能です。