"Кинопередвижка" Форум любителей и коллекционеров плёночного кино.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



AviSynth - ликбез

Сообщений 1 страница 8 из 8

1

AviSynth - ликбез
Доброго всем времени суток!

AviSynth - мощная программа для обработки видео. Её возможности в умелых руках практически безграничны. Никто секретов работы с Ависинтом специально не держит, просто это всё очень нелегко объяснить, а никаких систематических пошаговых понятных обычному пользователю учебников нет. И не было никогда. Это программа с открытым кодом для программистов. Любой человек может написать свой фильтр, и их уже сотни, если не тысячи. В то же время, на разных сайтах (и на нашем тоже) встречаются поразительные результаты обработки видео этой программой, иногда прилагаются и скрипты. Но попытки повторения результатов новичками обычно заканчиваются неудачей. С этой проблемой столкнулся и я несколько лет назад. Я совсем не программист, поэтому расскажу, как я это всё понимаю.

1. AviSynth не имеет совсем никакого интерфейса. Т.е. запустить Ависинт с помощью ярлыка нельзя. Программа тихо встаёт в указанное ей место и использует возможности системы (кодеки, библиотеки и т.п.)
2. Чтобы увидеть, что она вообще делает, используется визуальный интерфейс других программ, чаще всего - VirtualDubMod.
3. Файлы открываются и обрабатываются с помощью скриптов - файлов Блокнота, но с расширением .avs. Они пишутся вручную, и ошибаться нельзя. Своего рода специальный язык программирования. Скрипты можно копировать готовые, но чтобы их запустить на своём компьютере всё равно придётся несколько первых строк переписать.
4. Корректно работает это всё только на ХР и 7-ке, т.к. программа очень старая. Я для этого держу старую ОС на отдельном жёстком диске и при необходимости загружаюсь с него. Некоторые пользуются программой на современных ОС, но гарантии корректной работы на все случаи жизни нет.
5. У меня есть некоторые конкретные наработки (скрипты, схемы, алгоритмы). Готов ими поделиться, если есть интерес. По моим наблюдениям, у других - другие схемы и наборы фильтров, даже на этом сайте. Всё охватить невозможно, но можно делиться опытом.

Эта тема для желающих начать работать с Ависинтом. Мне в своё время пришлось тыкаться и приставать к занятым людям с глупыми вопросами. Постараюсь показать азы работы на практических примерах.

К счастью, появился новый форумчанин Алексей, который проявил большую заинтересованность в освоении Ависинта. Мы уже начали процесс, и сразу стали возникать типичные проблемы, которые я успел подзабыть, т.к. работаю по привычным схемам уже давно. Программы настроены, все кодеки и библиотеки в системе как-то притёрлись. Но вот добиться этого сразу получается не всегда.

Кто хочет - присоединяйтесь!
Надеюсь, что постепенно возникнет букварь для начинающих работать с Ависинтом.

Чтобы не утяжелять эту тему, все возникающие вопросы давайте будем обсуждать в специальной теме AviSynth-ликбез. Обсуждение.

2

Итак, начнём! Установка программ.

1. Операционную систему желательно иметь ХР или 7-ку (х64 поддерживается). Можете попробовать и на более современных, но это уже под свою ответственность.
2. В Проводнике надо сделать видимыми расширения файлов.
3. Должны быть установлены все библиотеки NET Framework, начиная с версии  1.1 и K-Lite Mega Codec Pack или аналогичный, а так же DirectX.
4. Понадобится программа MediaInfo (имеется везде в свободном доступе).
5. Необходимо иметь для работы как минимум AviSynth и VirtualDubMod. Если они у вас уже каким-то образом установлены, то можете попробовать работать на них, но под свою ответственность. Чтобы идти с нами в ногу, лучше внимательно прочитать инструкцию Как сделать отличный ДВД-рип, короткая и доступная инструкция ;), и поставить всё, как там написано. А свою ависинту сначала удалить. Там ничего заумного нет, но нужно выполнить всё по пунктам.

6. Нужно установить Cedocida DV-Codec (именно его, не Panasonic DV Codec!!!). Взять можно здесь.
Дополнение. Последнюю версию кодека можно взять отсюда: https://www.videohelp.com/software/Cedocida-DV-Codec
(Проверил и установил Алексей.)
http://forumupload.ru/uploads/0018/29/2a/230/t897819.png

7. Для начала работы скачайте файл Пробный захват_01.avi

Написание скриптов

Напишите в Блокноте такой текст:

aviSource("R:\Кинопередвижка\Пробный захват_01.avi")

Теперь измените путь к файлу R:\Кинопередвижка\ на свой путь к файлу, потом сохраните и измените расширение файла с .txt на .avs.
Этот файл откройте в VirtualDubMod. Сам AVS-файл может лежать где угодно, а вот авишку перемещать никуда нельзя, иначе Ависинт её не найдёт.
Попробуйте. Это просто открытие файла. Должно получиться.

Если не получится - без паники! Прошу в тему AviSynth-ликбез. Обсуждение.

3

Теперь начнём применять фильтры.

Для начала надо проанализировать исходник Пробный захват_01.avi
Здесь нам пригодится программа MediaInfo.
Вот что она показывает:

http://forumupload.ru/uploads/0018/29/2a/44/527973.jpg

Интересукющие нас сейчас параметры выделены красным:
Тип развёртки: Чересстрочная
Ширина: 720 пикселей
Высота: 576 пикселей
Соотношение сторон: 4:3

Если исходник чресстрочный (а он у нас именно такой), то первым делом ВСЕГДА выполняется деинтерлейс.
Затем мы приведём пропорции кадра кадра к стандартному соотношению сторон 4:3. Это называется ресайз (изменение размеров).
Напишите такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
aviSource("R:\Кинопередвижка\02 23 августа 1942 года.avi")
TDeint()
BicubicResize(720,544)

Первая строка здесь показывает, откуда надо загружать фильтр.
Вторая - открытие файла и путь к файлу (не забудьте изменить его на свой!).
Третья - команда выполнения деинтерлейса.
Четвёртая - изменение размеров кадра.

Если при открытии файла выйдет ошибка, то проверьте, лежит ли по адресу: C:\Video\AviSynth 2.5\plugins файл TDeint.dll.
Если нет, скачайте его здесь и положите туда.

Знак  # позволяет писать после него любой текст, он не воспринимается Ависинтом. Но только на одной строчке!
Чтобы писать обширные комментарии, надо написать такое: __END__
Все строчки ниже этого знака Ависинт видеть не будет.

Вопрос: А разве не 720х576 стандарт?
Ответ: Нет! 720х576 - это стандарт для чресстрочного видео в телевизионной аналоговой системе PAL. Файлы такого типа получаются, например, при сбросе на компьютер видео, снятых камерами miniDV или при захвате аналогового видео на компьютер платами видеозахвата. А для прогрессивного видео на компьютере, у которого все пиксели квадратные, при таком размере кадр не получится 4:3, пропорции будут искажены. Мы делаем цифровой рип по современным стандартам.

Отредактировано GreifeR (20-03-2022 10:01:57)

4

Что ещё можно улучшить? Фильм чёрно-белый, но на картинке присутствует некоторый цветной муар. Его можно (и нужно) убрать.
Для этого используется фильтр  grayscale. Он из цветного видео делает чёрно-белое. Фильтр этот встроен и в ВиртуалДабМод, и в Ависинт.

Здесь надо понять следующее. Мы работаем в двух программах - AviSynth и VirtualDubMod. У них у каждой свои наборы фильтров. Есть встроенные, и можно добавлять новые. Работают они на разных принципах, но есть сходные по функциям. В скрипте мы пишем только фильтры для Ависинта.
ВируалДаб свои фильтры может включать только уже после открытия скрипта, перед сохранением (кодированием) файла.

Начнём с VirtualDubMod. Откроем наш скрипт в нём и внимательно выполним все шаги, как на скриншотах.

http://forumupload.ru/uploads/0018/29/2a/44/t898807.jpg

http://forumupload.ru/uploads/0018/29/2a/44/t735634.jpg

Затем ещё раз нажмём ОК!

http://forumupload.ru/uploads/0018/29/2a/44/t634837.jpg

Теперь добавим в наш скрипт одну строчку (не забываем, что только после деинтерлейса!)

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()

grayscale()
BicubicResize(720,544)

Запустим ВиртуалДаб ещё раз, чтобы не использовать его фильтры, и откроем в нём новый скрипт.
Вот что получилось:
http://forumupload.ru/uploads/0018/29/2a/44/t211401.jpg

Видео уже на входе в ВиртуалДаб чёрно-белое.

Отредактировано GreifeR (20-03-2022 11:15:06)

5

Почистим картинку от шумов.

Тут надо понять одну важную вещь: любой фильтр что-то улучшает, но что-то при этом ухудшает. Поэтому слишком увлекаться фильтрацией не стоит. Скажем, фильтр зерна делает картинку чище, позволяет при кодировании использовать меньший битрейт, но при этом может размыть мелкие детали - капли дождя, рябь на воде и т.п. Тут важно использовать максимальные преимущества при минимальном ухудшении. Все фильтры, удаляющие пятна и, особенно, полосы с киноплёнки, как раз отличаются обратной эффективностью. Поэтому почистим для начала зерно.
Этот фильтр подробно описан в инструкции Как сделать отличный ДВД-рип, короткая и доступная инструкция ;).

Напишем такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
LoadPlugin("C:\Video\AviSynth 2.5\plugins\mvtools2.dll") # для фильтра зерна
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()
grayscale()

super = MSuper(pel=2, sharp=0, chroma=true)
b_vec2 = MAnalyse(super, isb = true,  delta = 2, chroma=true, blksize=8, overlap=4)
b_vec1 = MAnalyse(super, isb = true,  delta = 1, chroma=true, blksize=8, overlap=4)
f_vec1 = MAnalyse(super, isb = false, delta = 1, chroma=true, blksize=8, overlap=4)
f_vec2 = MAnalyse(super, isb = false, delta = 2, chroma=true, blksize=8, overlap=4)
MDegrain2(super,b_vec1,f_vec1,b_vec2,f_vec2,plane=4,thsad=400)

BicubicResize(720,544)

Много непонятных строчек в середине - это и есть фильтр зерна со средними настройками. Фильтр этот работает очень медленно, но даёт хорошие результаты.
Попробуйте, скрипт должен открыться сразу.

Отредактировано GreifeR (20-03-2022 17:59:05)

6

Корректировка гистограммы. Фильтр Levels.

Для качественной обработки видео важна не только субъективная оценка "на глаз", но и объективная"по приборам", где это возможно. :)
По канонам фотографии (старой, плёночной) считается, что в кадре должен быть абсолютно белый цвет и абсолютно чёрный. Хотя бы на небольшом участке. При этом детали должны быть различимы и в светАх, и в тенЯх.
У Ависинта и ВиртуалДаба есть встроенный фильтр Levels, который позволяет объективно это оценить.

Начнём с VirtualDubMod. Откроем в нём наш файл Пробный захват_01.avi. Напрямую, без всяких скриптов. Затем Video --> Filters --> Add.

http://forumupload.ru/uploads/0018/29/2a/44/792419.jpg

http://forumupload.ru/uploads/0018/29/2a/44/485977.jpg

http://forumupload.ru/uploads/0018/29/2a/44/203985.jpg

Перед нами открывается гистограмма выбранного кадра № 418. Подвигав ползунок в окне предварительного просмотра и нажав ещё раз 4, увидим гистограмму другого кадра.
На самой гистограмме левый край показывает уровень чёрного, а правый - уровень белого. Если слева гистограмма будет слишком далеко от края, то вместо чёрного получится серый цвет, если же гистограмма будет зашкаливать, упираться в край, то детали в тенЯх будут потеряны. С белым аналогично. В данном кадре с чёрным всё нормально, а вот белый зашкаливает. Что, собственно, и видно на изображении - детали в светах потеряны, кадр пересвечен.
Теперь попробуем подвигать ползунки и посмотрим, как меняется картинка.
Сразу скажу, что можно можно сделать серый цвет чернее, а слишком тёмную картинку высветлить. Но вот потерянные при пересвете и зачернении детали восстановить уже не удастся.
В данном случае нужно отодвинуть правый край гистограммы от границы белого. Но ползунки этого не позволяют. Потери в светах никак восстановить нельзя. Нужно уменьшить экспозицию у камеры при захвате, но это уже другая тема. 

Теперь загрузим этот фильтр а Ависинте.
Напишем такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()

grayscale()
levels(0, 1, 255, 0, 255)
BicubicResize(720,544)

Откуда мы взяли цифры?

http://forumupload.ru/uploads/0018/29/2a/44/857185.jpg

Если двигать ползунки фильтра в ВиртуалДабе, цифры в окошках будут меняться. Их мы переносим в скрипт. Теперь откройте этот скрипт в другом окне ВиртуалДаба. Результат будет аналогичным. А тогда зачем это всё? Почему не ограничиться ВиртуалДабом?
Потому что Ависинт позволяет применять разные настройки фильтра к разным участкам видео, хотя бы. Кроме того, AviSynth позволяет прописать отрицательные значения для чёрного и более 255 для уровня белого. Этого нельзя сделать ни в одной другой программе! (Зачем это надо? Это разговор для другой темы. Пока мы учимся азам.) Ну и много чего ещё другого позволяет делать. Но об этом дальше.

Хотел на этом закончить, но решил попробовать подвигать белый край. Написал такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()

grayscale()
levels(0, 1, 295, 0, 255)
BicubicResize(720,544)

И вот что получилось:

http://forumupload.ru/uploads/0018/29/2a/44/54346.jpg

Детали в светах всё-таки частично проявились! Гистограмма при этом стала выглядеть так:

http://forumupload.ru/uploads/0018/29/2a/44/652676.jpg

Не чудеса, но визуально смотрится лучше. Ависинт может ещё и не такое! Но захват надо всё равно стараться делать качественным.  :mad:
Продолжение следует!

7

По просьбам отдыхающих изучающих AviSynth расскажу о более простых (но не всегда лучших) способах коррекции гистограммы.

AutoLevels - автоматическая коррекция уровней.

Это не встроенный фильтр, поэтому вначале нужно скачать файл autolevels_0.6_20110109.dll отсюда и положить его в папку C:\Video\AviSynth 2.5\Plugins.
Теперь напишем такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
LoadPlugin("C:\Video\AviSynth 2.5\Plugins\autolevels_0.6_20110109.dll")   # для фильтра AutoLevels
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()
grayscale()

autolevels()
BicubicResize(720,544)

Теперь внимательно прокрутите видео. Если полученный результат вас устроит, то и хорошо. Но учтите, что все автоматические фильтры могут давать артефакты.
.

Есть ещё один способ автоматически нормализовать гистограмму.
Это фильтр ColorYUV (autogain).
Мы используем пока только одну его функцию.
Откроем такой скрипт:

LoadPlugin("C:\Video\AviSynth 2.5\Plugins\TDeint.dll")   # для деинтерлейса TDeint
aviSource("R:\Кинопередвижка\Пробный захват_01.avi")
TDeint()

ColorYUV (autowhite = false, autogain = true)
BicubicResize(720,544)

Мне этот фильтр нравится меньше. Почему? Просмотрите внимательно несколько первых кадров нашего видео в обоих скриптах и сравните результаты. Фильтр autogain даёт больше артефактов в тёмных сценах.

Открою один секрет. Если написать строчку так: ColorYUV (autowhite = true, autogain = true), фильтр будет не только изменять уровни, но и пытаться восстановить автоматически баланс белого. Но о цветокоррекции разговор ещё впереди.

8

Рассмотрим для разрядки несколько простых, но часто применяемых фильтров - обрезка, добавление бордюров и изменение размеров кадра.

Crop, AddBorders, Resize.

Скачаем файл Красный захват_02.avi, с которым нам предстоит работать.

Посмотрим характеристики файла с помощью MediaInfo. Нас сейчас интересуют вот эти параметры:
Ширина                                   : 1440 пикселей
Высота                                   : 1080 пикселей
Соотношение сторон                       : 4:3
Частота кадров                           : 25,000 кадров/сек
Тип развёртки                            : Прогрессивная

Деинтерлейс делать не надо, открываем файл таким скриптом: aviSource("R:\Кинопередвижка\Красный захват_02.avi")

http://forumupload.ru/uploads/0018/29/2a/44/396186.jpg

Это кадр, полученный при захвате видеокамерой с расточенного кадрового окна кинопроектора. Звук из оптической дорожки можно извлечь программно, но об этом есть другая тема Как извлечь звук с помощью программы AEO-Light v1.1 & AEO-Light v2.3.3

Давайте выделим только кинокадр.
Для этого обрежем лишнее такой командой: Crop(16, 32, -16, -32)
Четыре числа в скобках означают обрезку (слева, сверху, справа, снизу).
Обратите внимание, что значения справа и снизу должны быть отрицательными. Если везде будут нули, то ничего обрезаться не будет. В этом примере мы обрезали слева и справа по 16 пикселей, а сверху и снизу по 32. Но этого в данном случае недостаточно. Давайте подберём нужные значения. Для этого будем менять числа, сохранять изменения в скрипте, а потом обновлять ВиртуалДаб клавишей F5. Может так получиться, что в некоторых случаях картинка в ВиртуалДабе отображаться не будет, или будет появляться сообщение об ошибке. Почему так происходит - разговор впереди. Чтобы обойти это ограничение, пока принудительно изменим размеры видео на стандартные 4:3.

aviSource("R:\Кинопередвижка\Красный захват_02.avi")
Crop(46, 32, -282, -32)  # подбираем значения экспериментально!
BicubicResize(720,544)

Теперь, как бы мы ни обрезали кадр с разных сторон, на выходе он всегда будет размерами (720,544), хотя пропорции изображения могут искажаться. Наша задача - обрезать лишнее, сохранив максимум полезного. Пробуйте! У меня получились такие значения:

aviSource("R:\Кинопередвижка\Красный захват_02.avi")
Crop(46, 118, -286, -160)
BicubicResize(720,544)

http://forumupload.ru/uploads/0018/29/2a/44/42710.jpg

Теперь попробуем закомментировать (отключить) строку # BicubicResize(720,544) и снова открыть скрипт. В данном случае получилось. А могло и не получиться. Это потому, что размер кадра не может быть любым. Для разных кодеков и контейнеров существуют разные ограничения.
Универсальные значения высоты и ширины кадра должны быть кратны 16. Ну как минимум 8. Или хотя бы 4. Того кадра, который получился после обрезки!
Проверим это. Ширина = 1440-46-286 = 1108
Высота = 1080-118-160 = 802
Соотношение сторон получается 1,38. А было 1,33. В принципе пойдёт. Нужно, чтобы были правильные пропорции (aspect ratio) изображения.
Проверяется это визуально по круглым предметам в кадре. В нашем случае это колесо велосипеда. Можно измерить высоту и ширину любыми способами, хоть линейкой на экране монитора. Оно круглое? Ну, в принципе, да.
Но так получается не всегда. В данном случае камера снимала с сотношением сторон 4:3, при этом сам кинокадр тоже 4:3.
Мы закончили с обрезкой.

Теперь нам нужно привести размер кадра к стандартному, сделать Resize.
Для контейнера avi SD-разрешения стандарными будут размеры (720,544) для 4:3 и (720,400) для 16:9.
Обрезка практически никак не влияет на качество картинки, а вот изменение размеров (масштабирование) очень даже влияет. Нежелательно увеличивать размеры кадра, сжимать можно.
Существуют множество способов (алгоритмов) пересчёта пикселей при масштабировании. Чаще всего применяются BicubicResize и Lanczos4Resize.
Последний делает картинку более резкой, и может использоваться, если придётся всё-таки увеличивать кадр. Есть и много других, применяемых в особых случаях, но у нас пока ликбез...

А зачем же нам бордюры?
AddBorders(0,14,0,16) # добавляем 14 пикселей сверху и 16 снизу. Отрицательные значения не применяются.
Для чего? Соттношение сторон у нас всё-таки не совсем точное. Надо бы 1,33. Если ширина после обрезки 1108, то высота должна быть 832 (а у нас пока 802). Нужно добавить 30 пикселей. Нечётные значения лучше не применять. Получилось:

aviSource("R:\Кинопередвижка\Красный захват_02.avi")
Crop(46, 118, -286, -160)

AddBorders(0,14,0,16)
BicubicResize(720,544)

http://forumupload.ru/uploads/0018/29/2a/44/616168.jpg

Колесо стало покруглее, а лица не такие вытянутые.
Бордюры по умолчанию чёрные, но можно сделать практически любого цвета. Правда, это редко когда требуется.

Чтобы всё это прочувствовать, мало просто читать тему. Нужно пробовать делать практически. Если что-то не получается - со всеми вопросами прошу в тему AviSynth-ликбез. Обсуждение.