Выходные узлы Vapoursynth в основной функции (argv) Python с использованием vspipe

Когда vspipe вызывает основную программу на Python, как нам настроить выходной узел?

Следующее не работает:

def main(argv):
   ...
   ... 
   vapoursynth code
   ...
   clip.set_output()

if __name__ == "__main__":
   main(sys.argv[1:])

Ни один не делает это:

....
if __name__ == "__main__":
   clip = main(sys.argv[1:])
   clip.set_output()

Сообщение об ошибке: не удалось получить выходной узел. Указан неверный индекс?

2 ответа

Извините за этот поздний ответ, но я думаю, что это необходимо решить:

__name__ переменная обычно содержит "__main__" когда скрипт является главной целью интерпретатора Python, например, когда он вызывается из командной строки.

Однако менее известен, потому что недокументирован: когда vspipe или любое другое приложение на основе vsscript запускает ваш скрипт, строка "__vapoursynth__" хранится внутри __name__,

Поэтому ваш чек должен быть таким:

if __name__ == "__vapoursynth__":
   clip = main()
   clip.set_output()

Если твой VapourSynth сценарий не параметризован с именем входного видеофайла, т.е. имя входного файла жестко запрограммировано в вашем сценарии, например, в операторе

video = core.ffms2.Source("InputVideo.mkv")

Вы можете напрямую написать весь сценарий -

(без определения main() функция (1-я строка вашего примера кода)
и if блок в конце)

- или же -

заменить их на

def main():

в начале и

if __name__ == "__main__":
    main()

в конце.

Вы можете рассмотреть vspipe как специализированный Python переводчик, так что он знает (из вашей команды clip.set_output()) какое видео передать, например в команде

vspipe -y -p  your_script.vpy - |  ffmpeg -i -  output.mp4

или из какого видео выводится несжатое видео, например в команде

vspipe -y -p  your_script.vpy  uncompressed_output.y4m
Другие вопросы по тегам