Как стать автором
Обновить

Настройка нетбука на максимальную производительность для HDTV

Время на прочтение7 мин
Количество просмотров44K
Доброго времени суток, хабровчане!

На хабре уже была небольшая статья на данную тему, она называлась «Ускорение воспроизведения HD-видео». Для тех, кому даже предложенные в ней способы не помогли, я и написал этот текст — рассмотрев, помимо прочего, вопрос с работой субтитров.

Сам я тоже отношусь к упомянутым выше людям, поскольку пользуюсь одним из первых нетбуков (Asus EeePc 701), штатная частота его процессора 600 Мгц, и выше 810 она у меня не «гонится» — вылетает в BSOD. Кроме того, у него встроенная в чипсет видеокарта Intel GMA 900, не имеющая никакой аппаратной поддержки HD-видео. Update: RAM я докупил до 2х Гб. Поставленной задачей было — заставить заставить нетбук проигрывать файл следующих характеристик:
  • контейнер mp4
  • разрешение 1280х720 (HDTV 720p)
  • видео H264/AVC
  • звук AAC 160-250 Kbps
  • средний общий битрейт 1.9 Mbps
  • максимальный битрейт видео 14 Mbps


В отличие от любого другого HD-видео (перетерпел короткие тормоза и дальше смотришь), моя задача имеет дополнительные сложности:
1.необходимость выводить субтитры. При столь ограниченных ресурсах, как у подобного нетбука, вывод субтитров «стандартным» способом (через VobSub) при декодировании HDTV «на пределе» дает чувствительную дополнительную нагрузку
2.выводимые субтитры не должны убегать, рассинхронизируясь с видео.

Я взял тестовый файл, характеристики которого указаны выше, и стал на нем пробовать различные сочетания кодеков, плееров и настроек. На перебор вариантов ушло около 3х дней. Если рассказать про все те, которые НЕ сработали — статья станет больше в несколько раз :) поэтому ограничусь теми примерами, которые приведены в вышеупомянутом тексте «Ускорение воспроизведения HD-видео».

Сначала — о выборе тестового видеофрагмента. Это кусок обычного аниме (характеризуется меньшим битрейтом при том же разрешении и качестве, что у фильмов), но с совершенно бессовестной заставкой, где каждый кадр представляет из себя высокодетализованную картинку с обилием мельчайших деталей, причем такого рода картинки «проявляются» одна через другую, в дополнение к движению «камеры». Получается эффект «зашумленности» изображения, что дает просто дикую нагрузку при декодировании. Я посчитал, что уж если я смогу заставить комп прокрутить этот фрагмент, не разсинхронизировав звук и субтитры с видеодорожкой, то метод будет работать для любого аниме в пределах указанного битрейта (до 10 Mbps – с гарантией). Вероятней всего, указанный максимальный битрейт видео в 14 Mbps соответствует этой самой заставке, точнее небольшому самому тяжелому ее куску.

Помимо прочего, VobSub «из коробки» показывать субтитры не захотел, и я решил не добавлять себе новых переменных и обойтись теми субтитрами, которые дает плеер. Сначала «ехать», а потом можно позаботиться и о «шашечках» — так что настройка VobSub'а будет темой моего следующего «исследования» :)

Итак, результат работы:

Любые варианты с Media Player Classic (HomeCinema mod) окончились провалом. Рваное видео — и с использованием встроенного H264/AVC-декодера, и при использовании ffmpeg-mt из ffdshow, и при использовании кодека DivX h264/AVC. Видео тормозит, звук нормальный, как следствие — звук убегает вперед. Перепробованы кучи вариантов настроек — с пропуском кадров, изменением приоритета плеера и прочим. Для галочки упомяну, что любой постпроцессинг был (ессно!) отключен, как в настройках кодеков, так и в плеере, и помимо плеера никаких ресурсоемких задач не было запущено.

Ситуация кардинально поменялась, когда я поставил CoreAVC 2.0 — да, это платный кодек, поэтому никаких ссылок не привожу и оставляю определиться со способом его добычи на совесть читателя. Сейчас у него на сайте указана цена в ~10$ — недорого, если учесть что это единственная возможность смотреть HDTV-видео на таком слабом железе, как у меня. Итак, видео стало ощутимо плавным — хотя-бы без резких рывков. Собственно, проблему это решает лишь отчасти — периодически воспроизведение видео сильно замедляется, да и субтитры ведут себя совершенно непредсказуемо, постоянно сбивается тайминг. Вроде подогнал текст под звук/видео… а тут небольшой отрывок с высоким битрейтом — и снова рассинхронизация.

И тут я перехожу к третьей части моего повествования — проблему решает один единственный плеер. Это многим известный Crystal Player, с которого я лично «слез» несколько лет назад. Особого желания снова пользоваться им у меня не было — всем устраивал бы MPC HomeCinema… Но только у Crystal Player'а обнаружилась ключевая возможность — декодирование видеопотока «впредь» в буфер, в соответствии с выставленным размером буфера. Такой возможности я не обнаружил ни у одного другого плеера. Для очистки совести следует сказать, что я смотрел только самые популярные плееры (BSPlayer, VLC, smplayer, еще какие-то), причем не все их устанавливал. Если вдруг вы обнаружите такую возможность у кого-то еще — напишите мне! Итак, номинально настройка называется «Размер буфера кадров» с максимальным значением в «50% памяти».

Почему номинально? Дело в том, что при выставлении этого значения в «10% памяти», плеер кэширует до 93х фреймов. При выставлении же «50% памяти», число кэшируемых фреймов возрастает до (93х5=465 кадров? хрена лысого!) — всего лишь до 97. TaskManager показывает потребление памяти 180 Мб плеером и 800 Мб — суммарно системой. Еще 1.2 Гб простаивает. Нетрудно посчитать, что отдав плееру под буфер все 1.2 Гб, можно получить возможность декодировать фильм с опережением до 24х секунд, чего легко хватило бы на самые динамичные сцены.

Но чего нет — того нет. В любом случае, 97 прекодированных фреймов «сглаживают» видеопоток, буфер плавно (но быстро :( ) опустошается при динамичных сценах и заполняется при относительно статичных. Осталась одна нерешенная проблема — субтитры. Для их работы, после немалых мучений, было обнаружено решение: в настройках плеера «решение проблем скорости» >> «пропускать по ключевым кадрам». Именно этот вариант, больше ничего. Такое ощущение, будто на том отрезке с высоким битрейтом каждый кадр был ключевым, поэтому просто «пропуск кадров» почти не давал результата.

Итак, подвожу итоги. Настройки ОС с целью, чтобы в нужный момент включался нужный кодек, сказать не могу — этот вопрос каждый решает на своей машине индивидуально.

Настройки CoreAVC:

«Input levels», «Output levels», «Input colorspace» выставил в «TV», «PC», «autodetect» соответственно.

Гайд, на который ориентировался, находится вот тут — в нем расписана настройка CoreAVC для использования Nvidia CUDA Acceleration. Там указано, что для Input levels «TV» должно стоять при любом раскладе, а для Output – «TV» выставить если пользуешься MPC HomeCinema. В этом случае «let MPC-HC expands the B&W level to the appropriate level instead of doing it early in the decoding chain.»©, для чего в MPC:HC нужно выставить в меню «настройки рендеринга» >> «диапазон вывода» >> «16-235». У меня данный пункт в MPC недоступен, а без этого картинка ощутимо теряет «сочность», а в Crystal такой настройки вообще нет — поэтому выбираем «Output levels» — «PC».

Deinterlacing: None (Weave)
(дела с interlaced-видео не имел, что тут ставить, нужно выбирать при наличии оного)

Deblocking: Skip always (отключаем постобработку силами кодека)

[ ] Aggressive deinterlacing (ставить, если хотим деинтерлейс делать кодеком)
[X] Crop 1088 to 1080 (о HDTV 1080p на моем железе даже думать не хочу!)
[ ] Force VMR AR correction (говорят нам это не нужно)
[X] Preferred decoder option (Странная опция, даже при включенной, H264/AVC-видео открывалось у меня DivX-ом, пока я его не снес. Beware!
[X] Use tray icon (Captain Obvious to the rescue!)
[n/a] Prefer CUDA Acceleration (для счастливых обладателей Nvidia-карточек)

В списке «output formats» первыми тремя выставить:
1. YV12
2. YUY2
3. NV12

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

Далее, настройки Crystal Player.

Для начала, добиваемся чтобы видео у нас открывалось через CoreAVC – проверяется «правой кнопкой по плееру» >> «Свойства», компрессор видеопотока у меня указан [AVC1] CoreAVC video decoder. На аудио я не заострял внимание, у меня оно вообще не определяется, но работает :)

Итак, главным ориентиром должно быть окошко статистики, вызываемое по той же правой кнопке либо через хоткей «S».

В верхней строчке должно желательно что-то типа «1194x679 Overlay Flipping YV12», наиболее важно что YV12 – это максимально быстрый режим. Допустимо также YUY2.
В большом текстовом поле должно быть: «Никаких замечаний, самый быстрый режим». Если это не так, то следуйте указаниям в этом поле, и отключайте ВСЕ лишнее в настройках. Тут же можно увидеть поля с актуальным состоянием видео и аудио-буферов — я пользовался этим постоянно для определения, успевает ли нетбук «переваривать» текущий битрейт.

В меню «Парсеры» >> «Чтение данных» выставите максимальные блоки данных. Остальные настройки не особо критичны, главное — применить здравый смысл при их изменении.

Результат всех вышеописанных действий:
  • Celeron M 0.8 Ггц все-таки крутит 720p HDTV до 10 Mbps без тормозов
  • качество картинки CoreAVC заметно хуже (проверено с включенной постобработкой!) чем у других декодеров, но это «немного» компенсируется разрешением самого видео, да и вообще нам при таком железе главное «ехать», а не «шашечки» :) Update: как довольно ясно показал в комментах скриншотами один из хабрапользователей, CoreAVC дает неотличимое от других декодеров качество, при включенной постобработке. Данный пункт в статье оставляю «для истории»
  • «плавание» битрейта в небольших пределах компенсируется буфером Crystal Player'а
  • повышение битрейта до состояния «заметно выше чем можно переварить» вызывает фреймдроп, что выглядит как небольшое мерцание и чуть-чуть рваное и чуть замедленное видео, причем звук начинает заикаться, синхронизируясь. Данную проблему я не решил и вообще не вижу вариантов как это возможно — скорость видео изменилась, под нее приходится подстраиваться звуку. Но это при предельно большом битрейте, который железо уже никак не тянет!
  • Субтитры при всем этом мракобесии никуда не деваются, возникая на экране в нужный момент. Alt+K, Alt+L регулируют смещение субтитров по времени с шагом в 100 мс, что очень удобно.


UPDATE: Выяснилось, что частота процессора при вышеописанных эксперимантах составляла 765 Мгц вместо 810, как я считал. После увеличения до 810 никаких кардинальных изменений, конечно, не произошло, но framedrop в общем уменьшился.

UPDATE:
— попробовал MPlayer — оказалось, в нем нет опции задания размера буфера с пре-рендеренными кадрами, параметр -cache и аналогичные относятся к «предварительному» буферу (полезно для видео по сети)
— haali video renderer у меня не заработал, как заставить — не знаю. В комментариях говорят что он медленный, хотя и имеет буфер под пре-рендеренные кадры (256 Мб макс.)


P.S. Для интересующихся, «зачем мучить такое слабое железо, заставляя его крутить HDTV»: я уже 1.5 года использую указанный нетбук в качестве десктопа — с полноценной клавиатурой, мышью и монитором на 17''… и выбора-то особо нет — и хочется посмотреть аниме, а оно в HDTV только :)
Теги:
Хабы:
+42
Комментарии98

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн