有人遇到这个错误吗? RTMP 流式视频过早结束 3-4 秒?
Posted
技术标签:
【中文标题】有人遇到这个错误吗? RTMP 流式视频过早结束 3-4 秒?【英文标题】:Anyone run into this bug? RTMP streaming videos ending 3-4 secs too early? 【发布时间】:2010-01-25 18:07:27 【问题描述】:我过去曾使用他们的 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 何时与元数据匹配,然后运行我的重置功能。
【问题讨论】:
【参考方案1】:我找到了解决办法!
http://www.wildform.com/support/tutorials/loopingFLVs/
当netstream点击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;
【讨论】:
【参考方案2】:我知道这个线程非常古老,但我正在努力解决这个问题;除了您的解决方案之外,在线上并没有太多关于它的内容。
所以,我想通了。如果您使用的是 rtmp,您需要将 bufferTime 更改为 false。
由于 rtmp 不缓存,所以不需要缓冲时间,如果你设置一个,你就是在限制自己,最终缓冲区会是空的。
ns.bufferTime = false;
【讨论】:
呵呵,谢谢,是的,我现在已经离开了 Flash :/ 我的 10 年职业生涯都致力于它,但应该在 iPhone 发布后立即跳槽到前端开发人员。 ..以上是关于有人遇到这个错误吗? RTMP 流式视频过早结束 3-4 秒?的主要内容,如果未能解决你的问题,请参考以下文章
Flash Media Server 可以通过 RTMP 流式传输 H264 吗?
使用 clappr 播放流式 RTMP 视频被 CORS 阻止