Подгружаемые фильтры.
 
Фильтры VirtualDub.

Команда LoadVirtualdubPlugin позволяет использовать в скрипте подгружаемые однопроходные фильтры VirtualDub. Чтобы стандартизировать запись наиболее употребимых фильтров можно использовать файл vdfilters.avs (Загрузить / Посмотреть). Аналогичным образом можно подготовить обращение к другим фильтрам.


Плагин InverseTelecine.

Это небольшой фильтр первоначально разработанный для тестирования команды LoadPlugin в AVISynth. Но применение части его - фильтра InverseTelecine давало великолепные результаты и автор опубликовал его в сети. Другая часть - фильтр DeInterlacing все еще в состоянии разработки, но можно надеяться, что и он будет когда-нибудь закончен.

 

Плагин был разработан для работы с AVISynth v1.0 или выше. Неизвестно, как он будет работать с любыми другими программами (Можно быть уверенным, что не будет) и такие эксперименты проводить не рекомендуются.

 

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

 
InverseTelecine
 

Фильтр выполняет восстановление видео-потока прошедшего процедуру "Telecine" ("3:2 pulldown"). Плагин не может восстановить видео-поток который только чересстрочен или не прошёл через явный процесс Telecine.

 

Фильтр InverseTelecine использует три параметра: Верхний предел, Нижний предел и Порог (более об это ниже). Значения в области от 0 до 255 для верхнего и нижнего пределов и от 1 до 1000000 для порога. (Хорошие результаты дают значения 40,10,15).

 
Верхний предел
если разница значений яркости двух пикселов (один над другим) выше этого значения, то пиксель считается "чересстрочным".
Нижний предел
если разница значений яркости двух пикселов (один над другим) ниже этого значения, то пиксель считается "не чересстрочным".
Порог
если значение "чересстрочности" его превышает то необходим перерасчёт структуры "3:2 pulldown"
 

Пример

LoadPlugIn("c:\archive\InverseTelecine.dll")
SegmentedAviSource("D:\capture.avi")
InverseTelecine(40,10,15)
 
DeInterlace
 

DeInterlace берёт чересстрочный видео-поток и восстанавливает прогрессивный согласовывая пары полей (без смешивания).

 

Прямо сейчас никаких параметров не требуется, но возможно это измениться ...

 

Для нормальной работы DeInterlace нужно уметь находить правильное соответствие полей в текущем и смежных кадрах. Это значит, что если видео-потоки сшиты вместе или ваша карта захвата работает не очень хорошо, вы можете увидеть несколько прошедших фильтр чересстрочных кадров.

 

Пример

LoadPlugIn("c:\archive\InverseTelecine.dll")
SegmentedAviSource("D:\capture.avi")
DeInterlace
 
Decimate
 

Decimate убирает одно дублированное поле в каждой группе определённых кадров. Эффект того же типа что и InverseTelecine, но на прогрессивных (не чересстрочных) видео-потоках.

 

Фильтру передаётся 3 параметра: Группа, Фильтр и Порог.

 
Группа
Указывает число кадров в группе из которых один кадр должен быть удалён. К примеру, Группа = 5 означает удаление 1 кадра в каждой группе из 5 кадров (что аналогично IVTC).
Фильтр
Указывает, как близко должны быть значения яркостей двух пикселей, чтобы быть рассматриваемыми как одинаковые. Для DVD рекомендуемые значения между 4 и 8 (лучше 8) и 16 или меньше для VHS.
Порог
Показывает, как похожи должны быть 2 кадра, чтобы рассматриваться как одинаковые. На текущий момент значения параметра должны лежать от 100 до 1000 (лучше 500) с большими значениями для менее качественных видео-потоков или большего движения.
 

Пример

LoadPlugIn("c:\archive\InverseTelecine.dll")
SegmentedAviSource("D:\capture.avi")
Decimate(5, 8, 500)
 
Дополнительная информация
Форматы YUV и RGB
Как известно, любой кодек разжимает либо в YUV либо в RGB формате. Говоря просто, RGB определяет пиксель присвоением 8 бит для Красного, Зелёного и Синего. YUV определяет пиксель его Яркостью и 2-мя цветоразностями. Следует помнить, что плагин использует значение Яркости для определения чередованы ли 2 строки, поэтому RGB не даст верной информации. Если кодек не разжимает в YUV формат, воспользуйтесь ConvertToYuY2.
Процедура Telecine
Процесс в ходе которого видео-поток с частотой кадров ~24 переводиться в видео-поток с частотой кадров ~30 (стандартный NTSC) добавлением двух полей (либо нечётных строк либо чётных) каждые 5 кадров (не сразу). В результате этого 3 из 5 кадров становятся чересстрочными, что хорошо выглядит на чересстрочном устройстве вывода (телевизор) но ужасно на прогрессивном (монитор).
Как работает плагин
Сперва плагин анализирует первые 5 кадров и определяет структуру "3:2 pulldown" выбирая 2 кадра с наименьшими артефактами чересстрочности. Далее, он продолжает выбирать каждый следующий кадр используя предопределенную структуру. Однако, каждый результирующий кадр анализируется, чтобы убедиться, что среди них не чересстрочных. Если значение чересстрочности превышает значение порога, структура "3:2 pulldown" вычисляется по новой.
 

Плагин MPEG2DEC.

MPEG2DEC.dll это AVISynth плагин дающий вам доступ к MPEG2 файлам также легко, как к нормальным AVI файлам. Это значит произвольный доступ к каждому кадру. Официальная страница http://me.in-berlin.de/~faphida/index.html.

 
mpeg2source
 
mpeg2source("file_name.d2v")
 

Код основан на проекте DVD2AVI v1.76 (http://hiroko.ee.ntu.edu.tw/). Фактически просто портирована VFAPI часть на C++ и добавлен ассемблерный код для получения YUV выхода. DVD2AVI всё ещё необходим для подготовки MPG файлов. Обычно, этот плагин используется так:

LoadPlugin("L:\path\MPEG2DEC.DLL")
video=mpeg2source("L:\path\mpg2video.d2v")
audio=AVISource("L:\path\sound.wav")
AudioDub(video, audio)
 

Первая строка загружает плагин. В результате новый метод AVISynth mpeg2source становиться доступен. Он используется во второй строке для открытия проектного файла DVD2AVI. Метод возвращает видео-клип готовый к использованию.

 

Следующие два шага необязательны. Но обычно ваше видео имеет звуковую дорожку, которую также надо обработать. Так как VFAPI плагин DVD2AVI не поддерживает извлечения звука, вы должны сперва отделить звуковую дорожку, чтобы она стала доступна из AVISynth как WAV файл. Этот файл открывается и присоединяется к видео-клипу в последних двух строках.

 

Преимуществом над VFAPI является то, что mpeg2source возвращает кадры в формате YUY2. VFAPI ограничено в RGB и вводит два времяёмких шагов преобразований (YUV->RGB, RGB->YUV)

 

Исходно плагин разрабатывался в рамках VFAPI соглашения, и конечно всё ещё возможно его использование таким образом даже в AVISynth. Напишите вместо LoadPlugin строку LoadVFAPIPlugin("L:\path\MPEG2DEC.dll", "mpeg2source"). Как результат вы получите потерю производительности из-за YUV->RGB преобразования.

 

Кроме метода mpeg2source плагин добавляет два фильтра: TemporalSmoother и SelectRangeEvery:

 
TemporalSmoother
 
TemporalSmoother(clip[,strength[,radius]])

Это портированный фильтр VirtualDub TemporalSmoother. Он работает в цветовых пространствах RGB32 и YUY2.

 

В файле помощи VirtualDub говориться: этот фильтр - адаптивный подавитель шума, работающий вдоль временной оси. Увеличивайте силу фильтра, чтобы увеличить шумоподавление и уменьшайте, для избавления от артефактов ряби и двоения. Рекомендуется комбинировать этот фильтр с пространственным (по площади) шумоподавителем для лучшего результата.

 

Все кадры не далее чем radius изучаются. Минимальный радиус - 1, максимальный - 7. Большие значения разумеется медленнее. Значение по умолчанию 3, как и то, что используется в VirtualDub. Значение по умолчанию для strength - 2.

 

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

 
Пример:
# Эффект фильтра отличается в RGB и YUV он не 100% эквивалентен, # особенно с большим значением strength # Давайте покажем различие
cYUY2 = ConvertToRGB(TemporalSmoother(ConvertToYUY2,10))
cRGB = TemporalSmoother(10)
Subtract(cYUY2, cRGB)
 
SelectRangeEvery
 
SelectRangeEvery(clip,every,length[,offset])

Выбирает length кадров каждые every кадров, начиная с offset. SelectRangeEvery(every,length,offset) одинаков с SelectRangeEvery(Trim(offset,0),every,length).


Плагин SpatialSoftenMMX.
    Системные требования
  • Win32
  • Расширения Athlon MMX или Intel SSE (и самый быстрый процессор, который вы можете достать...)
  • Память
  • AVISynth v1.x
 
 
    Исходные материалы.
  • Алгоритмы использованные в этом фильтре не изобретены автором, напротив, они взяты из других источников.
  • Первая часть просто фильтр SpatialSoften из AVISynth портированный в MMX (и оптимизированный конечно)
  • Вторая часть пришла из фильтра VirtualDub dynamic noise reduction (разработчики Стивен Дон и Авери Ли)
 

Замечания по производительности

 

Итак, почему так ужасающе медленно? Причина в большом числе анализируемых пикселей для определения значения одного пикселя. Рассмотрим PAL видео: 720x576 x 4байта/цвет (RGB) = 1.58Mb. Радиус равный 4 даёт площадь 9x9 = 81 пикселей, таким образом фильтр читает 1.58 x 81 = 128Mb для каждого кадра!

 

Athlon 800 может вычислять 1 или 2 кадра в секунду. Высшие частоты не решают проблемы, так как она относится более к пропускной способности шины работы с памятью.

 

Можно ожидать, что YUV версия будет быстрее чем её RGB двойник благодаря меньшим требованиям к памяти. Но YUV формат пикселя сложен (читайте: времяёмок) для обработки. Как результат - разница невелика.

 

Часть кода может быть ещё оптимизирована: возможно удастся выжать несколько процентов переупорядочиванием некоторых инструкций чтобы воспользоваться параллельным запуском команд на современных процессорах. Но из-за малого числа регистров на архитектуре x86 почти все инструкции зависят от их порядка, и, особенно во внутреннем цикле, переупорядочивание невозможно.

 

Лучший вариант - использование видеосигнала без шума ^_^


Плагин GreedyHMA - Greedy (High Motion для AVISynth).

GreedyHMA.dll это плагин AVISynth выполняющий код алгоритма DScaler Greedy/HM для обнаружения структуры 3:2 pulldown, фильтрации и избавления от чересстрочности видео.

 
    Реквизиты
  • Пожалуйста присылайте комментарии Тому Барри (Tom Barry) - trbarry@trbarry.com
  • Временное расположение файлов:
 

Просто разожмите содержимое архива в вашу директорию с AVISynth, или ещё куда. Как видно из скрипта можно поместить плагин в поддиректорию к AVISynth, просто, чтобы держать их по-отдельности.

 

В архиве имеется тестовый скрипт:

LoadPlugin("d:\AVISynth\GreedyHMA\Debug\GreedyHMA.dll")
clip = AVISource("c:\vcr\bikes.avi")
return clip.GreedyHMA(1,0,4,0,0,0,0,0)
 

Здесь задаётся файл (укажите свой) и включаются TopFirst и AutoPulldown с прореживанием (отбрасывание кадров) до 24 FPS. Тесты проводились с AVISynth/VirtualDub

 

Возможно существует дефект кода, который требует чтобы параметр TopFirst был включен. Может быть это проявляется только с захватом Matrox G400 в MJPEG, но достигаемый результат несколько лучше с включённым параметром. Можно запустить 2-е копии VirtualDub и выполнить покадровое сравнение. Особо большой разницы не заметно но все же сравнение двух кадров (обратите внимание на диагонали) обычно покажет, что один лучше. Вы можете просто посмотреть вход VirtualDub для этого. Пока нет насущной необходимости в создании выходного файла.

 

В общем, если вы считаете что ваше видео (~ 30 FPS) происходит из фильма (~24 FPS), или так предполагает DVD2AVI, то применяйте:

GreedyHMA(1,0,5,0,0,0,0,0) # команда форсирует прореживание до 24 FPS
 

Если всё видел, применяйте:

GreedyHMA(1,0,0,0,0,0,0,0) # для 30 FPS на выходе
GreedyHMA(1,0,3,0,0,0,0,0) # для 24 FPS на выходе
 

И когда вы не знаете, не беспокоитесь, или всё перемешано, просто положитесь на автомат:

GreedyHMA(1,0,4,0,0,0,0,0) # общецелевые, наиболее автоматизированные установки
 
Более полное описание параметров.
 
GreedyHMA(TopFirst, SwapFields, AutoPullDown, MedianFilter, VerticalFilter, EdgeEnhance, GoodPullDownLvl, BadPullDownLvl)
 
Все значения целые, 0-нет, 1-да:
TopFirst
предполагает, что верхнее поле, строки 0,2,4,... должны отображаться первыми. Значение по умолчанию предположительно более общий случай BottomFirst (но не всегда).
SwapFields
для кривых драйверов захвата, помещающих строки 1,3,5,... до строк 0,2,4...
AutoPullDown
Устанавливает тип восстановления исходного порядка полей
0
Не восстанавливает, просто убирает гребёнку. Не отбрасывает кадры так что FPS остаётся какой был. Не прореживает. Используйте, если имеете (и хотите оставить) 30 FPS видеоисточник или возможно 25 FPS PAL видео.
1
Автоматическое восстановление. Автоматически решается, какие кадры должны быть подвергнуты процедуре восстановления (IVTC) или избавления от гребёнки (deinterlace), в зависимости от параметров Good Pulldown Lvls и Bad Pulldown Lvls (смотри ниже). Не прореживает. Лучший вариант если у вас в источнике смешаны фильм и видео и вы хотите 30 FPS на выходе. Также лучше для PAL источников.
2
Только восстановление (форсирование 24 FPS). Предполагает, что источник - фильм, всегда выполняет восстановление кадра и никогда не избавляется от гребёнки. Не прореживает.

Значения 3-5 соответствую вышеописанным, но с отбрасыванием кадров (прореживание). Просматриваются 5 кадров за раз и один наиболее похожий на дублированный отбрасывается, поэтому FPS опускается, скажем, с 30 до 24.

3
Освобождение от гребёнки (форсирование 30 FPS) но с отбрасыванием кадров. Применяйте для NTSC видео, если все же хотите проредить. С видеоисточником реально нет правильных полей для отбрасывания, но отброшены будут один кадр из наиболее похожих.
4
Автоматическое восстановление с отбрасыванием кадров. Лучшая (наиболее автоматическая) установка. Работает в большинстве случаев, по крайне мере если не имеет дефектов.
5
Только восстановление (форсирование 24 FPS) с отбрасыванием кадров. Даёт наилучшие результаты, если у вас 100% правильно подготовленный NTSC фильм источник не содержащий секций видео и слишком много монтажа. Возможно детектирование большинства смен сцены и изменение структуры восстановления, но не смешанных полей.

Что когда лучше полностью не тестировалось. Восстановление пока не идеально. Но если вы не уверены, оставьте значение 4 проста на всякий случай. Это должно всё ещё справляться со спортивным видео имеющим высокий уровень движения.

MedianFilter (по времени)
Внимание! Медианный фильтр в данной версии отключен.
Медианный фильтр помогает избавиться от шума но вызывает задержку на 2 поля. (Иначе на 1 поле) Задание 1 включает использование значения по умолчанию (сейчас 3, но может измениться) но вы можете также задать новое значение 2-255. Однако значения выше 3-5 могут стать причиной артефактов движения в быстром видео. Добавочное отбрасывание кадров медианного фильтра отключено так как работает с задержкой на 2 кадра в отличии от всего остального. Это выглядит не особо важным, так что на текущий момент не работает. Параметр сейчас игнорируется.
VerticalFilter
Не только освобождает от шума, но ещё слегка чистит артефакты освобождения от гребёнки так как выполняется последним, после избавления от гребёнки. Полезен, если вы собираетесь уменьшать. Используйте только значения 0 и 1 для параметра.
EdgeEnhance (по горизонтали)
Добавляет небольшую резкость к полноразмерному видео. Может использовать значения параметра 2-100. По умолчанию сейчас 50, если передано 1. Возможно будет поддержка отрицательных значений в будущем. Фильтрация горизонтальна, чтобы помочь с настройками для уменьшения размера.
Good Pulldown Lvl
Число от 1 до 255, которое должно быть превышено до того, как GreedyHMA восстановит кадр. Параметр применяется только когда AutoPulldown также включен. Значение по умолчанию подлежит изменению, а пока установлено в 90. Вы получите значение по умолчанию просто передав 0, что и рекомендуется для большинства случаев. Фактически это просто среднее по нескольким кадрам сохранённых показателей гребенчатости/переплетённости правильно согласованных кадров.
Bad Pulldown Lvl
Число от 1 до 255, которое не должно быть превышено до того, как GreedyHMA восстановит кадр. Значение по умолчанию подлежит изменению, а пока установлено в 85. Вы получите значение по умолчанию просто передав 0, что и рекомендуется для большинства случаев. Фактически это просто мера того, как сильно ухудшаться показатели гребенчатости/переплетённости кадра, если мы выполним чисто согласование полей.
 

Сейчас все 8 параметров должны присутствовать, проверка ошибок отсутствует, и нет других статей по Greedy/HM, кроме как на http://www.dscaler.org.

 
Известные проблемы и ограничения
 
  1. Только для машин с SSE! Расширение DScaler Greedy/HM написано, частично на ассемблере только для машин с SSE. Пока не сделан контроль нулевой погрешности, поэтому фильтр немедленно рухнет если вы не имеете хотя бы Celeron побыстрее, P-III, Athlon или выше. Нет уверенности, будет ли это в будущем исправлено, но возможно что да.
  2. Сейчас нет контроля ошибок или сообщений. Автор пока не разобрался как выводить сообщения об ошибках в AVISynth, и есть много чего, что надо ещё понять.
  3. Предполагается YUV(YUY2) основанный на кадрах вход. При необходимости сначала используйте методы AVISynth для конвертации.
  4. В настоящее время размер кара ограничен 999x576 пикселей. Исправлено... (Теперь, с целью поддержки HDTV, когда делалось для AVISynth установлено ограничение 1928x1081).
  5. Если у вас чистый, бесперебойный фильм-источник, без монтажа или капризного перевода в ~30 FPS и без видеоисточника, то вполне возможно что лучшую производительность и качество даст использование других функций VirtualDub для восстановления исходных кадров, а не морока с GreedyHMA. GreedyHMA спроектирован для высокоподвижных спортивных и смешанных видео с фильмом последовательностей. Он также может хорошо работать с аниме.
  6. Есть странный, не совсем понятный сбой. Если поставить новый или изменённый GreedyHMA.dll на свою машину, первый раз как вы запустите VirtualDub/AVISynth/GreedyHMA, VirtualDub может повиснуть. Если затем вы воспользуетесь Task Manager чтобы снять VirtualDub он заработает после этого. Чтобы избежать, похоже надо в начале открыть любой другой AVI файл в VirtualDub при первом запуске после установки GreedyHMA, до открытия каких-либо скриптов AVISynth. Позднейшее замечание: эффект не связан полностью с GreedyHMA, он происходит и без него.
  7. Сейчас фильтр работает правильно, если подаваемая ширина экрана кратна 16. в противном случае возможно формирование мусора в правом краю экрана, который вы возможно должны обрезать.
  8. Как отмечено выше опция медианной фильтрации временно игнорируется.
 
Метод избавления от гребёнки Greedy (High Motion).
 

Наконец следует слегка сокращённая копия резюме по Greedy (High Motion) со страницы помощи DScaler:

 

Плагин работает на двух различных уровнях. По умолчанию, на Первичном уровне, это нормальный метод избавления от гребёнки DScaler, со следующими особенностями.

 
    Что делает фильтр (Первичный уровень)
  • Объединение Blended Clip, Greedy (Low Motion), и немного новшеств.
  • Подразумеваемое Greedy восстановление оригинального кадра, как метод Greedy (Low Motion)
  • Смешивание параметров как метод Blended Clip.
  • Прогнозирующее выявление движения
  • Диагональное снижение ступенчатости (DJR) для сглаживания лестничного эффекта в движущихся диагональных линиях. Достигается это горизонтальным сглаживанием только быстро движущихся пикселов, не трогая стационарных. Если диагональная грань не движется, то она все равно не будет зубчатой при Greedy (High Motion).
  • Ползунковая регулировка для Max Comb (макс. гребёнка), Motion Threshold (порог движения) и Motion Sensitivity (чувствительность движения). Однако значения по умолчанию должны подходить в большинстве случаев.
 

Существует также Расширенный уровень (экспериментальный), включающийся, если вы отметите любой из элементов в интерфейсной панели метода. Вы не можете делать этого если не запускаете на машине поддерживающей набор инструкций Intel SSE (необходимы только целочисленные инструкции SSE). Расширенный уровень должен выполняться на Celeron побыстрее, Intel P-III, P4 и Athlon.

 

Когда используются расширенные возможности Greedy (HM) поддерживает свою собственную внутреннюю историю последних 4-х входных видео-полей. Значит он должен быть способен исследовать каждое поле и вы не можете использовать в тоже время обычную опцию DScaler - AutoPullDown.

 
    Что делает фильтр (Расширенный уровень)
  • Встроенное восстановление 3:2, 2:2 "n:m pulldown". Выполняется согласование, не устранение, так что все кадры показываются. Думается, что в итоге это будет лучше работать с видео-перекрытиями и живым TV просмотром, который подвергается интенсивному монтажу, но требуется дальнейшее совершенствование.
  • Промежуточные кадры. Даёт уменьшение дрожания для тех, кто имеет 60 Гц RTPV. В случае "3:2 pulldown" выберется подходящая пара полей в среднем единожды для каждых 5 кадров. Это может эффективно показать каждый новый входной кадр 2.5 раза. В результате небольшой объём размазывания движения каждый пятый кадр. Сам автор постоянно оставляет режим включенным для более гладкой последовательности кинофильма. С "2:2 pulldown" тоже работает (кажется), но половина кадров будет усреднена и размазывание движения может быть неприемлемым.
  • Настраиваемое усиление граней. Основано на идее Mr. Уигглеса(Wigggles). Опция усиливает только в небольшом объёме по горизонтальноё оси. Когда включено, вы можете использовать ползунок для подстройки.
  • Настраиваемый медианный фильтр. Также благодаря Mr. Уигглесу, фильтр может помочь убрать шум. Однако если установить выше 3-5 он также вызовет артефакты движения на быстродвижущихся сценах. Также имеет ползунок.
  • Вертикальный фильтр. Это программный вертикальный фильтр применяемый после избавления от гребёнки, который может устранить и шум и остаток артефактов избавления от артефактов избавления от гребёнки. Результат одинаков с аппаратной реализацией доступной на экране расширенных видео-флагов, но не такой экстремальный и без дрожания.

Учебное пособие
[Учебное пособие]
AVISynth
[AVISynth]
Ссылки
[Ссылки]