AMS 有时不会通过 rtmpt 接收取消发布命令


这个至少让我

去了一个星期。我正在尝试将视频文件录制到 AMS。它几乎在所有时间都运行良好,除了大约十分之一或 15 个录制会话,当我关闭流时,我从未在 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
}

更新我现在每次连接尝试使用新的网络连接,并且不强制端口 80(请参阅下面的"答案")。这并没有解决我的连接问题,只会使实例更加不频繁。现在就像每周左右一样,我仍然有一些ams或flash的随机故障。最近有人进行了录制,然后闪存播放器无法加载视频进行播放。ams 日志显示连接尝试,然后什么都没有。加载元数据时至少应该记录一个播放事件。这是非常令人沮丧且无法调试的。

我会尝试2个不同的NetConnection对象,一个用于记录,一个用于重播。这将消除您在侦听器添加/删除和连接/重新连接/断开连接逻辑方面的复杂性,并且 IMO 会更干净。网络连接很便宜,我手头的每个任务总是使用一个。另一个优点是您可以在启动时连接两者,因此重播连接立即准备就绪。

我以前没有在这里看到过承诺,但我没有资格评论这是否会导致问题。

我认为

我的问题是通过端口 80 连接。我最初认为我必须将端口 80 与 rtmpt 一起使用,所以我将我的 Settings.recordServer 变量设置为 rtmpt://myamsserver.net:80/app .我现在使用霰弹枪方法,我一次尝试一堆端口/协议组合并选择第一个进行连接。它几乎总是在 rtmpt 上选择端口 443,这似乎比 80 左右更快、更稳定,从那以后我就没有遇到过这个问题。这也可能是由于没有像Stefan建议的那样重复使用相同的NetConnection对象,很难说。

最新更新