7

これは、少なくとも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 のログには、接続試行が表示された後、何も表示されません。メタデータをロードするときに、少なくとも再生イベントがログに記録されている必要があります。これは非常に苛立たしく、デバッグが不可能です。

4

2 に答える 2

0

私の問題は、ポート 80 経由で接続していたと思います。当初、rtmpt でポート 80 を使用する必要があると考えていたので、Settings.recordServer変数をに設定しましたrtmpt://myamsserver.net:80/app。私は今、ポート/プロトコルの組み合わせを一度に試して、接続する最初のものを選択するショットガン アプローチを使用しています。ほとんどの場合、rtmpt 経由でポート 443 を選択しています。これは、80 よりもはるかに高速で安定しているように見えます。それ以来、この問題は発生していません。また、Stefan が提案したように同じNetConnectionオブジェクトを再利用していないことが原因である可能性もありますが、言うのは難しいです。

于 2014-12-02T22:44:55.770 に答える
0

1 つは記録用、もう 1 つは再生用です。これにより、リスナーの追加/削除および接続/再接続/切断ロジックに関する複雑さが解消され、IMO がよりクリーンになります。NetConnections は安価であり、私は手元のタスクごとに常に 1 つ使用しています。もう 1 つの利点は、起動時に両方を接続できるため、リプレイ接続がすぐに準備できることです。

ここで Promise が使用されているのを見たことがありませんが、それが問題を引き起こす可能性があるかどうかについてコメントする資格はありません。

于 2014-12-02T22:30:57.100 に答える