3

当 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()

错误消息是:无法检索输出节点。指定的索引无效?

4

2 回答 2

2

很抱歉这个迟到的答案,但我认为这需要解决:

__name__变量通常包含"__main__"脚本何时是 Python 解释器的主要目标,例如当它从命令行调用时。

但是,由于未记录而鲜为人知:当 vspipe 或任何其他基于 vsscript 的应用程序运行您的脚本时,字符串"__vapoursynth__"存储在__name__.

因此,您的支票应该是这样的:

if __name__ == "__vapoursynth__":
   clip = main()
   clip.set_output()
于 2017-07-10T13:19:59.880 回答
0

如果您的VapourSynth脚本没有使用输入视频文件名进行参数化,即输入文件名在您的脚本中被硬编码,例如在语句中

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

您可以直接编写整个脚本-

没有定义main()函数(示例代码的第一行)
和最后的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
于 2017-04-14T20:46:17.943 回答