Битва за улучшение видеоряда

Повышаем качество «проблемных» видеофайлов в реалтайме с помощью mplayer

Mplayer – популярный кросс-платформенный видеоплеер с огромным количеством функций и поистине безграничными возможностями по исправлению дефектов мастеринга DVD (и кривых рипов, выкаченных из Сети), которые до его появления приходилось устранять offline-перекодировкой в редакторах нелинейного видеомонтажа. Было так: час фиксим баги, четыре часа перекодируем, после чего часа два смотрим фильм (если он стоит того). А mplayer позволяет делать это в режиме реального времени без отрыва рук от производства, то есть от клавиатуры.

Мы уже писали, как собрать и обустроить mplayer (смотри статью «Mplayer без секретов» в февральском номере ][ за 2005 год), так что будем считать, что читатель, освоившийся в командной строке (или в одной из многочисленных графических морд), теперь хочет крови и зрелищ. В смысле зрелищного качества изображения, сражение за которое превращается в настоящую стратегию (в случае с mplayer'ом происходящую в реальном времени). Сколько крови ты готов пролить, читая многочисленные стандартны, мануалы, ковыряя исходники и продираясь сквозь архивы рассылок для разработчиков плеера и входящих в его состав кодеков?

Победителя ждет солидный приз — реальное улучшение качества фильма/клипа, которое не обеспечит никакой другой плеер с автоматической «коробкой передач». Нас окружает огромное количество отстойных DVD (и файлов, вытащенных из Сети), которые виндузятники отправляют в трэш не раздумывая, ну или сидят смотрят и мучаются. Но мы — линуксоиды — имеем в своем арсенале мощное оружие, способное устранить и противный interlacing, и мерзкий telecine, и прочие гадости, портящие все впечатление от фильма/клипа. Сражение за качество начинается!

Interlacing и его последствия

Берем в лапы DVD-диск «PAIN – live is overrated», вставляем его в привод и видим, что он записан в чересстрочном (ч/с) режиме (по-английски interlaced). А просмотр ч/с видеоматериала на устройстве с прогрессивным отображением (progressive или non-interlaced), к которым относятся многие современные телевизоры и все без исключения мониторы, оставляет жутковатое впечатление, высаживающее на полный негатив.

Подробное объяснение термина «черестрочный» легко найти в Википедии (en.wikipedia.org/wiki/Interlaced и de.wikipedia.org/wiki/Deinterlacing), поэтому мыщъх будет предельно краток. Возьмем ч/с камеру системы PAL с заявленной частотой 25 кадров/сек. На самом деле никаких кадров (frames) в камере нет, зато есть поля или полукадры (fields), и там их 50 штук в сек. Наводим камеру на мяч, жмем REC. За короткий промежуток времени (~1/200 сек) камера сканирует четные строки и записывает их в первый полукадр. После чего ждет 1/50 сек и сканирует нечетные строки, записывая их в следующий полукадр. И так до тех пор, пока не надоест. Полукадры выводятся на устройство ч/с отображения в том же порядке, в котором снимались. Сначала электронный луч прорисовывает четные сроки первого полукадра, а через 1/50 сек — нечетные. За это время четные строки успевают поблекнуть, снижая четкость изображения.

Монитор (устройство прогрессивного отображения) — совсем другое дело. Два полукадра объединяются и выводятся за один проход, что существенно повышает четкость. Но… вот по мячу пнули, и он полетел с огромной скоростью. За 1/50 сек мяч сместится на расстояние, сопоставимое со своим диаметром, и при объединении полукадров на прогрессивном устройстве мы увидим два мяча, расчерченных полосами фона, образующими характерную «гребенку», смотреть на которую без содрогания невозможно. На ч/с устройствах отображения объединения соседних кадров не происходит, и мы видим две фазы движения мяча, отделенные друг от друга 1/50 сек, но, увы, перевести монитор в ч/с режим невозможно.

Но два мяча — это ерунда. Мы же не футбольный матч смотрим, а концерт группы Pain с кратковременными вспышками ослепительного света. В один полукадр попадает красная (ну, например), в следующий — фиолетовая. Совмещение двух разных цветов в одном кадре приводит к ужасному эффекту. А что происходит при резкой смене сцены? Правильно! С вероятностью 50 на 50 полукадр сцены A смешивается с полукадром сцены B и мы видим дрянную картинку. Вот и приходится прибегать к различным deinterlace-алгоритмам, которые делятся на плохие, очень плохие и совсем никакие (смотри «How and why every single deinterlacer sucks»: lists.mplayerhq.hu/pipermail/mplayer-docs/2005-March/004815.html).

Почему так, мы узнаем чуть позже, пока же отметим, что возможность выбора произвольного фильтра в mplayer'е позволяет добиться максимально возможного качества. Остальные плееры либо вообще не поддерживают такие фильтры, либо выбирают их на автомате, что иногда (иногда!) обеспечивает вполне приемлемое качество, но чаще ухудшает его. Почему?! А вот почему!

Самое простое, что можно сделать для ликвидации «гребенки», — это выкинуть четные (или нечетные) поля, а оставшиеся растянуть по вертикали для сохранения оригинального аспекта («-vf field=0»). Так мы потеряем 50% вертикального разрешения и половину фаз движения. Однако во многих случаях это меньшее зло, чем артефакты продвинутых фильтров, которых достаточно много, например, линейная (linear) или кубическая (cubic) интерполяции («-vf pp=li» и «-vf pp=ci» соответственно). Только это ничем не лучше «vf field=0». Нечетные строки (принадлежащие нечетным полукадрам) тупо дропаются, замещаясь результатом интерполяции двух соседних строк четного полукадра. Качество похабное, потеря четкости драматическая. На ровных наклонных линиях появляются омерзительные зубцы.

Фильтр linear blend — линейное смешивание («-vf pp=lb») - ничего не дропает, но растягивает четные и нечетные полукадры до полного кадра путем интерполяции, после чего накладывает их друг на друга. Как следствие, на неподвижных или малоподвижных сценах (low motion) мы практически не теряем разрешения (хотя слегка «мылим» картинку за счет интерполяции), но вот на middle motion «мыло» прет со страшной силой и движущиеся объекты утрачивают четкость, а на high motion начинают появляться «призраки».

Медианный фильтр median deinterlacing filter («-vf pp=md») - очень похож на линейный и кубический, но, вместо того чтобы выкидывать нечетные строки, он замещает их усредненным значением вертикальных пикселей двух четных и одной нечетной строки. То есть если linear blend работает с целыми полукадрами, то median – с отдельными линиями, что быстрее и не портит весь кадр. Но вот острые объекты и тонкие вертикальные линии корежатся просто ужасно.

FFmpeg deinterlacer («-vf pp=fd») представляет собой своеобразный гибрид blend'а и линейного интерполятора с той лишь разницей, что он работает только с четными полями, оставляя нечетные нетронутыми. В результате этот фильтр наследует лучшие и худшие черты обоих одновременно. Разрешение теряется (пусть и не так сильно), а у быстродвижущихся объектов появляются «призраки» (хоть и не такие заметные, как у чистого blend'а).

Адаптивный фильтр Donald'а Graft'а - adaptive kernel deinterlacer filter («-vf kerndeint») - самый продвинутый. При правильной настройке сцены с low motion останутся практически неискаженными (нет потери разрешения, резкости и фаз движения), но вот middle и high motion являют «призраков», притупляют острые углы, и все это ценой весьма солидных процессорных ресурсов. Зато мы можем задавать порог изменения пикселей в соседних полукадрах, при котором начнет работать deinterlacer. В случае с упомянутым концертом Pain'а достаточно разделить разноцветные вспышки прожекторов в соседних полукадрах, а с остальным можно и смириться.

Порог задается параметром threshold, принимающим значения от 0 до 255 (по умолчанию 10), причем чем меньше значение, тем агрессивнее себя ведет фильтр. Лично мыщъх предпочитает ставить порог в 27, но это дело вкуса и к тому же сильно зависит от конкретного видеоматериала. Увидеть пиксели, над которыми поработал deinterlacer, можно, установив параметр map в единицу («-vf kerndeint=27:1»). Два следующих параметра, будучи установленными в единицу, повышают резкость, убирая мыло, но… общее качество от этого обычно только страдает. Однако все зависит от конкретного видеоматериала, так что тут надо экспериментировать.

Так какой же фильтр следует применять? Однозначный ответ дать нельзя. При слабом ЦП и фильме/клипе, снятом в high motion ключе, лучше «-vf field=0», пожалуй, и не придумать. Никаких «призраков» и минимум «мыла», а если еще и карта поддерживает аппаратное сглаживание при масштабировании…

Если фильмы с большим количеством неподвижных сцен и слабым ЦП – median или FFmpeg. При мощном ЦП на все 100% рулит адаптивный фильтр. Однако следует помнить, что при high motion для получения хорошего качества threshold приходится выкручивать за 100, а картинку мы получаем ту же самую, что и при «-vf field=0».

Прямой и обратный telecine

Возьмем DVD-диск, изначально записанный в PAL (25 кадров в сек), и попытаемся подготовить его для стран, где рулит NTSC (30 кадров в сек). Вопрос: как быть? Что делать?! Вообще-то, этот вопрос возник довольно давно, в то время, когда фильмы, снятые на пленку (24 кадра в секунду), начали транслировать по PAL/SECAM'у с их 25 кадрами.

А чего тут мудрить и лукавить? 24/25 — слишком малая величина, чтобы ускорение фильма стало заметным. Ну будет двухчасовой фильм идти 115 минут вместо положенных 120, и что? Больше рекламы поместится :). Стоп! А звук… Неслабый несинхрон в 5 минут к концу фильма набегает. То есть Шварценеггер нажимает на курок, а звук выстрела раздается только через… 5 минут! И чтобы зрители не кипятились, частоту звуковой дорожки увеличивают на 24/25=0,96. Ну ладно, забудем о Шварце, а если это оперетта?! Для человека, обладающего музыкальным слухом, разница в 0,96 вполне заметна, и впечатление уже не то.

Mplayer позволяет решить эту проблему форсированием fps в 24 кадра в секунду («-fps 24») и ресемплингом аудиопотока, хотя ресемплинг в реальном времени меломанам лучше не применять - их уши такого издевательства просто не выдержат. Качество только понизится (и тут без хорошего аудиоредактора не обойтись).

Но вот перевести 24 кадра с пленки в 30 кадров системы NTSC лобовым путем уже не получится. Разница оказывается слишком заметной. Вот и приходится прибегать к отвратительной вещи, именуемой телецином (telecine), за описанием которой мыщъх опять-таки отсылает читателей к Википедии: en.wikipedia.org/wiki/Telecine, раздел Frame rate differences.

По классической методике (а есть и другие) 24 кадра разбиваются на 48 полукадров (а в NTSC этих полукадров 60), и каждый второй исходный полукадр дублируется, после чего дублируется каждый третий, затем опять каждый второй и т.д. Отсюда мы получаем схему 2:3:2:3:2:3… или просто 2:3 pulldown. В переводе с английского pull – тянуть, down – вниз. То есть компенсировать увеличение частоты дублированием кадров.

Если взять в руки калькулятор и рассчитать, мы получим, что реальная частота фильма после преобразования составит 23,976 кадра в секунду вместо положенных 24. То есть фильм чуть-чуть замедлится. Совсем немного. На кончик мышиного хвоста или даже еще меньше. А вот плавность движений (за счет дублирования кадров) пострадает весьма радикально. Например, медленно летящий звездолет в фильме «Чужие»: на оригинальных дисках с ним все ОК, а вот после преобразования в NTSC создается впечатление, что не хватает мощности ЦП, поскольку звездолет начинает двигаться рывками.

И вот тут начинается самое интересное. На правильно изготовленном DVD (независимо от того, PAL он или NTSC) дублирующихся кадров быть не должно. По стандарту. И pulldown при необходимости обязан осуществлять сам DVD-плеер (это так называемый мягкий telecine). А поскольку телевизоры, работающие только в системе NTSC, давно канули в лету, никакой pulldown никому не нужен, и DVD отображается в PAL-режиме, даже если на коробке написано NTSC.

Но вот некоторые дуболомы (иначе их не назовешь) выполняют pulldown до записи диска, и дублированные кадры физически попадают в видеопоток (жесткий telecine), отчего его размер возрастает, но размер — это нестрашно, здесь теряется качество. То же самое происходит, если видеофайл записывается с NTSC-канала, по которому передают фильм/клип, изначально снятый на пленку или PAL-камеру. И еще ухитряются называть это лицензионными дисками! Двоечники!

Естественно, на каждый pulldown найдется свой pullup и куча detelecine-фильтров, описание которых содержится в справке к mplayer'у. Увы, операция, обратная telecine, в общем случае невыполнима, поскольку дублированные кадры никак и ничем не помечены, и кроме схемы 2:3 есть еще много других схем pulldown'а. Автоматика обычно лажает, и нужные фильтры приходится находить путем научного перебора. А если видеоматериал еще и чересстрочный, то это вообще кранты и полный дизастер, подробный разбор которого требует отдельной статьи или даже целой книги.

Тем, кто еще не вкурил особенности стандартов телевещания (а курить надо именно их), мыщъх рекомендует фильтр pullup с параметрами по умолчанию. Этот фильтр, сравнивая соседние кадры, ищет сходства и различия, убирает ненужные дубликаты, а также удаляет high motion кадры, испорченные interlacing'ом, что обеспечивает вполне приемлемое качество.

Внимание! Pullup-фильтр корректно работает только в паре с фильтром softskip, который должен быть указан за ним, а частота понижена в 4/5 от оригинальной («-fps 24000/1001 -vf pullup softskip»).

Россыпи трюков

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

Задать требуемую частоту можно с помощью уже упомянутого ключа '-fps', принимающего следующий ряд стандартный значений: 24, 25, 30, 30000/1001, 24000/1001 (вот-вот, именно так, через дробь). Но попадаются файлы, записанные на каких-то совершенно диких частотах (причем не тех, что указаны в заголовках). Определить частоту можно как методом перебора, так и аналитически. Mplayer показывает в графе A-V рассинхронизацию между звуком и видео, а также количество дропнутых кадров для приведения ее в согласование (критическая отметка рассинхрона - предпоследняя цифра справа в строке статуса mplayer'а). Вот мы и калькулируем, если за X секунд мы отстали на Y кадров, то текущую fps нужно умножить на Y/X.

Хинт для любителей просмотра фильма с субтитрами. Часто бывает так, что фильм идет с частотой 25 кадров в секунду (классический PAL), а субтитры, скачанные из Сети, — с частотой 23,976 (soft 2:3 pulldown) или 29,97 (NTSC). Конечно, в любом редакторе субтитров их легко конвертнуть, но это будет уже offline, что неинтересно. Mplayer предлагает два решения. Менять частоту самого фильма, согласуя ее с частотой субтитров (заботу по синхронизации звука с видео возьмет на себя ключ '-fps'), либо изменить частоту самих субтитров ключом '-subfps'. Первое решение обычно приводит к деградации качества, а второе иногда глючит (баг в mplayer'е?), так что на практике приходится использовать оба.

Заключение

Мы рассмотрели лишь две основные проблемы, с которыми сталкиваются любители домашнего видео: ч/c режим и жесткий pulldown. А всего их… и по мере роста коллекции видеофайлов проблемы лавинообразно нарастают. Когда коллекция мыщъха насчитывала сотню дисков, он использовал любой плеер, что оказывался под рукой. Но вот число дисков приблизилось к тысяче… И мыщъх освоил кучу видеоредакторов и написал множество утилит, фиксящих популярные баги в файлах. Но все это требовало времени на перекодирование. А перекодирование — это оффлайн. Сейчас у меня десятки тысяч дисков, и времени на их перекодирование для просмотра в любом плеере нет и не будет. Так что mplayer, позволяющий накладывать нужные фильтры на лету, превратился в безальтернативный вариант.

INFO

Некоторые фильмы содержат как ч/с, так и прогрессивные сцены, и ничего удивительного в этом нет. Допустим, живые актеры снимались на ч/с камеру, а спецэффекты монтировались на компьютере в прогрессивном режиме.

Mplayer позволяет не только задавать порог срабатывания адаптивного фильтра, но и включать его клавишей (внимание! работает только с видеодрайвером xvmc).

В прогрессиве идут все кинофильмы (то есть снятые на пленку) и практически все современные фильмы/клипы. Ч/с режим в основном встречается на записях концертов, спортивных соревнований и т.д.



Крис Касперски





Комментарии

Популярные сообщения