有人遇到这个bug吗?RTMP流媒体视频过早结束3-4秒?

Leo*_*ban 2 flash streaming rtmp actionscript-3 netstream

我使用他们的风头服务器可以串流影片创造了一个播放器客户端在过去,没有前一个问题,但是,对于使用不同的风头服务器的新的客户端,视频似乎太早结束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]
Run Code Online (Sandbox Code Playgroud)

在我检查的视频播放器中,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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我看到的唯一解决方法是保存我从元数据持续时间获得的初始数字,并运行计时器以不断检查当前ns.time何时匹配元数据然后运行我的重置功能.

Leo*_*ban 7

我找到了固定!

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

当netstream命中play.stop时,我必须首先进行检查,然后在缓冲区为空时调用我的reset函数...

该站点上的代码是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;
        }
    }
Run Code Online (Sandbox Code Playgroud)