AMS没有收到取消发布命令SOMETIMES over rtmpt

时间:2014-11-24 23:36:06

标签: actionscript-3 rtmp netstream flash-media-server adobe-media-server

这个让我至少去了一个星期。我正在尝试将视频文件录制到AMS。它几乎在所有时间都很好用,除了大约十分之一或十五个录音会话,我从未收到过NetStream.Unpublish.Success'当我关闭流时,在AMS的网络上。当发生这种情况时,我使用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播放器无法加载视频进行播放。 ams日志显示连接尝试,然后没有。在加载元数据时,至少应该记录一个播放事件。这非常令人沮丧,无法调试。

2 个答案:

答案 0 :(得分:0)

我会尝试2个不同的NetConnection对象,一个用于记录,一个用于重放。这将消除围绕侦听器添加/删除和连接/重新连接/断开逻辑的复杂性,并且IMO会更清晰。 NetConnections很便宜,我总是每个任务都使用一个。另一个优点是您可以在启动时连接两者,以便立即准备重播连接。

我以前没见过这里使用的承诺,但如果可能导致问题,我没有资格发表评论。

答案 1 :(得分:0)

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