Как определить, когда видео буферизируется? - PullRequest
2 голосов
/ 08 декабря 2009

мой вопрос сегодня касается буферизации видео Flash AS3. (Потоковое или прогрессивное) Я хочу иметь возможность определять, когда видео буферизуется, поэтому я могу отображать какую-то анимацию, позволяющую пользователю знать, что ждать немного дольше.

alt text

В настоящее время мое видео запустится, удерживайте кадр 1 в течение 3-4 секунд, затем воспроизведите. Вроде как создается впечатление, что видео приостановлено или прервано: (

Обновление

Благодаря iandisme Я считаю, что теперь я в правильном направлении. NetStatusEvent from aliveocs . Мне кажется, что ключевым статусом для работы является "NetStream.Buffer.Empty", поэтому я добавил туда некоторый код, чтобы посмотреть, вызовет ли это мою анимацию или оператор трассировки. Пока не повезло, однако, когда буфер заполнен, он запускает мой код: / Возможно, мое видео всегда находится где-то между Buffer.Empty и Buffer.Full, поэтому он не будет запускать какой-либо код, когда я тестирую кейс для Buffer.Empty?

Текущий код

public function netStatusHandler(event:NetStatusEvent):void 
  {
     // handles net status events
     switch (event.info.code) 

        {
            case "NetStream.Buffer.Empty":
                  trace("☼☼☼ Buffering!"); //<- never traces
                  addChild(bufferLoop);    //<- doesn't execute
            break;

            case "NetStream.Buffer.Full":
                  trace("☼☼☼ FULL!");      //<- trace works here
                  removeChild(bufferLoop); //<- so does any other code
            break;

            case "NetStream.Buffer.Flush":
                  trace("☼☼☼ FLUSH!");
                  //Not sure if this is important
            break
        }
    }

Ответы [ 3 ]

2 голосов
/ 08 декабря 2009

Используете ли вы нестандартный игрок? Я знаю, что класс FLVPlayback имеет встроенное событие буферизации .

Если вы не используете FLVPlayback, объект NetStream запускает netStatusEvent, который включает информационный объект каждый раз, когда он запускает или останавливает буферизацию. Вы должны быть в состоянии захватить это событие и воспроизвести / скрыть свою анимацию с этим.

1 голос
/ 08 декабря 2009

Вы можете попытаться проверять NetStream bufferTime и bufferLength каждые 100 миллисекунд и принимать решение на основе этого. NetStream bufferTime сообщает, как долго он должен буферизоваться перед его воспроизведением, а bufferLength сообщает, как долго он уже находится в буфере.

function onTimerEvent(e:TimerEvent):void {
  var percent:Number = Math.round(ns.bufferLength/ns.bufferTime100 * 100);
  if (percent >= 95 && contains(bufferLoop)) {
    removeChild(bufferLoop);
  }
  if (percent < 25 && !contains(bufferLoop)) {
    addChild(bufferLoop);
  }
}
0 голосов
/ 26 мая 2010

Я сталкивался с этим и думал, что поделюсь. Леон выше упоминает, что NetStream.Buffer.Empty ничего не отслеживает. Это потому, что вы загружаете свой FLV с локального компьютера, поэтому буфер никогда не будет пустым. Это работает, когда вы действительно транслируете онлайн.

Все, что я сделал, это установил нужный клип в качестве «буфера ожидания», видимого при начале воспроизведения фильма, затем использовал этот код, чтобы он исчез и вернулся. Работал как шарм.

var vidplaying:Boolean = false;

playmovie_btn.addEventListener(MouseEvent.CLICK, playmovie);

function playmovie(event:MouseEvent):void{

    vidplaying = true;
    wait_mc.visible = true;
        (yoru flv and netstream stuff) ect
}

ns.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 

    function netStatus(e:NetStatusEvent) {

        if(vidplaying == true && e.info.code == "NetStream.Buffer.Empty"){
            wait_mc.visible = true;
        }
        if(e.info.code == "NetStream.Buffer.Full"){
            wait_mc.visible = false;
        }
}// netStatus
...