ActionScript: NetStream заикается после буферизации

Используя NetStream для потоковой передачи контента из http, я заметил, что esp с некоторыми экспортированными h264, если игрок обнаруживает пустой буфер, он останавливается и буферизуется до запрошенной длины (как и ожидалось).

Однако, как только буфер заполнен, воспроизведение не возобновляется, а вместо этого перескакивает вперед, как таковое - мгновенное воспроизведение буферизованной длительности за короткий промежуток времени и, таким образом, снова запускает пустой буфер ... затем это будет продолжаться снова и снова.

Предположительно, когда сетевой поток приостанавливается для буферизации, положение точки воспроизведения продолжается, и игрок пытается выполнить привязку к этой позиции при возобновлении - однако, учитывая, что для создания 2-секундного буфера может потребоваться 5 секунд, он снова получает бесполезный буфер.

(это предположение)

Я попытался обойти это, прослушивая событие netstatus пустого буфера, приостанавливая поток и в то же время настраивая цикл для проверки текущей длины буфера по сравнению с запрошенной длиной буфера ... и возобновляя, когда длина буфера становится равной больше или равно запрошенному буферу ... однако это вызывает проблемы, когда остается недостаточно видео ... например, 10-секундный буфер с оставшимися всего 5 секундами, цикл просто сидит там, ожидая длины буфера 10 секунд, когда осталось только 5 ...

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

Если вы добавите индекс текущего времени чистых потоков плюс время в буфере, общая продолжительность будет не всей продолжительностью фильма (в конце) .. она близка, но не такая же.

Это возвращает меня к исходной проблеме, и если есть другой способ исправить это, ясно, что flash знает, когда буфер готов, так как я могу получить паузу flash, когда он буферизуется, и возобновить, когда буфер будет готов? в настоящее время это не так ... он приостанавливается, а затем, когда буфер заполняется, он воспроизводит все буферизованное содержимое примерно за 0,1 секунды.

Заранее спасибо, Стивен.


person meandmycode    schedule 03.07.2009    source источник


Ответы (2)


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

Так или иначе, многие люди сталкиваются с этой проблемой - похоже, это зависит от настроек кодека - возможно, ключевых кадров или того, как работают подсказки потоковой передачи ... Понятия не имею.

Что я точно знаю, так это то, что это не должно беспокоить игрока, вспышка снова становится огромным разочарованием ...

НО, мне удалось сделать хак, чтобы решить эту проблему, если вы слушаете событие netstatus и ждете события пустого буфера, вы приостанавливаете поток ... в идеале теперь вы слушаете событие заполнения буфера и возобновляете его - но поскольку поток приостановлен - буфер не создается (но, конечно, видео все еще загружается).

Если вы сейчас установите таймер (я установил событие при входе в кадр) и прислушиваетесь к выполнению одного из двух условий:

  • а) bufferLength больше или равен bufferTime (фактический буфер равен как минимум запрошенному размеру буфера)
  • б) количество загруженных байтов равно общему количеству байтов

Условия A недостаточно, потому что в конце видео bufferLength может не соответствовать запрошенному размеру буфера, потому что оставшееся время меньше, и проверка текущего местоположения точки воспроизведения + фактическая длина буфера в это время не равна продолжительность фильма, поэтому необходимо условие B, вы проверяете, что фактический фильм полностью загружен и может быть воспроизведен.

Вот мой код, если он вообще кому-то пригодится:

function onNetStatus(e:NetStatusEvent):void

    if (e.info.code == "NetStream.Buffer.Empty") {

        ns.pause();

        playerRoot.addEventListener(Event.ENTER_FRAME, function() { 
            if (ns.bufferLength >= ns.bufferTime || ns.bytesLoaded == ns.bytesTotal) {
                playerRoot.removeEventListener(Event.ENTER_FRAME, arguments.callee);
                ns.resume();
            }
        });
    }
}

Ваше здоровье.

person meandmycode    schedule 06.07.2009

Я никогда не сталкивался с описанной вами проблемой. Это происходит на каждом видео?

Вы можете попробовать потоковое видео с помощью JW Player, чтобы увидеть, возникает ли та же проблема (http://www.longtailvideo.com/players/jw-flv-player/). Это видеоплеер с открытым исходным кодом, встроенный в AS3.

person David    schedule 03.07.2009
comment
Привет, Дэвид, нет, это не происходит на каждом видео - так что, по-видимому, это проблема с кодированием ... это кошмар. Он закодирован как h264 из camtasia, ключевые кадры каждую секунду ... Думаю, я попробую несколько разных экспортов, чтобы попытаться решить проблему - если найду, я отправлю ответ. Спасибо - person meandmycode; 04.07.2009