Ошибка? Netstream не возобновится после начальной паузы

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

Вот что происходит:

После вызова метода play () поток netstream приостанавливается, когда код NetStatus имеет значение "NetStream.Play.Start". Это отключает поведение по умолчанию для автоматического воспроизведения. Прежде чем продолжить с помощью функции togglePause() ИЛИ возобновить (), выполните операцию поиска. Когда вы пытаетесь возобновить с помощью функции togglePause() или resume(), netstream не возобновит воспроизведение.

Если вы просто сразу же сделаете pause (), а затем resume () без поиска (), это возобновится нормально.

Кроме того, если вы задержите начальную паузу примерно на 250 мс, вы сможете без проблем искать () и впоследствии возобновить ().

Я разместил демо и источник здесь: http://drinkspiller.cannonballinteractive.com/temp/ResumeAfterPauseAndSeek/

Код является примером кода непосредственно из документации AS3 для NetStream с небольшими добавлениями для обработки начальной паузы и обработки кнопок поиска и возобновления. Там не так много для этого.

Обратите внимание, что я делаю паузу, вызывая stream.seek(0), а затем stream.pause(); Это гарантирует, что первый кадр отображается в экземпляре Video, а не ничего. Такое же поведение происходит без stream.seek(0) и только с использованием stream.pause () для остановки воспроизведения.

Я также попытался отложить вызов startPaused(); пока буфер не заполнит код события, но поведение будет таким же.

Может ли кто-нибудь помочь мне найти разумный обходной путь или подтвердить для меня, что это ошибка? Большое спасибо!

2 ответа

Решение

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

  1. Я не думаю, что это хорошая идея, чтобы вызвать NetStream.seek до получения метаданных о FLV. (Учтите, что длительность извлекается из метаданных). Я не знаю, есть ли официальная документация по этому поводу, но я обнаружил, что это может быть проблематично. Вы можете попробовать поместить любые события паузы / поиска в обработчик события onMetaData.

    Мое ограниченное понимание заключается в том, что метаданные включены в линию с данными FLV. Это может быть где угодно, но в идеале и обычно оно находится в начале файла. Поэтому при постепенной загрузке NetStream должен получать достаточно информации для получения метаданных, необходимых для более сложных действий с видео (таких как поиск). Это может объяснить, почему это сработало для вас, если поставить паузу в 250 мс.

  2. Ваш образец FLV кодируется не так, как другие FLV, с которыми я работал. Я не совсем уверен, почему, но если я изменил ссылку на другой FLV, все работало отлично (после того, как проблема № 1 была решена).

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

Что касается использования запроса seek (0), чтобы убедиться, что есть рамка для постера... Мне не пришлось делать это самому. Это также может быть связано с тем, как кодируются FLV.

Если вы делаете netstream.seek(0); он снова вызывает ваш обработчик метаданных.

Другие вопросы по тегам