[英]how to detect clip end of progressive Flash video FLV?
我有一些FLV视频文件,这些文件将由Flash视频播放器顺序复制。 假设v1.flv和v2.flv。 我希望播放器在v1.flv结束时开始播放v2.flv。 根据该论坛 , onPlayStatus
不会在渐进式FLV中触发。 该怎么办? 我在下面尝试的一小段:
public class MyClass extends Sprite {
private var nc : NetConnection;
private var ns : NetStream;
private var vid : Video;
private var vidURL : String = "v1.flv";
public function MyClass() {
var nsClient:Object = {};
nsClient.onPlayStatus = client_onPlayStatus;
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
nc.connect(null);
ns = new NetStream(nc);
ns.play(vidURL);
ns.client = nsClient;
vid = new Video();
vid.attachNetStream(ns);
addChild(vid);
}
private function netStatusHandler(event : NetStatusEvent) : void {
trace(event.info.code);
switch(event.info.code) {
case "NetConnection.Connect.Success":
trace("Loaded stream: " + vidURL);
break;
case "NetStream.Play.StreamNotFound":
trace("Stream not found: " + vidURL);
break;
default:
}
}
private function client_onPlayStatus(event:Object) : void {
trace("status=" + event.info.code);
}
}
跟踪输出中显示的唯一文本是:
NetConnection.Connect.Success
Loaded stream: /path/to/v1.flv
任何帮助将不胜感激!
您仍然可以使用一个额外的netStatus伪事件来做到这一点:当视频停止播放时,请检查时间。
switch(event.info.code) {
(...)
case "NetStream.Play.Stop":
if (ns.time >= nsClient.nsInfo.duration - 0.1) trace ("video has finished");
break;
}
注意事项:
在拥有持续时间之前,您必须等待元数据信息(在示例中为“ nsInfo”):
// On nsClient public function onMetaData(info:Object):void { nsInfo = info; }
它不是很精确,因此使用“ -0.1”可以使时间比较更安全
您还可以尝试使用osmf框架(adobe的产品来简化Flash媒体交付)。 osmf实现了开箱即用的顺序播放。 http://www.osmf.org/developers.html
在此博客上查看信息和示例代码http://www.rblank.com/
我结束了使用charlie-boy的部分建议,即改编MediaStream.as
以每100毫秒检查一次NetStream
的time
属性是否相同(它被卡住了……或者只是被卡住了,但是我的具体情况将使这种情况不太可能发生)。
我向MediaStream
添加了三个属性:
private var last_time:Number = -1;
private var last_check:int = 0;
private const check_delay:int = 100;
并更改了compareTime
函数,如下所示:
private function compareTime():void
{
if (isNaN(duration))
{
// when there is no metadata duration
if (getTimer() - last_check > check_delay)
{
// enough time has passed since last check
if (last_time==this.time)
{
timer.stop();
timer.removeEventListener(TimerEvent.TIMER, onTimer);
dispatchEvent(new StreamEvent(StreamEvent.COMPLETE, null));
}
else
{
last_check = getTimer();
last_time = this.time;
}
}
}
else if(!isNaN(duration) && this.time >= duration)
{
timer.removeEventListener(TimerEvent.TIMER, onTimer);
dispatchEvent(new StreamEvent(StreamEvent.COMPLETE, null));
}
}
最坏的情况是加载下一个剪辑之前100ms的“卡顿帧”。 对于我的特定需求来说还不错。
感谢大家的投入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.