Производительность FLV и сборка мусора
Я создаю большой флеш-сайт (AS3), который использует огромные FLV в качестве видео перехода от раздела к разделу. FLVs имеют размер 1280x800 и масштабируются до 1680x1050 (большая часть которых не отображается для пользователей с небольшими экранами) и составляют около 5-8 секунд за штуку. Я кодирую видео с использованием кодека Hi-Def On2, VP6-S, и воспроизведение довольно хорошее с родными FLV-проигрывателями, Quicktime с Perian и простыми проверочными приложениями FLV, встроенными в AS3.
У меня проблема в том, что в контексте реального сайта воспроизведение не так гладко; частота кадров не так хороша, как следовало бы, и, что еще более проблематично, иногда случаются рывки и пропущенные кадры (иногда видео приостанавливается на четверть секунды или около того). Я предполагаю, что это вызвано сборкой мусора во Flash плеере, которая происходит недетерминированно и поэтому ее трудно проверить и контролировать.
Я использую один экземпляр FLVPlayback для воспроизведения видео; Первоначально я использовал объекты NetStream и т. Д. Напрямую, но по этой причине переключился на FLVPlayback. Кто-нибудь испытывал такого рода шутки с FLVPlayback (или, в более общем смысле, с видео в формате hi-def Flash)? Прав ли я в том, что GC является виновником здесь, и если да, есть ли способ предотвратить это во время воспроизведения этих системозатратных переходов?
3 ответа
Перебои в воспроизведении FLV/F4V вряд ли являются результатом сборки мусора - видео фактически сохраняется в памяти до полной выгрузки, поэтому сборка мусора вообще не происходит (если вы не сделали что-то необычное, например, поместили видео на контейнер с cacheAsBitmap, установленным в true).
Переключение на F4V, если вам не нужны определенные функции FLV (например, ссылка, размещенная Daidai - заявление об ограничении ответственности, это мой блог), поможет, но в целом вы также должны знать обо всем, что влияет на композитинг видео на экране. Поскольку видео большого размера заставляет перерисовывать все, что его перекрывает, любой маленький объект может сильно повлиять на производительность.
У вас есть что-нибудь на видео? Попробуйте избавиться от них, если это возможно, или задайте для cacheAsBitmap значение true (если они не анимированы). Это особенно хорошо для сложных векторных рисунков или текста (растровые изображения / изображения гораздо быстрее рисуются). Если у них разные режимы смешивания, вы как бы облажались - можете ли вы вместо этого использовать обычный режим смешивания?
У вас есть что-нибудь под видео? Если это так, избавьтесь от них во время воспроизведения видео (просто установите для видимости значение false).
Чтобы проверить ненужные визуализации, сделайте паузу в видео, щелкните правой кнопкой мыши, включите "показывать перерисованные области" (проигрыватель отладки). Вы видите, что красный квадрат непрерывно рисует? Тогда что-то там происходит на заднем плане, лучше от него избавиться.
У вас что-нибудь происходит на фоне через onEnterFrame или таймеры / интервалы? Попробуйте приостановить это.
Является ли ваше видео 30 кадров в секунду, и рендеринг компьютерной графики (например, может использовать размытие движения)? Если да, попробуйте выполнить рендеринг с частотой 24 кадра в секунду или что-то между ними - все еще хорошего качества, но гораздо меньше данных для декодирования и отрисовки.
Можете ли вы использовать небольшие видео? Даже если вы по-прежнему визуализируете их в одном и том же большем размере, меньшее количество пиксельных данных для декодирования и визуализации очень помогает, а влияние на качество может быть довольно незначительным.
Это в значительной степени подводит итог всего этого. Избавление от всего остального на экране, как правило, является приоритетом № 1.
Вы пробовали вместо этого кодировать видео в H.264? Flash Player поддерживает их в течение некоторого времени, в конечном итоге он может работать лучше. Это то, что большинство людей делают HD-видео во Flash (например, Youtube, Vimeo и т. Д.).
В качестве теста попробуйте разместить видео на 1080p HD на YouTube и посмотреть, не остановится ли это для вас.