簡體   English   中英

如何檢測漸進式Flash視頻FLV的剪輯結尾?

[英]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;
}

注意事項:

  1. 在擁有持續時間之前,您必須等待元數據信息(在示例中為“ nsInfo”):

     // On nsClient public function onMetaData(info:Object):void { nsInfo = info; } 
  2. 它不是很精確,因此使用“ -0.1”可以使時間比較更安全

您還可以嘗試使用osmf框架(adobe的產品來簡化Flash媒體交付)。 osmf實現了開箱即用的順序播放。 http://www.osmf.org/developers.html

在此博客上查看信息和示例代碼http://www.rblank.com/

我結束了使用charlie-boy的部分建議,即改編MediaStream.as以每100毫秒檢查一次NetStreamtime屬性是否相同(它被卡住了……或者只是被卡住了,但是我的具體情況將使這種情況不太可能發生)。

我向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM