2009-07-03 2 views
4

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

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

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

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

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

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

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

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

Заранее благодарен, Stephen.

ответ

4

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

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

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

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

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

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

условие А не достаточно клюва ause в конце видео, длина 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(); 
      } 
     }); 
    } 
} 

Приветствия.

0

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

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

+0

Привет, Дэвид, на каждом видео это не бывает, поэтому, по-видимому, это проблема кодирования. Это кошмар. Он закодирован как h264 от camtasia, ключевые кадры каждую секунду. Я думаю, что попробую несколько разных экспонатов, чтобы попытаться прибить проблему - если найду это, я отправлю обратно. благодаря – meandmycode

Смежные вопросы