Создание нескольких видео с Avisynth

У меня есть куча отдельных файлов, которые я хочу, чтобы каждый запускался через Avisynth. Однако файл AVS может создавать только одно видео. Насколько я знаю, нет способа объявить значение переменной из командной строки.

Я знаю, что вы, вероятно, можете создать скрипт, который генерирует кучу файлов AVS, а затем каким-то образом конвертировать каждый файл AVS в видео. Однако, поскольку Avisynth является системой сценариев, это кажется довольно сложным. Должен быть какой-то способ запустить разные видео через скрипт, верно?

Каков наилучший способ сделать это? Заранее спасибо.

2 ответа

Решение

Я никогда не находил способ передать параметр командной строки непосредственно в скрипт AVS. Создание сценариев на лету - единственный способ заставить его работать.

Я знаю, что это не тот ответ, который вы ищете, тем не менее, существует два подхода к созданию сценариев:

Шаблонный скрипт

Я использую это, когда у меня есть сценарий AVS, где единственный параметр, который изменяется, является исходным входным файлом.

У меня есть сценарий template.avs которая ожидает переменную (v) содержащий полный путь к исходному видео. Затем пакетный скрипт просто добавляет строку с переменной для каждого видеофайла, как показано ниже:

@echo off
if "%1" == "" (
    echo No input video found
    pause
    GOTO :EOF
)
set pth=%~dp0

:loop
IF "%1"=="" GOTO :EOF

echo v="%1">"%pth%_tmp.avs"
type "%pth%template.avs">>"%pth%_tmp.avs"

:: Do whatever you want with the script
:: I use virtualdub...
"%vdub%" /i "%pth%Template.vdscript" "%pth%_tmp.avs"

del "%pth%_tmp"

SHIFT
GOTO loop

Это позволяет мне просто перетаскивать несколько исходных видео в пакет.

Импортировать

Используя инструкцию Import, можно вывести все объявления переменных в свой собственный скрипт.

Import("variables.avs")

Это полезно, когда шаблонный скрипт AVS ожидает нескольких переменных.

Кажется, что каждый сценарий AviSynth представляет собой отдельное видео.

Чтобы обойти это (аналогично ответу марапета), я также разработал .BAT файл, с помощью которого вы можете перетаскивать видеофайлы на него, и для каждого создается файл AVS, а путь к видео автоматически вставляется.

Я думаю, что это немного более гибко, поскольку в сценарии используются заполнители. Он также может при желании запускать ffmpeg (или любую другую команду, которую вы предпочитаете) для каждого из них, чтобы отобразить и закодировать окончательный результат.

Инструкции по установке

  1. Сохраните следующий скрипт как .BAT файл
  2. Создайте подпапку под .BAT называется AviSynth Templates
  3. Создайте свой основной сценарий AVS (например, master.avs) в этой подпапке и используйте заполнитель [CLIP]везде, где вы хотите, чтобы путь видео был введен. (Вы также можете использовать[CLIP-NO-EXTENSION] чтобы исключить расширение файла, если у вас есть дополнительные ресурсы, связанные с этим видео.)

    AviSource("[CLIP]")
    # ...do more tasks here...
    
  4. Перетащите видеофайлы на свой BAT, чтобы создать индивидуальный файл AVS для каждого из них. Если вы снова сбросите те же видеофайлы на BAT, AVS будет перезаписан новой версией.

Create AVS files.bat

@ECHO OFF

:: INSTRUCTIONS:
:: 1. Create an AviSynth script 
:: 2. Use [CLIP] and/or [CLIP-NO-EXTENSION] as placeholders in the script. 
::    [CLIP-NO-EXTENSION] will exclude the file-extension in case you want to use it for including subtitles or other files that use the same base name.
::    e.g. AviSource("[CLIP]")
:: 3. Place the master .avs script in a folder called "AviSynth Templates", immediately beneath the folder containing this .BAT
:: 4. Drag and drop video files onto this BAT and each will be given an AVS file with the same name (video1.avi.avs will be created for video1.avi)
::    The placeholders will be filled in with the full absolute path of the dropped files.

SET TemplateName=master.avs
SET TemplatePath=%~dp0AviSynth Templates\%TemplateName%

echo Creating AVS scripts from master template %TemplatePath%...

:: Loop through every file dropped onto the .BAT
FOR %%A IN (%*) DO (

    REM :: Here we create a .AVS file for each video dropped onto the bat
    REM :: We read in the master script, replace the placeholders and then write the output to a text file using the video's filename and .avs extension
    REM ::
    REM ::    %%A - this contains the full path to the video file, including surrounding double-quotes
    REM ::    %%~A - this contains the full path to the video file, without surrounding double-quotes
    REM ::    %%~dpnA - this contains the full path to the video file, with drive, path and name (dpn) but no file extension (without quotes)
    echo Creating "%%~A.avs"
    powershell -Command "(Get-Content '%TemplatePath%').replace('[CLIP]', '%%~A').replace('[CLIP-NO-EXTENSION]', '%%~dpnA') | Out-File -encoding ASCII '%%~A.avs'"

    REM :: If you want to then run ffmpeg to render and transcode the AVS file you could run it here
    REM :: e.g. ffmpeg -i "%%~A.avs" "%%~dpnA.h264.mp4"

)

ECHO.
ECHO Script creation finished.
ECHO.

PAUSE

Еще один ответ на этот вопрос - позволить скрипту AviSynth получить собственное имя, указывающее файл, который вы хотите обработать. Если вы хотите, чтобы скрипт работал movie.mp4Вы можете переименовать его в movie.mp4.avs, Сценарий будет что-то вроде:

function GetVideoName()
{
    Try
    {
        assert(false)
    }
    Catch(err_msg)
    {
        err_msg = MidStr(err_msg, FindStr(err_msg, "(") + 1)
        filename = LeftStr(err_msg, StrLen(err_msg) - FindStr(RevStr(err_msg), "."))
        return filename
    }
}

video_to_process=GetVideoName()
#return BlankClip(color=$000000, pixel_type="RGB24").Subtitle("You would process the video [" + video_to_process + "]")
DirectShowSource(video_to_process, convertfps=true)

Вы можете выполнять одни и те же операции с разными видео, просто переименовав скрипт (при условии, что видео и .avs находятся в одной папке). Раскомментируйте следующую за последней строкой, чтобы понять, что я имею в виду.

Другие вопросы по тегам