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