Pull to refresh

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

Reading time 7 min
Views 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 только :)
Tags:
Hubs:
+42
Comments 98
Comments Comments 98

Articles