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

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

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

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


person Ian Macalinao    schedule 29.01.2014    source источник


Ответы (3)


Я так и не нашел способа передать параметр командной строки напрямую в сценарий 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 ожидает несколько переменных.

person marapet    schedule 29.01.2014
comment
Спасибо, в итоге я написал скрипт Python, чтобы сделать что-то очень похожее на это. - person Ian Macalinao; 30.01.2014
comment
не забудьте объявить глобальную переменную, если она используется в какой-либо функции вашего основного скрипта avisynth - person NeronLeVelu; 24.02.2016

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

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

Генератор сценариев AviSynth

Я думаю, что это немного более гибко, поскольку в сценарии используются заполнители. Он также может дополнительно запускать 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
person Simon East    schedule 24.09.2019
comment
Не уверен, почему я получил отрицательный голос. ???? Приятно получать отзывы о сценарии. - person Simon East; 24.09.2019

Другим ответом на этот вопрос было бы позволить сценарию 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 находятся в одной папке). Раскомментируйте предпоследнюю строку, чтобы понять, что я имею в виду.

person cdlvcdlv    schedule 20.07.2018