Выходные узлы 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