AviSynth — свободно распространяемая программа с открытым кодом, предназначенная для обработки видеоматериалов, в частности линейного и нелинейного монтажа.Простыми словами - мощный инструмент с множеством фильтров, которые в большинстве случаев доступны только в коммерческих продуктах, занимаемых много места на жестком диске. Использование этого инструмента не очень удобное, но результаты зачастую того стоят. Я решил использовать AviSynth из-за того, что он оказался самым простым вариантом для увеличения частоты кадров путем интерполяции, подобный метод есть в "Adobe After Effects" и в "Adobe Media Encoder", начиная с версии CS6, но это слишком тяжеловесный софт, да и настроек в нем маловато. Потом оказалось, что дефекты некоторых чересстрочных видео смог устранить только фильтр QTGMC, никакой другой, даже коммерческий исправить фильтр дефект не смог. Для удобства использования я сделал скрипт, который делает avs-скрипты по шаблону для отдельного файла или для директории. Эти скрипты можно открыть с помощью "FFMPEG" и в том числе пакетно сконвертировать в стандартный видеофайл.
Скрипт с плагинами - в прикрпленном файле avisynth.png (нужно открыть архиватором и распаковать). Для начала нужно установить сам AviSynth: https://github.com/pinterf/AviSynthPlus/releases/download/r2772-MT/AviSynthPlus-MT-r2772-with-vc_redist.exe . Проверить его можно путем создания файла "test.avs" со строкой: Version() , затем перетащить этот файл в плеер и если AviSynth установился правильно, то будет показана его версия. В распакованную директорию со скриптами нужно добавить бинарник "FFMPEG.EXE": https://ffmpeg.zeranoe.com/builds/ , если он не установлен в системе.Теперь нужно просто перетянуть видео файл (AVI, MP4) на скрипт "generate-avs.bat" и нажать ENTER. В директории GENERATED_SCRIPTS должен появится скрипт "название_видео_файла.avs". Затем нужно запустить скрипт "encode.bat", нажать ENTER и начнется кодировка в видео файл в директорию со скриптами с шаблоном по умолчанию для увеличения частоты кадров путем интерполяции.
Почему не VapourSynth? Я просто новичок, мне интересно с какого фреймворка желательно начать изучение?
>>2534197Под VapourSynth есть далеко не все плагины, которые писались только под AviSynth (NNEDI3, EEDI3, InterFrame).
>>2534195> в прикрпленном файле avisynth.pngА где сам прикреплённый файл? Поделись ссылкой на команды для скриптов AviSynth, можно на английском.
>>2534984AvxSynth сильно урезан. Тут, уж, лучше сразу VapourSynth пользовать. Или таки AviSynth+ под wine.>>2535002Скриптовый нелинейный видеоредактор. Нуфф сказал. Была бы под него нормальная IDE, был бы годнотой. Лютейшей годнотой. А в том виде, в котором есть с девяностых, оно употребимо только очень частно. Хотя я использую AviSynth как единственную NLE с этого вашего 1999 года. Но я и не клипы ваяю и не видеоблохер.
Как сделать ресайз, чтобы разрешение, допустим, по высоте? В ffmpeg, это делается одной командой - scale=640:-1, а как тут?И почему местная cut-команда, может вырезать только по кадрам(опция trim(100,200), а если я хочу по таймингу, как в ffmpeg(-ss 00:20 -to 00:30)?
>>2535332Когда был школьником-студентом в 90-е и первой половине нулевых, рипал фильмы и аниме, оцифровывал и сводил любительские съёмки (репортажка; преимущественно детские праздники, прогулки и бытовуха) своих друзей и родственников. Там тоже есть всякое разное, от обратного телекино и реставрации, до авторинга DVD и сведения с титрами. Никогда никакой художки, т. к. не умею и не претендую — чисто техническая работа.В настоящее время очень плотно работаю по специальности (радиоинженерю) в интересах силовиков. Работа такая, что не заскучаешь. Одно время хотел видео кодеры с компенсацией движения исследовать, но сколько раз не принимался — так и бросал из-за работы.>>2535264> Как сделать ресайз, чтобы разрешение, допустим, по высоте? В ffmpeg, это делается одной командой - scale=640:-1, а как тут?Насколько помню, в Avisynth функции *resize() не допускают подобной нотации, и нужно выходной размер растра указывать явно. Но это не так критично, как невозможность указывать математические выражения и ссылаться на числовые переменные при записи аргументов функций.В функциях современного VapourSynth тоже указывать нужно явно, но там в основе Python, так что с математикой там без проблем.> И почему местная cut-команда, может вырезать только по кадрам(опция trim(100,200), а если я хочу по таймингу, как в ffmpeg(-ss 00:20 -to 00:30)?Очевидно, чтобы не играть в эти игры с PTS и не проигрывать. FFmpeg вынужден работать с PTS, т. к. он работает с готовым к просмотру видео, а фреймсерверы могут и абстрагироваться от PTS и править видеоряд как дискретное множество данных безотносительно временных меток. Просто удобнее работать с видеорядом непосредственно, а время смены кадра — это дополнительная абстракция.
Вы хоть отпишитесь, скрипты норм работают? А то долго мне пришлось допиливать, чтоб нормально воспринимались и файлы и директории.
>>2536338> do ffmpeg -i "a" -b:v 3M -an "%OUTPUT_DIRECTORY%~na-ENCODED.mp4"Ну, хз. Можно было бы и получше команду для кодирования поставить. А почему без звука?Кстати, подскажи, как сделать простой батник, который бы просто запускал ffmpeg, потом .avs файл, а потом кодировал бы все в output файл. Как у тебя в батнике, но проще.Я просто не сильно разбираюсь в программировании.
>>2536630> А почему без звука?Это я для себя выставлял, чтоб использовать модуль MPEG2Source для обработки контента с DVD, он предназначен только для видео. Убери параметр -an и будет со звуком.> Кстати, подскажи, как сделать простой батник, который бы просто запускал ffmpeg, потом .avs файл, а потом кодировал бы все в output файл. Как у тебя в батнике, но проще.Делать все одним скриптом не стоит. Лучше сгенерить avs-скрипты, а потом уже подгонять видео, проигрывая avs-скрипт в ffplay или каком-то плеере. AviSynth херит "Aspect Ratio", если оно было указано в контейнере, все равно его вручную надо выставлять. Если видео скачано с какого-то онлайн-сервиса, то этой проблемы не будет. Добавил скрипт в пикрелейтед, который генерит .avs, кодирует видео с помощью FFMPEG и удаляет .avs. Его нужно добавить в директорию к остальным скриптам. Нужно просто перетянуть на его видеофайл, нажать ENTER и он начнет кодировать видео. Проверь, работает у тебя или нет?
>>2536696Есть возможность запустить под VapourSynth QTGMC, не говоря уже о плагиных без открытых исходников?
>>2536931Работает, вроде. И тот, что в шапке. Но хотелось бы узнать, что написать в батнике, чтобы при его открытие(батника), запускался бы ffmpeg, который бы выбирал мой avs скрипт, и делал двухпроходное кодирование видео, потом кодирование звука, а потом все это выводил в выходной файл. Типа, как я думаю:ffmpeg -i "ссылка на мой avs.скрипт" (первый проход без звука)(второй проход без звука)(кодирование звука без видео)(объёдинение в выходной файл) out.mp4Параметры проходов, кодирования звука я поставлю сам, мне просто нужен пример.Объяснил, как ртом.
>>2536956generate-avs-encode-two-pass.bat: берет звук с .avs, работает с аудио-видео модулями.generate-avs-encode-two-pass-mux.bat: берет звук с исходного файла, конвертирует его в отдельный файл, затем объединяет с видео.
>>2536984Хорошо, что добавили фильтр. Когда-то ждал его. Но с настройками по умолчанию он работает хуже, чем SVPFlow.
>>2536996Вот клип https://my-files.ru/zsfrfk там творятся темные чересстрочные чудеса. Мне бы рецепт как его излечить от чересстрочности.
>>2536782> QTGMCЗа восемь лет это и многое самое популярное портировано. Плюс, есть кое-какая двоичная совместимость.
>>2536956Что я делаю не так, что батник не запускается? Где ошибка?@echo offSET "INPUT_DIRECTORY=c:\User\ffmpeg-20190403-ee16d14-win64-static\bin\"SET "FFMPEG_PARAMETERS_PASS-1=-c:v libvpx -pix_fmt yuv420p -speed 0 -qmin 0 -qmax 20 -b:v 1M -tile-columns 1 -row-mt 1 -auto-alt-ref 1 -an -sn -dn -pass 1 -f webm NUL"SET "FFMPEG_PARAMETERS_PASS-2=-c:v libvpx -pix_fmt yuv420p -speed 0 -qmin 0 -qmax 20 -b:v 1M -tile-columns 1 -row-mt 1 -auto-alt-ref 1 -an -sn -dn -pass 2 -f webm pass2.webm"PUSHD %~dp0for a in ("%INPUT_DIRECTORY%.avs") do ^ffmpeg -i "a" "%FFMPEG_PARAMETERS_PASS-1%" & ^ffmpeg -i "%%a" "%FFMPEG_PARAMETERS_PASS-2%" & ^del ffmpeg2pass-0.log & ^Файл .avs находиться в той же директории, где и батник.
>>2537064>SET "Что ты мучаешься с батниками? Пиши на lua, у него интерпретатор крошечный и синтаксис приемлемый.
>>2537064И если хочешь, чтоб все было в одной директории, то нужно менять и пути к плагинам в TEMPLATE-1.txt.
>>2537199Нет, ты все пытаешься написать код, основываясь на твоём batнике, с вопросом о выборе типа файла и прочее. Я же пытаюсь, на основе твоих команд сделать свой батник, в котором уже прописан путь к моему avs. Вот, например, @echo off -типа, я понял, это не показывать команды в командной строкеSET "INPUT_DIRECTORY=c:\User\ffmpeg-20190403-ee16d14-win64-static\bin\" - это я понял, переменная, которая указывает путь для входной директории(опять же, что указывать файл или папку?SET "FFMPEG_PARAMETERS_PASS-1=-c:v libvpx -pix_fm бла-бла-бла - это переменная первого прохода(да?), ниже - для второго прохода .PUSHD %~dp0 - что это я не понял.for a in ("%INPUT_DIRECTORY%.avs") do ^ffmpeg -i "a" "%FFMPEG_PARAMETERS_PASS-1%" & ^ - типа, выполнить "ffmpeg -i ПУТЬкAVS ПЕРЕМЕННАЯ1ПРОХОДА (да?), а что такое ("а")?Повторюсь, я в программирование полный ноль.
>>2537247В этом посте >>2537187 я приложил скрипт без вопросов. Просто на него перетягивается видеофайл или папка с видеофайлами и начинается обработка.INPUT_DIRECTORY - входной файл или директория с файлом .avs, определяется далее и в зависимости от значения переменная меняется - для файла - file.ext, для директории - directory/. Если файл или папка перетягивается на скрипт, то становится INPUT_DIRECTORY. Можно убрать вторую часть скрипта и указывать вручную, но зачем? Я уже удалил все вопросы и оставил только возможность перетащить файл/папку на скрипт начинается обработка. PUSHD %~dp0 - установить текущей директорией директорию, где находится скрипт.> а что такое ("а")?Это переменная от выполнения "for %a", в которой записан сканируемый исходный файл или список файлов в директории.FFMPEG лучше прописать в системную переменную PATH в винде, чтоб всегда был доступен.Еще один скрпит с путем к FFMPEG в пикрилейтед.
>>2537344Работает, да,но..Типа, кодирует, применяя фильтры интерполяции, которые берет из сгенерированого .avs. А зачем "генерить" avs, чтобы потом его "автоматом" удалить? И потом, хотелось бы просто перетащить файл, запустить двухпроходное кодирование, которое бы подцепляло мой avs файл, предварительно расположенный в этой же папке, где и batник. ВоТъ..
>>2537376А, или можно просто заменить содержимое двух (кстати, почему два файла?) TEMPLATE.txt файлов, записав туда нужные команды для avs, которое генерит твой батник.. Хм.
>>2537382Так это и есть главная особенность скрипта. Пришлось разбить на две части, чтоб быстрее происходила обработка. Работает так: Перенаправление первой части в скрипт > добавление модуля с именем файла > добавление второй части. Файл в скрипте должен указываться после загрузки всех плагинов, но до функций.
>>2537384>>2537386Нет, правда, спасибо, что помогаешь дуракам с Двачей..А вот это %%~na., это имя выходного файла? А расскажи, что эти символы означают?
>>2537394Открываешь cmd.exe > for /?. Там все расписано: Операции подстановки ссылок на переменные команды FORтакже расширены. Допускается применение следующихсинтаксических конструкций: %~I - из переменной %I удаляются обрамляющие кавычки (") %~fI - переменная %I расширяется до полного имени файла %~dI - из переменной %I выделяется только имя диска %~pI - из переменной %I выделяется только путь к файлу %~nI - из переменной %I выделяется только имя файла %~xI - из переменной %I выделяется расширение имени файла %~sI - полученный путь содержит только короткие имена %~aI - переменная %I расширяется до атрибутов файла %~tI - переменная %I расширяется до даты /времени файла %~zI - переменная %I расширяется до размера файла %~$ПУТЬ:I - проводится поиск по каталогам, заданным в переменной среды ПУТЬ, и переменная %I заменяется на полное имя первого найденного файла. Если переменная ПУТЬ не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку.
>>2537477Разумеется.Функция trim() возвращает переменную типа clip, значение которой можно присвоить поименованной переменной. Значение последнего определённого клипа хранится в специальной переменной last. Ключевое слово return принимает выражение, которое при выполнении должно вернуть тот самый клип, который весь скрипт даст на выход. Вот пример (cкрипт вернёт соединённые clip_a и clip_b, наложенные с прозрачностью 50% поверх clip_c):clip_l = lastclip_a = clip_l.trim(100, 200)clip_b = clip_l.trim(500, 600)clip_c = clip_l.trim(800, 1000)return clip_c.Overlay(clip_a ++ clip_b, opacity=0.5, ignore_conditional=true, pc_range=true)
>>2537541А как мне вырезать два отрезка из видео, вставить между ними "затухание"(FadeIO2), а потом объединить в выходное видео?clip1 = Trim(2523, 4007)clip2 = Trim(6180, 6732)clip3 = FadeIO2(clip1, clip2, 95)это не работает, в чем ошибка?
>>2537696В FFMPEG есть далеко не все фильтры. Я бы очень хотел, чтоб все фильтры AviSynth были кроссплатформенными и доступными в FFMPEG. А нормально портировали в FFMPEG, начиная с 2010 года, только фильтры от MPlayer и еще некоторые. Не дождавшись, пришлось разбираться с AviSynth.
>>2537773Ошибка синтаксическая у тебя.Идём и смотрим http://avisynth.nl/index.php/TrimСинтаксис такой:Trim(clip, int first_frame, int last_frame [, bool pad] )Т. е. функция принимает как минимум три аргумента:- clip — имя переменной исходного видеоряда;- first_frame — целочисленное значение номера первого кадра;- last_frame — целочисленное значение номера последнего кадра.В моём примере в >>2537541 используется постфиксная (объектная) нотация. Форма записи, при которой опускается первый аргумент, а в качестве первого аргумента при вызове функции используется видеоряд, возвращаемый выражением, написанным до точки. Т. е. оператор «.» (точка) работает слева направо (исходное значение слева, функция-обработчик указывается справа и результат будет передан вправо до конца строки), а оператор «=» (присвоение, определение) — справа налево (выражение справа от оператора и до конца строки будет полностью вычислено, а результат будет передан в переменную слева от оператора).Такая форма записи нужна для компактного человекочитаемого способа изложения сценария, чтобы не теряться во вложенных скобках. Также форма такая очень полезна для записи выражения в несколько строк. Например (две последние строчки из >>2537541можно записать так):(см. пикрел)
>>2534195Как заэнкодить без потери качества? Мне после интерполяции ещё обрабатывать и эффекты накладывать надо.
>>2571642Сам спросил, сам нашёл. В encode.bat нужно так строчку изменитьdo ffmpeg -i "a" -c:v huffyuv "%OUTPUT_DIRECTORY%~na-ENCODED.avi"Если сравнивать с Adobe After Effects (с параметрами по умолчанию), то у AVISYNTH в среднем картинка чётче, но артефактов больше, иногда сильно зернистые промежуточные кадры получаются. Как, что и где можно подкрутить, чтобы улучшить результат?