2

私は過去にLimeLightサーバーを使用してビデオをストリーミングするクライアント用のプレーヤーを作成しましたが、以前は問題がありませんでしたが、別のLimeLightサーバーを使用する新しいクライアントの場合、ビデオの終了が3〜4秒早すぎるようです。

私がテストした3つの大きく異なるビデオの私のトレース:

metadata duration = 32        // 32 secs long, ends at 27
Stop [27.350 seconds] = 4.65 

metadata duration = 17        // 17 secs long, ends at 12
Stop [12.852 seconds] = 4.148

metadata duration = 258       // 258 secs long, ends at 255
Stop [255.861 seconds]

ビデオプレーヤーでは、チェックしてNetStream.Play.Stopから「リセット」タイプの関数をそこに配置します。ただし、この奇妙なバグが原因で、この関数のトリガーが早すぎます。誰かがこれを見たことがありますか?


private function netStatusHandler(event:NetStatusEvent):void 
    {
        trace("connected is: " + nc.connected );

        switch (event.info.code) 
        {
            case "NetConnection.Connect.Success":
                trace("Connected");
                connectStream();
                break;

            case "NetStream.Play.Start":
                trace("********** Start [" + ns.time.toFixed(3) + " seconds]");
            break;

            case "NetStream.Play.Stop":
                trace("‹ ----------- Playback has stopped. ----------- ›");
                trace("Stop [" + ns.time.toFixed(3) + " seconds]");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;
                videoStatus = "NotPlaying";
                resetVideo(); //<- Video ends so go back to start
                // ^ This triggers too early
            break;
        }
    }

これに対する唯一の回避策は、メタデータ期間から取得した初期数を保存し、タイマーを実行して現在のns.timeがメタデータと一致するかどうかを常に確認してから、リセット機能を実行することです。

4

2 に答える 2

7

修正を見つけました!

http://www.wildform.com/support/tutorials/loopingFLVs/

ネットストリームがplay.stopにヒットしたときに最初にチェックを入れ、次にバッファが空になったときにリセット関数を呼び出す必要がありました...

サイトのコードはAS2ですが、AS3に変換しました。

private function netStatusHandler(event:NetStatusEvent):void 
    {
        trace("connected is: " + nc.connected );

        switch (event.info.code) 
        {
            case "NetConnection.Connect.Success":
                trace("Connected");
                connectStream();
                break;

            case "NetStream.Buffer.Empty":
                trace("‹ ----------- Buffer is Empty! ----------- ›");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;

                if (videoFinished) // < Now I can run my reset
                {
                    resetVideo();
                    videoFinished = false;
                }

            break;

            case "NetStream.Buffer.Full":
                trace("‹ ----------- Buffer is FULL! ----------- ›");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;
            break;

            case "NetStream.Buffer.Flush":
                trace("Data has finished streaming, remaining buffer will be emptied.");
                videoStatus = "NotPlaying";
            break;

            case "NetStream.Play.Stop":
                trace("‹ ----------- Playback has stopped. ----------- ›");

                videoFinished = true; // < This first
            break;
        }
    }
于 2010-01-25T21:23:34.693 に答える
3

このスレッドが信じられないほど古いことは知っていますが、この問題を解決しようとして頭を悩ませていました。あなたの解決策を除けば、それについてはオンラインではあまりありません。

それで、私はそれを理解しました。rtmp を使用している場合は、bufferTime を false に変更する必要があります。

rtmp はキャッシュしないため、バッファ時間は必要ありません。バッファ時間を設定すると、自分自身を制限していることになり、最終的にバッファは空になります。

ns.bufferTime = false;
于 2012-11-30T21:02:39.927 に答える