如何检测渐进式Flash视频FLV的剪辑结束?

时间:2010-09-10 07:33:22

标签: flash actionscript-3 video streaming flv

我有一些FLV视频文件要由Flash视频播放器按顺序重现。假设v1.flv和v2.flv。一旦v1.flv到达终点,我希望播放器开始播放v2.flv。根据{{​​3}},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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

您仍然可以使用一个额外的netStatus伪事件:当视频停止时,检查时间。

switch(event.info.code) {
    (...)
    case "NetStream.Play.Stop":
        if (ns.time >= nsClient.nsInfo.duration - 0.1) trace ("video has finished");
        break;
}

注意事项:

  1. 在获得持续时间之前,您必须等待元数据信息(示例中为'nsInfo'):

    // On nsClient
    public function onMetaData(info:Object):void {
        nsInfo = info;
    }
    
  2. 它不是很精确,因此“-0.1”使时间比较更安全

答案 1 :(得分:0)

您还可以尝试使用osmf框架,adobe提供简化Flash媒体传输的功能。 osmf实现了开箱即用的顺序播放。 http://www.osmf.org/developers.html

查看此博客以获取信息&示例代码 http://www.rblank.com/

答案 2 :(得分:0)

如果MediaStream.as time的{​​{1}}属性相同(最后卡住了),我结束了使用charlie-boy的部分suggestion调整NetStream来检查每100毫秒......或者可能只是卡住但我的具体情况会使这种情况不太可能发生。)

我向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“卡住帧”。对我的具体需求来说并不是那么糟糕。

感谢大家的投入。