Avisynth


Самым оптимальным для видеомонтажа является Avisynth — фрэймсервер, основой которого являются скрипты и множество подключаемых внешних плагинов. Стандартный Avisynth является однопоточным, поэтому используется только одно ядро процессора. Существует неофициальная версия мультипоточного (MT) Avisynth, которая использует все ядра процессора. Для включения мультипоточности после установки стандартного Avisynth заменяют библиотеку avisynth.dll в папке C:\Windows\System32 (32-битная) или C:\Windows\SysWOW64 (64-битная) на avisynth.dll MT версии. Желательно сохранить оригинальную библиотеку avisynth.dll переименовав её, например, в avisynth.old.

Файл скрипта Avisynth имеет расширение .avs и редактируется в обычном блокноте, Notepad++, Akelpad и прочими редакторами. В нём применяется синтаксис C++. Скрипт условно разбит на три блока.

  1. Загрузка плагина;
  2. Импорт (захват, декодирование) изображения, текста, видео и аудио;
  3. Обработка с выводом аудио и видео потока.

Синтаксис

Last — последнее видео, позволяет обойтись назначения переменной, например,  вместо video=avisource(video.avi) \ BlankClip(length=50, video, color=$000000), писать avisource(video.avi) \ BlankClip(length=50, last, color=$000000)

Для загрузки аудио- и видеоматериала используются следующие команды.

Плагины

Плагины для импорта (декодирования) видео

LoadPlugin("DGDecode.dll") # плагин Donald Graft-а, позволяет декодировать MPEG2 и MPEG1 видео;
LoadPlugin("DGDecodeNV.dll") # платный плагин Donald Graft-а, позволяет декодировать H.264 видео c осуществлением деинтерлейса, изменением размера и обрезкой краёв, используя для этого видеокарту поддерживающую технологию CUDA (NVIDIA);
LoadPlugin("DGAVCDecode.dll") # плагин Donald Graft-а, позволяет декодировать H.264 видео используя для этого CPU;
LoadPlugin("ffms2.dll") # плагин FFmpeg, позволяет декодировать любой кодек поддерживаемый FFmpeg;

Плагины для импорта (декодирования) аудио

LoadPlugin("bassaudio.dll") # плагин для декодирования wav, aiff, mp3, mp2, mp1, ogg. Поддерживает aac, ac3, alac, ape, cd, flac, midi, mpc, ofr, spx, tta, wma и wv при подключении дополнительных библиотек (*.dll);
LoadPlugin("nicaudio.dll") # плагин для декодирования MPEGAudio, ac3, DTS, LPCM, mp3, aac, wav и др.;
LoadPlugin("ffms2.dll") # плагин позволяет загружать всё, что может декодировать FFMPEG (должен быть установлен в системе);

Плагины для импорта текста

LoadPlugin("vsfilter.dll") # плагин для загрузки субтитров ssa, ass, srt и др.;

Плагины шумодавы

LoadPlugin("C:\windows\system32\fft3dfilter.dll") # плагин для удаления шумов из изображения, требуется fft3dGPU.dll (или LoadPlugin("C:\Windows\SysWOW64\fft3dfilter.dll") для 64-битной ОС);
LoadPlugin("C:\windows\system32\fft3dGPU.dll") # плагин для удаления шумов из изображения, используется видеокарта, требуется fft3dfilter.dll (или LoadPlugin("C:\Windows\SysWOW64\fft3dGPU.dll") для 64-битной ОС);
LoadPlugin("VagueDenoiser.dll") # плагин для удаления шумов из видео. Используется CPU;
LoadPlugin("DeGrainMedian.dll") # плагин для удаления шумов из видео. Используется CPU. Работает с черезстрочным видео;
LoadPlugin("SmoothUV.dll") # удаление радужных полосок;
LoadPlugin("GuavaComb.dll") # удаление цветовых шумов;

Плагины деинтерлейса (устранения гребёнки)

LoadPlugin("LeakKernelDeint.dll") # плагин для деинтерлейса, используется CPU;
LoadPlugin("Decomb.dll") # плагин для деинтерлейса, используется CPU;
LoadPlugin("TDeint.dll") # один из самых лучших плагинов для деинтерлейса, используется CPU;
Load_Stdcall_plugin("yadif.dll") # Перенос (порт) YADIF (Yet Another DeInterlacing Filter) дентерлейс фильтра из MPlayer от Michael Niedermayer. Он проверяет пикселы предыдущего, текущего и последующего кадра для восстановления пропущенного поля некоторым локально адаптивным методом (выравнивающей края интерполяцией) и использует пространственную проверку для предотвращения большинства артефактов;

Плагины для эффектов

LoadPlugin("Zoom.dll") # плагин для зума, панорамирования и эффекта Кен Барнса (Ken Burns Effect);

Команды

Импорт

Import("script-file.avs") # импортирует скрипт из одного файла в другой;
Import("script-file.avsi") # импортирует скрипт из одного файла в другой;

Декодирование изображения, аудио и видео

DirectShowSource("video.avi") # загрузка видео вместе с аудио любого формата поддерживаемого операционной системой, не требуется demux и плагин для Avisynth, скорость работы зависит от кодека и декодера установленных в OC, может использовать GPU (зависит от кодеков ОС);
AviSource("video.avi") # загрузка видео в формате avi, соответственно поддерживает только те форматы, которые входят в спецификацию AVI (обычно mpeg2 и mpeg4), не требуется demux и плагин для Avisynth, для декодирования используется только CPU;
MPEG2Source("video-file.d2v") # загрузка видео в формате mpeg2, требуется плагин DGDecode.dll и предварительная индексация видео дорожки, для декодирования используется CPU. Для индексации видео открываем в программе DGIndex.exe и нажимаем F4, вместе с созданием индекса производится отделение звуковой дорожки в аудио файл;
DGSource("video-file.dgi", resize_w=720, resize_h=404, crop_t=0, crop_b=0, crop_l=0, crop_r=0) # загрузка видео в формате h.264, используется CUDA, нужен предварительный demux (кроме .ts и .mkv), требуется плагин DGDecodeNV.dll и предварительная индексация видео дорожки;
AVCSource("video-file.dga") # загрузка видео в формате h.264, CUDA не используется, нужен предварительный demux, требуется плагин DGAVCDecode.dll и предварительная индексация видео дорожки;
QTInput("input.mov") # импортирует видео и аудио поток используя QuickTime, требуется QuickTime 7 и выше, не требуется demux и плагин для Avisynth;
FFVideoSource("video-file.mp4") # импортирует видео поток даже из контейнера, т.е. не нужен предварительный demux, требуется плагин ffms2.dll;
FFAaudioSource("video-file.mp4") # импортирует аудио поток даже из контейнера, т.е. не нужен предварительный demux требуется плагин ffms2.dll;
bassAudioSource("audio-file.aac") # для импорта аудио нужно вытащить из контейнера аудио дорожку;
NicAC3Source("audio-file.ac3") # загрузка звука в ac3 формате, требуется плагин nicaudio.dll;
NicMPASource("audio-file.mp2") # загрузка звука в mpg формате, требуется плагин nicaudio.dll;
WAVSource("audio-file.wav") # загрузка звука в wav формате, плагин не требуется;
Imagereader("image-file.jpg") # загрузка картинки и превращение его в кадр, плагин не требуется;
ImageSource("photo.png", end = 300, fps=25) # аналог Imagereader, но работает быстрее (название файла картинки, сколько раз её повторить, количество кадров в секунду);

Деинтерлейс

FieldDeinterlace(blend=false) # деинтерлейс, используется CPU, требуется плагин Decomb.dll;
TDeint(map=0, mthreshL=6, mthreshC=6) # один из самых лучших деинтерлейсов, используется CPU, требуется плагин TDeint.dll;
Yadif (clip, int "mode", int "order", bool "planar", int "opt") # деинтерлейс, используется CPU, требуется плагин Yadif.dll.

  • mode = 0 : временная и пространственная проверки (по умолчанию);
  • mode = 1 : удвоение частоты кадров (bob), временная и пространственная проверки;
  • mode = 2 : не делать пространственную проверку чересстрочности;
  • mode = 3 : удвоение частоты кадров (bob), не делать пространственную проверку чересстрочности;
  • order = -1 : порядок полей как полагает (по умолчанию);
  • order = 0 : Нижнее поле первое;
  • order = 1 : Верхнее поле первое;
  • planar = false : обычный YUY2 формат пиксела Avisynth (по умолчанию);
  • planar = true : флаг (игнорируемый для YV12) для (хакнутого) планарного YUY2 цветового формата входных и выходных клипов, совместимого с функциями Interleaved2planar и Planar2Interleaved из плагина RemoveGrain (SSETools) от Kassandro (для исключения многократных преобразований);
  • opt = -1 : CPU оптимизация — автоматически (по умолчанию);
  • opt = 0 : slow C version;
  • opt = 1 : Integer SSE;
  • opt = 2 : SSE2;
  • opt = 3 : SSSE3 (some).

Шумодавы

FFT3DGPU(sigma=3, plane=4, interlaced=true) # удаление шумов из видео, используется GPU, необходим плагин fft3dfilter.dll и fft3dGPU.dll. sigma=3 — фильтруется цветность, sigma=2 — фильтруется яркость;
FFT3DFilter(sigma=3, plane=4, interlaced=true) # удаление шумов из видео, используется CPU, необходим плагин fft3dfilter.dll. sigma=3 — фильтруется цветность, sigma=2 — фильтруется яркость;
VagueDenoiser(nsteps=200, chromaT=0, percent=100) # удаление шума, используется CPU, требуется плагин VagueDenoiser.dll;
DeGrainMedian(mode=1, interlaced=true, limitY=3, limitUV=5) # удаление шума, используется CPU, требуется плагин DeGrainMedian.dll;
SmoothUV() # удаление радужных полосок, используется CPU, требуется плагин SmoothUV.dll;
GuavaComb(mode="Progressive", Recall=85, MaxVariation=80, Activation=30) удаление цветовых шумов, нужен цветовой формат YUY2. Используется CPU, требуется плагин GuavaComb.dll;

Изменение размера и количества кадров

Spline64Resize(720,576) # изменение размера кадра (ширина, высота), плагин не требуется, лучший из ресайзеров;
BilinearResize(720,576) # изменение размера кадра (ширина, высота), плагин не требуется;
BicubicResize(720,576) # изменение размера кадра (ширина, высота), плагин не требуется;
LanczosResize(720,576) # изменение размера кадра (ширина, высота), плагин не требуется;
Crop(2,68,-6,-68) # обрезка краёв кадра (левый, верхний, правый,нижний) в пикселях (сумма противоположных сторон должна быть кратной 4). Плагин не требуется;
AddBorders(0,10,0,10) # Добавление чёрных бортов в (слвеа, сверху, справа, снизу) в пикселях (сумма противоположных сторон должна быть кратной 4). Плагин не требуется;
BlankClip(length=50, video1, color=$000000) # Создание пустого чёрного видео с аудио дорожкой (без звука) с длительностью 50 кадров с параметрами соответствующим video1 (размер кадра, цветность, количество кадров в секунду и т.д.). Параметр «color» позволяет устанавливать цвет кадра (RGB);
ColorbarsHD(width=640, height=360) # создание надстроечной сетки (ширина, высота);
Trim(100,299) # обрезка видео и аудио, остаются только кадры с 100-го по 299-ый. Плагин не требуется;
Loop(times=14, start=12,end=12) # повтор кадра №12 14 раз (количество повторов, номер начального кадра, номер последнего кадра). Можно повторять не только один кадр, но и кусок видео;
FreezeFrame(10, 20, 9) # Замораживает кадр, т.е. заменяется кадры с 10 по 20 9-ым (повторяющимся) кадром, таким образом девятый кадр 12 раз повторится (номер начального кадра, номер последнего кадра, номер кадра заменяющего все кадры находящиеся между начальным и последним кадрами). В отличие от Loop не изменяет количество кадров, а только заменяет;
StackHorizontal(video1,video2) # располагает два и более разных клипа рядом, размер по вертикали и цветность должны быть одинаковыми;
StackVertical(video1,video2) # располагает первый клип сверху, второй снизу, размер по горизонтали и цветность должны быть одинаковыми;
StackVertical(StackHorizontal(video1, video2), StackHorizontal(video3, video4)) # комбинация двух фильтром позволяет разместить четыре видео клеткой, цветность, размеры по вертикали и горизонтали должны быть одинаковы у всех видео;
SelectEven() # Удаление каждого чётного кадра;
ConvertFPS(25) # изменение количества кадров в секунду (25 к/с);

Наложение картинки на видео

Overlay(video1, video2, mode = "subtract") # наложение второго видео на первое. mode = «subtract» — отображает только разницу;
ShowAlpha() # Включение альфаканала (прозрачных участков) на изображении или видео;
Overlay(logo, x=0, y=0, mask=logo.ShowAlpha, opacity = 1.0 ) # Наложение логотипа с прозрачностью, например, png с альфа каналом (картинка, положение по оси x, положение по оси y, маска картинки с альфа каналом, степень прозрачности наложения). Примечание* logo=ImageSource("logo.png", pixel_type="RGB32");

Вывод текста на видео

Info # выводит подробную информацию о видео;
Version () # выводит подробную информацию о Avisynth, например, версию;
ShowFrameNumber(text_color=$ff0000, x=50, y=10, size=64) # показывает номер кадра видео (цвет текста, расположение по горизонтали в пикселях, расположение по вертикали в пикселях? размер шрифта), плагин не требуется;
TextSub("subtitle.srt") # вшивание субтитра из файла в видео, требуется плагин vsfilter.dll. Поддерживаются форматы srt, ass, ssa и др.;
Subtitle("текст-в-видео \n вторая строка текста", lsp=50, font="verdana", size=14, text_color=$ffffff, align=5, y=410, x=540, spc=14, font_width=9) # вшивание текста в видео, плагин не требуется. (текст, расстояние между строками, шрифт, размер, цвет, расположение в определённом углу, расположение по оси У, расположение по оси Х, интервал между буквами, ширина букв). \n это код переноса строки, работает только при наличии параметра lsp. Параметр align игнорируется при наличии параметров y и x, если только один параметр указан (y или x), то игнорируется только он. Значение параметра align:

  1. нижний левый угол;
  2. нижний центр;
  3. нижний правый угол;
  4. левый центр;
  5. центр;
  6. правый центр;
  7. верхний левый угол;
  8. верхний центр;
  9. верхний правый угол.

Изменение цветности и яркости

ConvertToRGB32() # изменение цветности в RGB32;
ConvertToRGB24() # изменение цветности в RGB24;
ConvertToYV12() # изменение цветности в YV12;
ConvertToYUY2() # изменение цветности в YUY2;
Tweak(sat=0.8, bright=20, cont=1.3) # настройка цветности, яркости и контраста;

Спецэффекты

FadeOut2 (25) # добавление одного дополнительного кадра в конце после плавного затемнение конечных 24 кадров видео до полностью чёрного с уменьшением громкости до нуля;
FadeIO2 (25) # FadeIO + лишний кадр в начале и в конце видео;
FadeOut(25,color=color_white) # Аналог FadeOut2, но не добавляет один дополнительный кадр в конце, соответственно затемнение идёт 25 кадров, при добавлении атрибута color — изменение видео в определённый цвет, например, белый;
FadeIO(25,color=color_blue) # переход — начало видео с синего в изображение в течение 25 кадров, в конце наоборот — переход изображение в синий прямоугольник. В начале громкость нарастает, в конце — пропадает;
FadeIn(25,color=color_blue) # переход — начало видео с синего в изображение в течение 25 кадров, нарастание звука с нуля до нормальной громкости в аудио файле;
Reverse # Воспроизведение видео и аудио в обратном направлении;
Animate(0,150,"Subtitle", "Гипсовка моделей в артикулятор\nс применением лицевой дуги",-1.00,-1.00,0,1000,"arial",40.00,$FFFFFF,$0000FF,5,0,10,
\ "Гипсовка моделей в артикулятор\nс применением лицевой дуги",-1.00,-1.00,0,1000,"arial",44.00,$FFFFFF,$0000FF,5,0,10)
# специальная команда изменяющая параметры функции. Пример субтитры (первый кадр,последний кадр, «функция» (наложение субтитра), «текст субтитра»,координаты по оси Х, координаты по оси У,начало,продолжительность в кадрах,»шрифт»,размер шрифта,цвет шрифта, цвет контура шрифта, угол (от 1 до 9), интервал шрифта, многострочный шрифт (должен быть больше 0)). Остальные параметры должно в точности соответствовать последовательности в настройках каждой команды. \n означает перенос строки;

Работа с аудио

Audiodub(v,a) # склеивание видео (v) и аудио (a) дорожек, если видео уже содержит видео (v) дорожку, то оно заменяется (a);
Delayaudio(0.05) # смещение в секундах звуковой дорожки относительно видео дорожки, если знак минус, то опережение звука, без знака — отставание;
Normalize # делает громкость максимальной после сканирования всей аудио дорожки и без обрезки вершины;
TimeStretch(tempo=99.9) # изменение скорости воспроизведения звука на 0.1% (удлиняет аудио);
MixAudio(video1, audio2, 1.0, 0.4) # смешивание нескольких звуковых дорожек, аргументы 1.0 и 0.4 это громкость соответствующих дорожек;
ConvertToMono # конвертирование звука в моно (смешивание звуковых дорожек);
monotostereo(audio1,audio2) # превращение двух моно дорожек в одну стерео дорожку;
mergechannels(audio1,audio2) # аналог monotostereo, но отличается тем, что может соединять более двух дорожек;
getchannel(video,1,3) # выбор дорожек из источника (аудио или видео). Например если звук 5.1, то из шести дорожек можно выбрать только 2 дорожки. В примере выбрана первая и третья дорожки;
EnsureVBRMP3Sync() # предотвращение рассинхронизации звука при обрезке видео, если звук с переменным битрейтом;
KillAudio # удаление аудио из видео;
Tone(10.0, 440, 48000, 2, "silence", 1.0) # генератор звука. (продолжительность в секундах, частота звука, частота дискретизации, количество каналов, тип звука [«Silence» (молчание), «Sine» (синус), «Noise» (шум), «Square» (квадрат), «Triangle» (треугольник) или «Sawtooth» (зубцевидная)], уровень громкости);
ResampleAudio(48000) # изменение частоты дискретизации звука на 48 000;

Плагины VirtualDub в Avisynth

Импорт плагинов

LoadVirtualDubPlugin("msu_sharpen.vdf","MSUSmartSharpen", 0) # плагин для повышения резкости;
LoadVirtualDubPlugin ("nslf.vdf", "NSLF", 0) # Фильтр NSLF производит сглаживание одного кадра в матрице NхN без потери четкости. Влияние соседних по матрице пикселей на расчетный определяется кривой зависимостью, заданной квадратичной функцией;
LoadVirtualDubPlugin ("ccd.vdf", "CCD", 1) # Фильтр предназначен для удаления из чересстрочного видео цветного шума матриц видеокамер. Настройка по умолчанию оптимизирована для камеры canon md160;
LoadVirtualDubPlugin ("DFN.vdf", "DFN", 0) # Фильтр очистки VHS;

Использование плагинов

CCD(16,1) # удаления из чересстрочного видео цветного шума матриц видеокамер. Значение от 0 до 100, по-умолчанию=30 / 15-30 = лучший результат
DFN(67,9,1) # очистка VHS. Вариант настройки (режим просмотра шумов в VirtualDub) — 1. Порог 2 — установить в 0; 2. Порог 1 — максимальный уровень, при котором; еще нет ярко выраженных контуров объектов; 3. Порог 2 — на границу, при которой уже добавления «шумных» пикселей. Предназначен только для прогрессивного видео!
NSLF(2,1,1) # Фильтр NSLF производит сглаживание одного кадра в матрице NхN без потери четкости. Влияние соседних по матрице пикселей на расчетный определяется кривой зависимостью, заданной квадратичной функцией. Возможные параметры (0-2,0-4,0-1);
MSUSmartSharpen(4) # повышение резкости, степень повышения от 0 (минимальный) до 5 (максимальный);

Avisynth MT

SetMemoryMax(512) # используемая оперативная память, помещается в самое начала скрипта;
SetMTMode(2) # Режим работы с фильтрами (1-6):

  • Режим 1 является самым быстрым, но работает только с несколькими фильтрами;
  • Режим 2 должен работать с большинством фильтров, но использует больше памяти;
  • Режим 3 должен работать с некоторыми из фильтров, которые не работают в режиме 2, более медленный чем режим 2;
  • Режим 4 представляет собой комбинацию режима 2 и 3, должен работать с ещё большим количеством фильтров, но при этом более медленный и использует больше памяти;
  • Режим 5 должен работать со всеми фильтрами, не требующими линейной передачи кадров, но с правильной последовательностью (кадр 0,1,2 … последний)). Самый медленный (медленнее, чем если не использовать SetMTMode);
  • Режим 6 — это усовершенствованный, более быстрый режим 5.

Для каждого фильтра можно использовать свой режим работы.