Как определить конец клипа прогрессивного Flash видео FLV? - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть несколько видеофайлов FLV, которые должны воспроизводиться последовательно проигрывателем Flash.Предположим, v1.flv и v2.flv.Я хочу, чтобы игрок начал играть v2.flv, как только v1.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

Любая помощь будет оценена!

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

Вы все еще можете сделать это с помощью одного дополнительного псевдо-события 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" делает сравнение времени более безопасным

0 голосов
/ 11 сентября 2010

Я закончил, используя часть предложения Чарли-боя , адаптировав MediaStream.as для проверки каждые 100 мс, если свойство time NetStream одинаково (оно застряло в конце ... иливозможно просто застрял, но моя конкретная ситуация сделает это маловероятным).

Я добавил три свойства в 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));
        }
    }

Наихудший сценарий - «застрявшая рамка» на 100 мс перед загрузкой следующего клипа.Не так плохо для моей конкретной потребности.

Спасибо всем за вклад.

0 голосов
/ 10 сентября 2010

Вы также можете попробовать среду osmf, предложение Adobe по оптимизации доставки мультимедиа.osmf реализует последовательное воспроизведение из коробки.http://www.osmf.org/developers.html

проверьте этот блог для информации и пример кода http://www.rblank.com/

...