О деинтерлейсинге и шумопонижении на сегодняшний день сказано много.
Очень много. И тем не менее… Если вы внимательно изучите то, что
предложу я вам здесь, то, верю, не пожалеете.
Данная статья посвящена конкретно деинтерлейсингу и шумопонижению при преобразовании файлов различных типов в .avi (а не деинтерлейсингу в общем и целом).
Я тщательно исследовал все подпрограммы (плагины) деинтерлейсинга, до которых можно дотянуться через Сеть. Как общеизвестные, так и совсем уж экзотические. Как бесплатные, так и платные. Всего таких плагинов на начало 2008 года насчитывается около тридцати. И не влом же мне было! Начнём с некоторых общих моментов. По моим наблюдениям, количество сопливых восторгов на разных форумах (то есть восторгов, не подкреплённых какими-либо серьёзными исследованиями) в отношении того или иного деинтерлейсного плагина пропорционально не его реальному качеству, а минимуму настроек. Например, плагином Asvzzz восторгается куча народа. Реально же он оставляет очень заметную остаточную гребёнчатость, что хорошо видно при покадровом просмотре. Или вот платный плагин Альпарисофт. По уровню вроде бы даже научного восхваления самого себя он превосходит многих, если не всех. А реально… Остаточная гребёнчатость видна невооружённым глазом, безо всяких формул. Убедитесь в этом сами, не верьте мне конкретно здесь на слово. К тому же происходит некоторый сдвиг цветовой гаммы. Не очень значительный, едва заметный, но всё же.
Документация практически ко всем деинтерлейсным плагинам написана по-английски. И там часто встречается словосочетание "combed frame". Все те горе - переводчики, которые иногда берутся переводить документацию, почему-то неправильно переводят это словосочетание. А правильный перевод такой: "гребёнчатый кадр". То есть тот кадр, который нужно подвергать деинтерлейсингу.
Не существует единого плагина с едиными настройками, который можно было бы не рассуждая применять во всех случаях! И не может существовать в принципе! Любители одним кликом, тунеядцы, бракоделы и те не в меру занятые джентльмены, которым лень вникать в тонкости деинтерлейсинга – вон с моей страницы!
Идеальным деинтерлейсингом можно считать такой деинтерлейсинг, при котором гребёнчатость удаляется полностью, не оставляя никакой тряски. Вот к этому результату мы и будем стремиться всегда и везде, невзирая на сложность комбинаций и длительность работы программы. Качество – всё, остальное – ничто!
Процесс деинтерлейсинга включает в себя три последовательных этапа:
Этап № 1 (его может и не быть). Определение того, какие кадры являются гребёнчатыми (combed), и, следовательно, подлежат деинтерлейсингу, а какие гребёнчатыми не являются и с ними ничего делать не нужно.
Этап № 2. Определение той части кадра, которую нужно подвергнуть деинтерлейсингу.
В настройках опций плагинов почти все параметры относятся к этим двум этапам.
Этап № 3. Собственно деинтерлейсинг по тому или иному алгоритму. В настройках опций плагинов для этого этапа практически всегда нужно задать только один параметр – тип (алгоритм) деинтерлейсинга.
Из всех типов деинтерлейсинга наиболее приближенный к идеалу результат даёт ядерный деинтерлейсинг. Его-то мы и будем использовать в большинстве случаев. Ядерный алгоритм заложен в различных плагинах, например в KernelDeint. Но там при резкой смене сюжета на первом следующем за сменой сюжета кадре образуется "призрак" предыдущего кадра. А вот при использовании ядерного алгоритма из плагина TDeint такого безобразия не происходит. Сразу видно – программу профессорятина писал. Также мы иногда будем использовать алгоритм ELA2. Именно ELA2, а не ELA. Дело в том, что ELA порождает весьма ощутимые артефакты, как правило, на глазах персонажей: на глазу появляется нечто, похожее на чир или свищ. ELA2 лишён этого недостатка.
Инструментарий:
На все случаи жизни нам понадобятся только два деинтерлейсных плагина для языка Avisynth: TDeint и TIVTC. Оба бесплатные и лежат на http://avisynth.org/warpenterprises/ . А также кодек DivX версии не ниже 6.7.
Те комбинации, которые я предложу вам в этой статье, дают самый лучший и качественный деинтерлейсинг. Я не буду здесь доказывать, что все остальные штучки по параметру качества работают либо хуже, либо гораздо хуже. Предлагаю просто поверить мне на слово. Ведь мой жреческий принцип, как вы знаете, качество – всё, остальное – ничто!
Приступаем собственно к делу.
Деинтерлейсинг всегда должен предшествовать всем другим видам обработки – удалению зерна, шумопонижению, изменению размеров и т.д.
В зависимости от того, что представляет из себя исходник, наши действия при его преобразовании в avi разветвляются на следующие случаи.
Случай № 1 – самый приятный. В нашем распоряжении имеется исходный файл, который был создан непосредственно видеокамерой, и который ещё ни во что НЕ преобразован. То есть, например, камера пишет видео в формат .m2ts, и этот самый оригинальный файл мы напрямую, ничего с ним не делая, скачали на винчестер.
В этом случае идеальный деинтерлейсинг нам даст алгоритм, заложенный внутри кодека DivX. На вкладке "Video" в выпадающем списке "Interlace" ставим "De-interlace source". Вот и всё. Слово "идеальный" здесь следует понимать буквально: гребёнчатости не останется вообще никакой, и тряски никакой не возникнет. Как засадить файл любого типа в Virtual Dub для его сжатия кодеком DivX, подробно описано в моей статье с этого же форума "Конвертирование любых файлов (включая .m2ts) в .avi при помощи Virtual Dub".
Если вы – поклонник кодека DivX, то в случае № 1 для вас все деинтерлейсные проблемы позади. Однако значительная часть русско-египетской публики, включая меня, недолюбливает кодек DivX. Есть за что. Ну хотя бы за то, что на квантизёре 2 и более XViD даёт более качественное изображение. Поэтому желающим закодировать видео в XViD нужно в этом случае делать следующее.
На вкладке "Main" кодека DivX устанавливаем квантизёр, равный 1. На вкладке "Codec" в выпадающем списке "Encoding mode" ставим "Insane Quality". На вкладке "Video" масштабируем видео до нужных размеров. Например, для соотношения сторон 16:9 это будет 720Ч406. "Resize filter" задаём "Bicubic (sharp)". "Interlace", как я говорил, выставляем в "De-interlace source". Также я рекомендую "Noise Reduction" выставить в "Auto-detect": похоже, DivX по всем параметрам изначально заточен на работу с материалом, взятым непосредственно с видеокамеры. И теперь перекодируем исходник в avi DivX с квантизёром = 1. Что такое квантизёр 1? Это, по сути, полное сохранение качества. Полученный avi-файл будет идеальным, но очень большим. Теперь повторно пережимаем этот avi в XViD с квантизёром 2. (Читай мою статью с этого же форума "Как полностью сохранить оригинальную цветовую гамму при кодировании кодеком XViD".) В результате получим файл, по размерам меньший раза в 3-4, а по качеству практически такой же. Что? Кодировать в два прохода слишком долго и муторно? Но зато качественно! Качественно!!!
Случай № 2. У вас нет исходника, порождённого непосредственно видеокамерой. У вас есть то, что вам дал кто-то. Как правило, это будут файлы с расширением .vob. И видео в этих файлах гребёнчатое.
Вот тут DivX качественно не справится. Хотя, конечно, до какой-то степени и уменьшит гребёнчатость. В этом случае мы задействуем нечто помощнее – плагин TDeint. Этот плагин вырулит практически из всех ситуаций. Но, в отличие от DivX, создаст некоторое очень незначительное количество тряски. Оно действительно почти не заметно: все остальные плагины создадут более сильную тряску.
В этом случае первым делом мы прогоняем vob-ы через DGIndex. Получаем файл проекта, который здесь и далее будем именовать 1.d2v. Пишем такой довольно универсальный скрипт, который загрузим в Virtual Dub:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
Этот скрипт корректен для исходника, у которого верхние поля идут первыми (TFF). Если у исходника BFF, то нужно задать order=0 и field=0.
Приведённый здесь способ использования TDeint универсальный: в точности так же нужно использовать TDeint для любых исходных файлов, а не только для vob. За исключением пары случаев, о которых будет сказано ниже.
Для того, чтобы ядерный алгоритм работал корректно, принципиально важно правильно определить, какое поле у исходника идёт первым – верхнее (TFF) или нижнее (BFF). Методика этого определения довольно подробно описана во многих местах, и повторять её здесь я не буду. Но вот только почему-то самый простой способ определения, какое поле идёт первым, почти нигде не описан. Состоит он в том, чтобы в скрипт сразу после строки загрузки файла (в нашем примере это MPEG2Source("1.d2v") ) временно ввести такую строку:
info()
И тогда на экран поверх изображения будет выведена куча всякой полезной информации об исходнике. В том числе BFF или TFF.
В принципе, деинтерлейсную часть скрипта из случая № 2 можно использовать в случае № 1. Тогда вам не придётся при кодировании в XViD совершать два прохода – всё будет сделано в один проход. Та незначительная тряска, которую породит TDeint, будет настолько мала или даже вообще отсутствовать, что ею можно пренебречь. Скрипт будет выглядеть, например, для файла 0003.m2ts, так:
LoadPlugin("TDeint.dll")
DirectShowSource("0003.m2ts")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
Случай № 3. Вам досталась интерлейсная запись концертной программы, в которую искусственно введены световые эффекты в виде полупрозрачных вуалей, световых лучей, тонких материй и тому подобных "нереальных" прозрачных субстанций. Например, я столкнулся с таким явлением, когда обрабатывал фильм Миланы Северской "Максимальное приближение". Если мы в этом случае используем скрипт из способа № 2, то на этих самых прозрачных объектах могут появиться пятнышки. Выход из этой ситуации простой: нужно заставить TDeint всегда деинтерлейсить весь кадр, а не только ту его часть, которую он счёл движущейся. Для этого параметры mthreshL и mthreshC нужно выставить в 0. Также в этом случае может дать более качественный результат использование алгоритма ELA2. Но это под вопросом: попробуйте и тот, и другой, и посмотрите, что будет красивее. Для включения алгоритма ELA2 нужно задать type=3.
Случай № 4 – извращённый. С ним вы можете столкнуться только в файлах с расширением vob. Вот здесь нам вначале нужно тормознуться на теорию. Ещё со времён Чарли Чаплина во всём мире для фильмов был принят единый стандарт частоты кадров – 25 кадров в секунду. Этот стандарт сохранился и в наше время. В цифровом видео он задействован в формате PAL. Запустите программу-индикатор GSpot и посмотрите значение fps для каждого vob-а (подокно Frames/s, не путать с Pics/s). Если окажется, что оно равно 25, либо любому другому числу, кроме 29,97, то всё, сказанное далее, к вам не относится.
25 кадров в секунду – идеальная частота. Казалось бы, использовать её бесконечно, и радоваться жизни. Но ведь нет: у кого-то руки зачесались. И в один не очень прекрасный день враги народа (в буквальном смысле этого слова) "изобрели" формат NTSC. В формате NTSC кадры показываются с частотой 29,97 кадров в секунду. Но вот в самом vob-е частота записи кадров может быть другая. Как правило, но не всегда, 23,976 кадров в секунду. Недостающие кадры будут порождаться методом интерполяции, и эти порождённые кадры практически всегда будут гребёнчатыми.
Нужно понимать, что собственно формат NTSC во всей его мерзости может быть представлен только в vob-е (по крайней мере, лично я ни разу не встречал его в файлах других типов). Файл avi с частотой 23,976 кадров в секунду – это просто файл с такой частотой. Никакого порождения "недостающих" кадров при просмотре такого avi производиться не будет.
Но нет такой задачи, которая была бы не под силу жрецам. Переходим от теории к действиям. Фильм может состоять из одного или нескольких vob-ов. GSpot показывает частоту кадров в vob-е, равную 29,97. Вначале нам нужно определить, с какой частотой на самом деле записаны кадры в исходных vob-ах. Запускаем программу DGIndex. Открываем непременно сразу все vob-файлы, из которых состоит фильм. Выставляем "Video" – "Field Operation" – "Forced Film". Запускаем сохранение проекта. Возникнет информационное подокно. Ждём, когда проект будет полностью создан. Смотрим на строку "Video Type" в подокне – она идёт седьмой сверху. Если видим "Film", то это означает, что реально весь фильм в vob-ах записан с частотой 23,976 кадров в секунду. Тогда случай № 4 к нам тоже никак не относится, и полученный проект можно обрабатывать, как обычно. Если видим "NTSC", то это означает, что реально весь фильм в vob-ах записан с частотой 29,97 кадров в секунду. Тогда случай № 4 к нам опять-же никак не относится.
Но предположим, что в строке "Video Type" вы видите что-то типа "Film 95%" (или любое другое число с процентами). Вот тогда случай № 4 пришёл по вашу душу. Что это означает? А означает это то, что 95% длины фильма реально в vob-ах записаны с частотой 23,976 кадров в секунду. И эти кадры не гребёнчатые. По крайней мере, у всех файлов, с которыми мне пришлось столкнуться, это было так. Оставшиеся же 5% длины фильма записаны с частотой 29,97 кадров в секунду, и часть из этих кадров – гребёнчатые, часть – нет. Обычно с частотой 23,976 пишутся медленные сцены, а с частотой 29,97 – быстрые сцены. Но нам от этого лучше смотреть не станет: изначально фильм всё равно снимался с частотой 25 кадров в секунду. И уже на студии на этапе монтажа нехорошие америкашки, чтобы приспособить фильм к гнусному формату NTSC, стали издеваться над хорошим фильмом. Издеваться в буквальном смысле, потому что на медленных сценах часть кадров пришлось выкинуть, часть – интерполировать, а на быстрых – добавить, взяв их "из воздуха". (Никогда не забуду, как америкашки форматом NTSC испоганили хороший старый, 60-х годов выпуска, фильм "Клеопатра".)
Если мы прогоним такие vob-ы с переменной частотой кадров через DGIndex, выставив "Video" – "Field Operation" – "Forced Film", то в файле проекта кадры медленных сцен, коих в нашем примере 95%, сохранятся без изменений, урезаний и добавлений – как есть. Это правильно. Но вот из тех 5% кадров, что приходятся на быстрые сцены, DGIndex будет вырубать лишние кадры просто напрямую. А вот это уже приведёт к браку.
Извращённому больному нужен извращённый доктор. Поэтому в случае № 4 делаем так. В параметрах DGIndex задаём "Video" – "Field Operation" – "Honor Pulldown Flags". Сохраняем файл проекта. В этом проекте в те 95% фильма, что приходятся на медленные сцены, будут искусственно добавлены гребёнчатые кадры. В тех 5% фильма, которые приходятся на быстрые сцены, все кадры будут взяты напрямую из vob-ов. Проект будет иметь частоту 29,97 кадров в секунду.
Пишем вот такой скрипт:
LoadPlugin("DGDecode.dll")
LoadPlugin("TIVTC.dll")
LoadPlugin("TDeint.dll")
MPEG2Source("1.d2v")
TFM(mode=5, PP=1, slow=2)
TDecimate()
TDeint(cthresh=3, order=1, field=1, type=2, hints=false, full=false, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
И этот скрипт скармливаем Виртуал Дабу.
Пояснения. Функции TFM и TDecimate берутся из плагина TIVTC. Параметр PP=1 в TFM указывает на то, что TFM не будет деинтерлейсить гребёнчатые кадры, а будет заниматься их, скажем так, комбинаторикой. В результате на медленных сценах (95% фильма) гребёнчатые искусственно добавленные кадры превратятся в не гребёнчатые, дублирующие изначально хорошие кадры. В быстрых сценах (5% фильма) за счёт комбинаторики гребёнчатость на некоторых кадрах исчезнет вовсе, на остальных же резко уменьшится.
Функция TDecimate() прореживает кадры до частоты 23,976 кадров в секунду. И делает это с умом, удаляя повторяющиеся кадры.
В результате после строки TDecimate() мы будем иметь проект фильма с частотой 23,976 кадров в секунду на протяжении всего фильма. При этом на изначально медленных сценах (95% фильма) кадры будут в точности как в исходных vob-ах. На быстрых сценах (5% фильма) кадры будут, скажем так, улучшены максимально возможной комбинаторикой.
Не буду дальше грузить вас теорией: мы всё же находимся в храме Нефтиды, а не в деревне Грузилово. Кому интересно – почитайте документацию к TIVTC, там всё очень даже по-английски. Скажу лишь, что такая методика работает, и работает идеально.
Теперь рассмотрим параметры TDeint. Параметр full=false означает, что деинтерлейситься будут не все кадры, а только гребёнчатые. Параметр cthresh=3 задаёт порог обнаружения гребёнчатого кадра. Он взят таким маленьким потому, что после функции TFM гребёнчатость резко снизится, и если мы используем cthresh по умолчанию, то некоторые слегка гребёнчатые кадры (которые, как вы уже поняли, могут быть только на тех 5% фильма, что приходятся на быстрые сцены), не будут распознаны, как гребёнчатые.
Приведённый здесь скрипт и методику можно всегда и не рассуждая использовать для случая № 4. Так что если вы что-то не поняли в теории – это для конечного результата не имеет никакого значения. Не забудьте только для BFF поменять значения order и field на 0.
Подведём итог.
Если исходные vob-ы записаны с любой частотой кадров в секунду, кроме 29,97, то, независимо от того, гребёнчатые в них кадры или нет, в параметрах DGIndex выставляем "Video" – "Field Operation" – "Honor Pulldown Flags" и создаём проект. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что все исходные vob-ы фильма записаны с частотой 23,976 кадров в секунду, то, независимо от того, гребёнчатые в них кадры или нет, в параметрах DGIndex следовало бы выставить "Video" – "Field Operation" – "Forced Film" и создать проект. Этот проект у нас уже был создан при определении реальной частоты кадров в vob-ах. Его-то мы и будем использовать, повторно выполнять операцию по созданию проекта нет никакой нужды. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что все исходные vob-ы фильма записаны с частотой 29,97 кадров в секунду, то вначале стираем тот файл проекта и файлы звуковых дорожек, которые возникли при определении частоты кадров в vob-ах. Далее, независимо от того, гребёнчатые в фильме кадры или нет, в параметрах DGIndex выставляем "Video" – "Field Operation" – "Honor Pulldown", и создаём проект. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что в исходных vob-ах переменная частота кадров, то вначале стираем тот файл проекта и файлы звуковых дорожек, которые возникли при определении частоты кадров в vob-ах. Далее создаём файл проекта, как описано собственно в случае № 4. При этом если фильм представляет собой описанную в случае № 3 концертную программу со спецэффектами, то в скрипте для случая № 4 параметры mthreshL и mthreshC нужно выставить в 0.
Описанные выше 4 случая, как мне видится, охватывают все случаи проблем с деинтерлейсингом при конвертации любых файлов в avi. Если вы столкнётесь с чем-то, что не подходит ни под один из четырёх случаев – пишите мне, на форум или на ящик. Разберёмся.
Переходим к удалению зернистости и шума.
Вначале нужно осознать, что шум и зернистость, хоть и идут, как правило, рука об руку, – это разные явления и по своей физической сути, и по причине их возникновения. Шум возникает, скажем так, сам собой. Зернистость сама собой не возникает. Она всегда искусственно вносится в файл какой-либо программой. Я вам, конечно, не скажу за всю Россию и за весь Египет, но вот лично мне даже на Земле Санникова не приходилось встречать ни одного онкилона, которому нравилась бы зернистость в фильмах. Однако многие программы и декодеры вносят зернистость по умолчанию, и чтобы этого безобразия не делалось, функцию добавления зернистости нужно отключать вручную. Поройтесь, для примера, в настройках декодера DivX. Там добавление зернистости называется "Enable film effect".
Как всегда, я предлагаю самый лучший и качественный способ удаления зерна и шума (шумопонижения), не считаясь с затраченным на работу машинным временем и усилиями работника (раба).
Инструментарий:
На все случаи жизни нам понадобятся только три плагина - дешумника для языка Avisynth: DeGrainMedian, VagueDenoiser и FluxSmooth. Все они бесплатные и лежат на http://avisynth.org/warpenterprises/ .
При очистке фильма от зерна и шумов идеальный результат состоит в том, чтобы полностью удалить зерно и шумы, но при этом полностью сохранить чёткость и абсолютно не допустить размытия (размазывания). Я исследовал множество различных фильтров – как одиночных, так и в сочетании один с другим. В результате проведённых исследований со всей жреческой ответственностью утверждаю, что ближе всего к заявленному идеалу работает следующая комбинация:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("VagueDenoiser.dll")
MPEG2Source("1.d2v")
DeGrainMedian(mode=2)
VagueDenoiser(nsteps=200, chromaT=0, percent=100)
ConvertToRGB24(matrix="rec709", interlaced=false)
(Данный пример приведён для исходника MPEG-2, прогнанного через DGIndex, после чего появился файл проекта 1.d2v.)
Пояснения. Не существует фильтра, который одинаково хорошо удалял бы и зерно, и шум. DeGrainMedian хорошо удаляет зерно, но вот если его заставить удалять шум, то он будет слегка размывать (размазывать) кадры. Да и вообще шум, по моим наблюдениям, DeGrainMedian удаляет не ахти как. Поэтому в параметрах DeGrainMedian мы на единицу ослабили его действие. В результате DeGrainMedian будет удалять практически только зерно. Шум будет удалять уже VagueDenoiser. Приведённые в этой комбинации параметры DeGrainMedian и VagueDenoiser довольно универсальные: они дают превосходный результат в широком диапазоне зернистости и зашумлённости – от нулевой до сильной. С не зернистыми и не зашумлёнными кадрами ничего делаться не будет, для зернистых и зашумлённых кадров степень очистки от шума будет определяться адаптивно (автоматически). Поэтому данную комбинацию можно, не раздумывая и не изменяя, задействовать всегда! (Возрадуйтесь, о любители одним кликом!) Написанный так скрипт будет работать довольно медленно, но результат будет очень качественный!!! Перекодированный в avi XViD файл будет более качественным, чем исходные vob-ы!!! И что немаловажно, при том же самом квантизёре, равном 2, файл, прогнанный через предложенный мною дешумник, будет на 10ч40% меньше, чем если бы мы не делали удаление зерна и шумопонижение. Качество лучше, а размер меньше! Так что можно считать целесообразным дешумировать при конвертации в avi все исходники, даже если на глаз кажется, что в них зерна и шума нет.
А вот пример скрипта для удаления и гребёнчатости, и шума – для случая № 2:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("VagueDenoiser.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
DeGrainMedian(mode=2)
VagueDenoiser(nsteps=200, chromaT=0, percent=100)
ConvertToRGB24(matrix="rec709", interlaced=false)
Предположим, что в исходных vob-файлах присутствуют и гребёнчатость, и зернистость, и шум, и ещё дрожание (тряска). В этом случае пишем такой скрипт:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("FluxSmooth.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
DeGrainMedian(mode=2)
FluxSmoothST()
ConvertToRGB24(matrix="rec709", interlaced=false)
Этот скрипт загружаем в Virtual Dub. Но вот кодирование производим, к сожалению, не кодеком XViD, а кодеком DivX. Все те плагины по устранению тряски, что бродят в Сети, не дадут в этом случае такого хорошего результата, как DivX. На вкладке "Video" кодека DivX в выпадающем списке "Noise Reduction" выставляем "Strong", в выпадающем списке "Psychovisual Enhancements" выставляем "Masking". OK. Полученный avi DivX файл повторно пережимать в XViD, как это описано в случае № 1, неуместно, поскольку исходник и так не слишком хороший. По моим наблюдениям, шумопонижение на уровне "Strong" в кодеке DivX по силе примерно такое же, как и в VagueDenoiser при задании тех параметров, которые я приводил выше для VagueDenoiser во всех скриптах.
И напоследок про изменение размеров – resize. Вдруг кто-нибудь не знает!
Самый математически точный алгоритм изменения размеров – бикубический с параметром 0,6. А не Lanczos и не что-то другое.
Если вы кодируете кодеком XViD, то самое качественное изменение размеров даст алгоритм "Precise bicubic (A=-0.60)" из Virtual Dub. А не из Avisynth и не откуда-то из другого места.
Если вы кодируете кодеком DivX, то лучше всего задействовать бикубический алгоритм из самого DivX. Для этого на вкладке "Video" в выпадающем списке "Resize filter" задаём "Bicubic (sharp)".
Если захотите выйти со мной на связь напрямую – то: nefezida53@mail.ru
Все мои статьи по различным аспектам работы с мультимедиа лежат здесь: http://www.cgtalk.ru/forum/forumdisplay.php?f=77
Данная статья посвящена конкретно деинтерлейсингу и шумопонижению при преобразовании файлов различных типов в .avi (а не деинтерлейсингу в общем и целом).
Я тщательно исследовал все подпрограммы (плагины) деинтерлейсинга, до которых можно дотянуться через Сеть. Как общеизвестные, так и совсем уж экзотические. Как бесплатные, так и платные. Всего таких плагинов на начало 2008 года насчитывается около тридцати. И не влом же мне было! Начнём с некоторых общих моментов. По моим наблюдениям, количество сопливых восторгов на разных форумах (то есть восторгов, не подкреплённых какими-либо серьёзными исследованиями) в отношении того или иного деинтерлейсного плагина пропорционально не его реальному качеству, а минимуму настроек. Например, плагином Asvzzz восторгается куча народа. Реально же он оставляет очень заметную остаточную гребёнчатость, что хорошо видно при покадровом просмотре. Или вот платный плагин Альпарисофт. По уровню вроде бы даже научного восхваления самого себя он превосходит многих, если не всех. А реально… Остаточная гребёнчатость видна невооружённым глазом, безо всяких формул. Убедитесь в этом сами, не верьте мне конкретно здесь на слово. К тому же происходит некоторый сдвиг цветовой гаммы. Не очень значительный, едва заметный, но всё же.
Документация практически ко всем деинтерлейсным плагинам написана по-английски. И там часто встречается словосочетание "combed frame". Все те горе - переводчики, которые иногда берутся переводить документацию, почему-то неправильно переводят это словосочетание. А правильный перевод такой: "гребёнчатый кадр". То есть тот кадр, который нужно подвергать деинтерлейсингу.
Не существует единого плагина с едиными настройками, который можно было бы не рассуждая применять во всех случаях! И не может существовать в принципе! Любители одним кликом, тунеядцы, бракоделы и те не в меру занятые джентльмены, которым лень вникать в тонкости деинтерлейсинга – вон с моей страницы!
Идеальным деинтерлейсингом можно считать такой деинтерлейсинг, при котором гребёнчатость удаляется полностью, не оставляя никакой тряски. Вот к этому результату мы и будем стремиться всегда и везде, невзирая на сложность комбинаций и длительность работы программы. Качество – всё, остальное – ничто!
Процесс деинтерлейсинга включает в себя три последовательных этапа:
Этап № 1 (его может и не быть). Определение того, какие кадры являются гребёнчатыми (combed), и, следовательно, подлежат деинтерлейсингу, а какие гребёнчатыми не являются и с ними ничего делать не нужно.
Этап № 2. Определение той части кадра, которую нужно подвергнуть деинтерлейсингу.
В настройках опций плагинов почти все параметры относятся к этим двум этапам.
Этап № 3. Собственно деинтерлейсинг по тому или иному алгоритму. В настройках опций плагинов для этого этапа практически всегда нужно задать только один параметр – тип (алгоритм) деинтерлейсинга.
Из всех типов деинтерлейсинга наиболее приближенный к идеалу результат даёт ядерный деинтерлейсинг. Его-то мы и будем использовать в большинстве случаев. Ядерный алгоритм заложен в различных плагинах, например в KernelDeint. Но там при резкой смене сюжета на первом следующем за сменой сюжета кадре образуется "призрак" предыдущего кадра. А вот при использовании ядерного алгоритма из плагина TDeint такого безобразия не происходит. Сразу видно – программу профессорятина писал. Также мы иногда будем использовать алгоритм ELA2. Именно ELA2, а не ELA. Дело в том, что ELA порождает весьма ощутимые артефакты, как правило, на глазах персонажей: на глазу появляется нечто, похожее на чир или свищ. ELA2 лишён этого недостатка.
Инструментарий:
На все случаи жизни нам понадобятся только два деинтерлейсных плагина для языка Avisynth: TDeint и TIVTC. Оба бесплатные и лежат на http://avisynth.org/warpenterprises/ . А также кодек DivX версии не ниже 6.7.
Те комбинации, которые я предложу вам в этой статье, дают самый лучший и качественный деинтерлейсинг. Я не буду здесь доказывать, что все остальные штучки по параметру качества работают либо хуже, либо гораздо хуже. Предлагаю просто поверить мне на слово. Ведь мой жреческий принцип, как вы знаете, качество – всё, остальное – ничто!
Приступаем собственно к делу.
Деинтерлейсинг всегда должен предшествовать всем другим видам обработки – удалению зерна, шумопонижению, изменению размеров и т.д.
В зависимости от того, что представляет из себя исходник, наши действия при его преобразовании в avi разветвляются на следующие случаи.
Случай № 1 – самый приятный. В нашем распоряжении имеется исходный файл, который был создан непосредственно видеокамерой, и который ещё ни во что НЕ преобразован. То есть, например, камера пишет видео в формат .m2ts, и этот самый оригинальный файл мы напрямую, ничего с ним не делая, скачали на винчестер.
В этом случае идеальный деинтерлейсинг нам даст алгоритм, заложенный внутри кодека DivX. На вкладке "Video" в выпадающем списке "Interlace" ставим "De-interlace source". Вот и всё. Слово "идеальный" здесь следует понимать буквально: гребёнчатости не останется вообще никакой, и тряски никакой не возникнет. Как засадить файл любого типа в Virtual Dub для его сжатия кодеком DivX, подробно описано в моей статье с этого же форума "Конвертирование любых файлов (включая .m2ts) в .avi при помощи Virtual Dub".
Если вы – поклонник кодека DivX, то в случае № 1 для вас все деинтерлейсные проблемы позади. Однако значительная часть русско-египетской публики, включая меня, недолюбливает кодек DivX. Есть за что. Ну хотя бы за то, что на квантизёре 2 и более XViD даёт более качественное изображение. Поэтому желающим закодировать видео в XViD нужно в этом случае делать следующее.
На вкладке "Main" кодека DivX устанавливаем квантизёр, равный 1. На вкладке "Codec" в выпадающем списке "Encoding mode" ставим "Insane Quality". На вкладке "Video" масштабируем видео до нужных размеров. Например, для соотношения сторон 16:9 это будет 720Ч406. "Resize filter" задаём "Bicubic (sharp)". "Interlace", как я говорил, выставляем в "De-interlace source". Также я рекомендую "Noise Reduction" выставить в "Auto-detect": похоже, DivX по всем параметрам изначально заточен на работу с материалом, взятым непосредственно с видеокамеры. И теперь перекодируем исходник в avi DivX с квантизёром = 1. Что такое квантизёр 1? Это, по сути, полное сохранение качества. Полученный avi-файл будет идеальным, но очень большим. Теперь повторно пережимаем этот avi в XViD с квантизёром 2. (Читай мою статью с этого же форума "Как полностью сохранить оригинальную цветовую гамму при кодировании кодеком XViD".) В результате получим файл, по размерам меньший раза в 3-4, а по качеству практически такой же. Что? Кодировать в два прохода слишком долго и муторно? Но зато качественно! Качественно!!!
Случай № 2. У вас нет исходника, порождённого непосредственно видеокамерой. У вас есть то, что вам дал кто-то. Как правило, это будут файлы с расширением .vob. И видео в этих файлах гребёнчатое.
Вот тут DivX качественно не справится. Хотя, конечно, до какой-то степени и уменьшит гребёнчатость. В этом случае мы задействуем нечто помощнее – плагин TDeint. Этот плагин вырулит практически из всех ситуаций. Но, в отличие от DivX, создаст некоторое очень незначительное количество тряски. Оно действительно почти не заметно: все остальные плагины создадут более сильную тряску.
В этом случае первым делом мы прогоняем vob-ы через DGIndex. Получаем файл проекта, который здесь и далее будем именовать 1.d2v. Пишем такой довольно универсальный скрипт, который загрузим в Virtual Dub:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
Этот скрипт корректен для исходника, у которого верхние поля идут первыми (TFF). Если у исходника BFF, то нужно задать order=0 и field=0.
Приведённый здесь способ использования TDeint универсальный: в точности так же нужно использовать TDeint для любых исходных файлов, а не только для vob. За исключением пары случаев, о которых будет сказано ниже.
Для того, чтобы ядерный алгоритм работал корректно, принципиально важно правильно определить, какое поле у исходника идёт первым – верхнее (TFF) или нижнее (BFF). Методика этого определения довольно подробно описана во многих местах, и повторять её здесь я не буду. Но вот только почему-то самый простой способ определения, какое поле идёт первым, почти нигде не описан. Состоит он в том, чтобы в скрипт сразу после строки загрузки файла (в нашем примере это MPEG2Source("1.d2v") ) временно ввести такую строку:
info()
И тогда на экран поверх изображения будет выведена куча всякой полезной информации об исходнике. В том числе BFF или TFF.
В принципе, деинтерлейсную часть скрипта из случая № 2 можно использовать в случае № 1. Тогда вам не придётся при кодировании в XViD совершать два прохода – всё будет сделано в один проход. Та незначительная тряска, которую породит TDeint, будет настолько мала или даже вообще отсутствовать, что ею можно пренебречь. Скрипт будет выглядеть, например, для файла 0003.m2ts, так:
LoadPlugin("TDeint.dll")
DirectShowSource("0003.m2ts")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
Случай № 3. Вам досталась интерлейсная запись концертной программы, в которую искусственно введены световые эффекты в виде полупрозрачных вуалей, световых лучей, тонких материй и тому подобных "нереальных" прозрачных субстанций. Например, я столкнулся с таким явлением, когда обрабатывал фильм Миланы Северской "Максимальное приближение". Если мы в этом случае используем скрипт из способа № 2, то на этих самых прозрачных объектах могут появиться пятнышки. Выход из этой ситуации простой: нужно заставить TDeint всегда деинтерлейсить весь кадр, а не только ту его часть, которую он счёл движущейся. Для этого параметры mthreshL и mthreshC нужно выставить в 0. Также в этом случае может дать более качественный результат использование алгоритма ELA2. Но это под вопросом: попробуйте и тот, и другой, и посмотрите, что будет красивее. Для включения алгоритма ELA2 нужно задать type=3.
Случай № 4 – извращённый. С ним вы можете столкнуться только в файлах с расширением vob. Вот здесь нам вначале нужно тормознуться на теорию. Ещё со времён Чарли Чаплина во всём мире для фильмов был принят единый стандарт частоты кадров – 25 кадров в секунду. Этот стандарт сохранился и в наше время. В цифровом видео он задействован в формате PAL. Запустите программу-индикатор GSpot и посмотрите значение fps для каждого vob-а (подокно Frames/s, не путать с Pics/s). Если окажется, что оно равно 25, либо любому другому числу, кроме 29,97, то всё, сказанное далее, к вам не относится.
25 кадров в секунду – идеальная частота. Казалось бы, использовать её бесконечно, и радоваться жизни. Но ведь нет: у кого-то руки зачесались. И в один не очень прекрасный день враги народа (в буквальном смысле этого слова) "изобрели" формат NTSC. В формате NTSC кадры показываются с частотой 29,97 кадров в секунду. Но вот в самом vob-е частота записи кадров может быть другая. Как правило, но не всегда, 23,976 кадров в секунду. Недостающие кадры будут порождаться методом интерполяции, и эти порождённые кадры практически всегда будут гребёнчатыми.
Нужно понимать, что собственно формат NTSC во всей его мерзости может быть представлен только в vob-е (по крайней мере, лично я ни разу не встречал его в файлах других типов). Файл avi с частотой 23,976 кадров в секунду – это просто файл с такой частотой. Никакого порождения "недостающих" кадров при просмотре такого avi производиться не будет.
Но нет такой задачи, которая была бы не под силу жрецам. Переходим от теории к действиям. Фильм может состоять из одного или нескольких vob-ов. GSpot показывает частоту кадров в vob-е, равную 29,97. Вначале нам нужно определить, с какой частотой на самом деле записаны кадры в исходных vob-ах. Запускаем программу DGIndex. Открываем непременно сразу все vob-файлы, из которых состоит фильм. Выставляем "Video" – "Field Operation" – "Forced Film". Запускаем сохранение проекта. Возникнет информационное подокно. Ждём, когда проект будет полностью создан. Смотрим на строку "Video Type" в подокне – она идёт седьмой сверху. Если видим "Film", то это означает, что реально весь фильм в vob-ах записан с частотой 23,976 кадров в секунду. Тогда случай № 4 к нам тоже никак не относится, и полученный проект можно обрабатывать, как обычно. Если видим "NTSC", то это означает, что реально весь фильм в vob-ах записан с частотой 29,97 кадров в секунду. Тогда случай № 4 к нам опять-же никак не относится.
Но предположим, что в строке "Video Type" вы видите что-то типа "Film 95%" (или любое другое число с процентами). Вот тогда случай № 4 пришёл по вашу душу. Что это означает? А означает это то, что 95% длины фильма реально в vob-ах записаны с частотой 23,976 кадров в секунду. И эти кадры не гребёнчатые. По крайней мере, у всех файлов, с которыми мне пришлось столкнуться, это было так. Оставшиеся же 5% длины фильма записаны с частотой 29,97 кадров в секунду, и часть из этих кадров – гребёнчатые, часть – нет. Обычно с частотой 23,976 пишутся медленные сцены, а с частотой 29,97 – быстрые сцены. Но нам от этого лучше смотреть не станет: изначально фильм всё равно снимался с частотой 25 кадров в секунду. И уже на студии на этапе монтажа нехорошие америкашки, чтобы приспособить фильм к гнусному формату NTSC, стали издеваться над хорошим фильмом. Издеваться в буквальном смысле, потому что на медленных сценах часть кадров пришлось выкинуть, часть – интерполировать, а на быстрых – добавить, взяв их "из воздуха". (Никогда не забуду, как америкашки форматом NTSC испоганили хороший старый, 60-х годов выпуска, фильм "Клеопатра".)
Если мы прогоним такие vob-ы с переменной частотой кадров через DGIndex, выставив "Video" – "Field Operation" – "Forced Film", то в файле проекта кадры медленных сцен, коих в нашем примере 95%, сохранятся без изменений, урезаний и добавлений – как есть. Это правильно. Но вот из тех 5% кадров, что приходятся на быстрые сцены, DGIndex будет вырубать лишние кадры просто напрямую. А вот это уже приведёт к браку.
Извращённому больному нужен извращённый доктор. Поэтому в случае № 4 делаем так. В параметрах DGIndex задаём "Video" – "Field Operation" – "Honor Pulldown Flags". Сохраняем файл проекта. В этом проекте в те 95% фильма, что приходятся на медленные сцены, будут искусственно добавлены гребёнчатые кадры. В тех 5% фильма, которые приходятся на быстрые сцены, все кадры будут взяты напрямую из vob-ов. Проект будет иметь частоту 29,97 кадров в секунду.
Пишем вот такой скрипт:
LoadPlugin("DGDecode.dll")
LoadPlugin("TIVTC.dll")
LoadPlugin("TDeint.dll")
MPEG2Source("1.d2v")
TFM(mode=5, PP=1, slow=2)
TDecimate()
TDeint(cthresh=3, order=1, field=1, type=2, hints=false, full=false, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
ConvertToRGB24(matrix="rec709", interlaced=false)
И этот скрипт скармливаем Виртуал Дабу.
Пояснения. Функции TFM и TDecimate берутся из плагина TIVTC. Параметр PP=1 в TFM указывает на то, что TFM не будет деинтерлейсить гребёнчатые кадры, а будет заниматься их, скажем так, комбинаторикой. В результате на медленных сценах (95% фильма) гребёнчатые искусственно добавленные кадры превратятся в не гребёнчатые, дублирующие изначально хорошие кадры. В быстрых сценах (5% фильма) за счёт комбинаторики гребёнчатость на некоторых кадрах исчезнет вовсе, на остальных же резко уменьшится.
Функция TDecimate() прореживает кадры до частоты 23,976 кадров в секунду. И делает это с умом, удаляя повторяющиеся кадры.
В результате после строки TDecimate() мы будем иметь проект фильма с частотой 23,976 кадров в секунду на протяжении всего фильма. При этом на изначально медленных сценах (95% фильма) кадры будут в точности как в исходных vob-ах. На быстрых сценах (5% фильма) кадры будут, скажем так, улучшены максимально возможной комбинаторикой.
Не буду дальше грузить вас теорией: мы всё же находимся в храме Нефтиды, а не в деревне Грузилово. Кому интересно – почитайте документацию к TIVTC, там всё очень даже по-английски. Скажу лишь, что такая методика работает, и работает идеально.
Теперь рассмотрим параметры TDeint. Параметр full=false означает, что деинтерлейситься будут не все кадры, а только гребёнчатые. Параметр cthresh=3 задаёт порог обнаружения гребёнчатого кадра. Он взят таким маленьким потому, что после функции TFM гребёнчатость резко снизится, и если мы используем cthresh по умолчанию, то некоторые слегка гребёнчатые кадры (которые, как вы уже поняли, могут быть только на тех 5% фильма, что приходятся на быстрые сцены), не будут распознаны, как гребёнчатые.
Приведённый здесь скрипт и методику можно всегда и не рассуждая использовать для случая № 4. Так что если вы что-то не поняли в теории – это для конечного результата не имеет никакого значения. Не забудьте только для BFF поменять значения order и field на 0.
Подведём итог.
Если исходные vob-ы записаны с любой частотой кадров в секунду, кроме 29,97, то, независимо от того, гребёнчатые в них кадры или нет, в параметрах DGIndex выставляем "Video" – "Field Operation" – "Honor Pulldown Flags" и создаём проект. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что все исходные vob-ы фильма записаны с частотой 23,976 кадров в секунду, то, независимо от того, гребёнчатые в них кадры или нет, в параметрах DGIndex следовало бы выставить "Video" – "Field Operation" – "Forced Film" и создать проект. Этот проект у нас уже был создан при определении реальной частоты кадров в vob-ах. Его-то мы и будем использовать, повторно выполнять операцию по созданию проекта нет никакой нужды. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что все исходные vob-ы фильма записаны с частотой 29,97 кадров в секунду, то вначале стираем тот файл проекта и файлы звуковых дорожек, которые возникли при определении частоты кадров в vob-ах. Далее, независимо от того, гребёнчатые в фильме кадры или нет, в параметрах DGIndex выставляем "Video" – "Field Operation" – "Honor Pulldown", и создаём проект. Если кадры гребёнчатые, то, в зависимости от содержания фильма, обрабатываем файл проекта, как описано в случае № 2 или в случае № 3.
Если по приведённой в случае № 4 методике мы выяснили, что в исходных vob-ах переменная частота кадров, то вначале стираем тот файл проекта и файлы звуковых дорожек, которые возникли при определении частоты кадров в vob-ах. Далее создаём файл проекта, как описано собственно в случае № 4. При этом если фильм представляет собой описанную в случае № 3 концертную программу со спецэффектами, то в скрипте для случая № 4 параметры mthreshL и mthreshC нужно выставить в 0.
Описанные выше 4 случая, как мне видится, охватывают все случаи проблем с деинтерлейсингом при конвертации любых файлов в avi. Если вы столкнётесь с чем-то, что не подходит ни под один из четырёх случаев – пишите мне, на форум или на ящик. Разберёмся.
Переходим к удалению зернистости и шума.
Вначале нужно осознать, что шум и зернистость, хоть и идут, как правило, рука об руку, – это разные явления и по своей физической сути, и по причине их возникновения. Шум возникает, скажем так, сам собой. Зернистость сама собой не возникает. Она всегда искусственно вносится в файл какой-либо программой. Я вам, конечно, не скажу за всю Россию и за весь Египет, но вот лично мне даже на Земле Санникова не приходилось встречать ни одного онкилона, которому нравилась бы зернистость в фильмах. Однако многие программы и декодеры вносят зернистость по умолчанию, и чтобы этого безобразия не делалось, функцию добавления зернистости нужно отключать вручную. Поройтесь, для примера, в настройках декодера DivX. Там добавление зернистости называется "Enable film effect".
Как всегда, я предлагаю самый лучший и качественный способ удаления зерна и шума (шумопонижения), не считаясь с затраченным на работу машинным временем и усилиями работника (раба).
Инструментарий:
На все случаи жизни нам понадобятся только три плагина - дешумника для языка Avisynth: DeGrainMedian, VagueDenoiser и FluxSmooth. Все они бесплатные и лежат на http://avisynth.org/warpenterprises/ .
При очистке фильма от зерна и шумов идеальный результат состоит в том, чтобы полностью удалить зерно и шумы, но при этом полностью сохранить чёткость и абсолютно не допустить размытия (размазывания). Я исследовал множество различных фильтров – как одиночных, так и в сочетании один с другим. В результате проведённых исследований со всей жреческой ответственностью утверждаю, что ближе всего к заявленному идеалу работает следующая комбинация:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("VagueDenoiser.dll")
MPEG2Source("1.d2v")
DeGrainMedian(mode=2)
VagueDenoiser(nsteps=200, chromaT=0, percent=100)
ConvertToRGB24(matrix="rec709", interlaced=false)
(Данный пример приведён для исходника MPEG-2, прогнанного через DGIndex, после чего появился файл проекта 1.d2v.)
Пояснения. Не существует фильтра, который одинаково хорошо удалял бы и зерно, и шум. DeGrainMedian хорошо удаляет зерно, но вот если его заставить удалять шум, то он будет слегка размывать (размазывать) кадры. Да и вообще шум, по моим наблюдениям, DeGrainMedian удаляет не ахти как. Поэтому в параметрах DeGrainMedian мы на единицу ослабили его действие. В результате DeGrainMedian будет удалять практически только зерно. Шум будет удалять уже VagueDenoiser. Приведённые в этой комбинации параметры DeGrainMedian и VagueDenoiser довольно универсальные: они дают превосходный результат в широком диапазоне зернистости и зашумлённости – от нулевой до сильной. С не зернистыми и не зашумлёнными кадрами ничего делаться не будет, для зернистых и зашумлённых кадров степень очистки от шума будет определяться адаптивно (автоматически). Поэтому данную комбинацию можно, не раздумывая и не изменяя, задействовать всегда! (Возрадуйтесь, о любители одним кликом!) Написанный так скрипт будет работать довольно медленно, но результат будет очень качественный!!! Перекодированный в avi XViD файл будет более качественным, чем исходные vob-ы!!! И что немаловажно, при том же самом квантизёре, равном 2, файл, прогнанный через предложенный мною дешумник, будет на 10ч40% меньше, чем если бы мы не делали удаление зерна и шумопонижение. Качество лучше, а размер меньше! Так что можно считать целесообразным дешумировать при конвертации в avi все исходники, даже если на глаз кажется, что в них зерна и шума нет.
А вот пример скрипта для удаления и гребёнчатости, и шума – для случая № 2:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("VagueDenoiser.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
DeGrainMedian(mode=2)
VagueDenoiser(nsteps=200, chromaT=0, percent=100)
ConvertToRGB24(matrix="rec709", interlaced=false)
Предположим, что в исходных vob-файлах присутствуют и гребёнчатость, и зернистость, и шум, и ещё дрожание (тряска). В этом случае пишем такой скрипт:
LoadPlugin("DGDecode.dll")
LoadPlugin("TDeint.dll")
LoadPlugin("degrainmedian.dll")
LoadPlugin("FluxSmooth.dll")
MPEG2Source("1.d2v")
TDeint(order=1, field=1, type=2, hints=false, full=true, denoise=true, sharp=true, slow=2, mthreshL=5, mthreshC=5)
DeGrainMedian(mode=2)
FluxSmoothST()
ConvertToRGB24(matrix="rec709", interlaced=false)
Этот скрипт загружаем в Virtual Dub. Но вот кодирование производим, к сожалению, не кодеком XViD, а кодеком DivX. Все те плагины по устранению тряски, что бродят в Сети, не дадут в этом случае такого хорошего результата, как DivX. На вкладке "Video" кодека DivX в выпадающем списке "Noise Reduction" выставляем "Strong", в выпадающем списке "Psychovisual Enhancements" выставляем "Masking". OK. Полученный avi DivX файл повторно пережимать в XViD, как это описано в случае № 1, неуместно, поскольку исходник и так не слишком хороший. По моим наблюдениям, шумопонижение на уровне "Strong" в кодеке DivX по силе примерно такое же, как и в VagueDenoiser при задании тех параметров, которые я приводил выше для VagueDenoiser во всех скриптах.
И напоследок про изменение размеров – resize. Вдруг кто-нибудь не знает!
Самый математически точный алгоритм изменения размеров – бикубический с параметром 0,6. А не Lanczos и не что-то другое.
Если вы кодируете кодеком XViD, то самое качественное изменение размеров даст алгоритм "Precise bicubic (A=-0.60)" из Virtual Dub. А не из Avisynth и не откуда-то из другого места.
Если вы кодируете кодеком DivX, то лучше всего задействовать бикубический алгоритм из самого DivX. Для этого на вкладке "Video" в выпадающем списке "Resize filter" задаём "Bicubic (sharp)".
Если захотите выйти со мной на связь напрямую – то: nefezida53@mail.ru
Все мои статьи по различным аспектам работы с мультимедиа лежат здесь: http://www.cgtalk.ru/forum/forumdisplay.php?f=77
Комментариев нет:
Отправить комментарий