![AviSynth ChangeFPS:组合不同帧速率的视频](https://linux22.com/image/1309547/AviSynth%20ChangeFPS%EF%BC%9A%E7%BB%84%E5%90%88%E4%B8%8D%E5%90%8C%E5%B8%A7%E9%80%9F%E7%8E%87%E7%9A%84%E8%A7%86%E9%A2%91.png)
我有两个相同场景的视频录制,但帧速率不同,我想使用 AviSynth 脚本将它们合并。一个视频以 30fps 录制,另一个以 120fps 录制。我想要做的是让它们在时间上保持同步,这意味着对于 30fps 视频的每一帧,输出应该显示 120fps 视频的 4 帧。我希望最终输出的视频以 30fps 播放,这样持续时间是原始录制的 4 倍。
从 AviSynth 的文档来看,这似乎ChangeFPS
是我需要的功能,因为它会删除和复制帧,而“AssumeFPS”只会更改播放速度(我的计划基本上是将 30fps 剪辑的每一帧速度提高四倍)。但是,该过滤器似乎并没有按照其说明执行。
如果我尝试:
clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")
它根本不影响 30fps 剪辑的播放速度或帧数,但会从 120fps 剪辑中删除每四帧,这根本不是我想要的。不幸的是,将 .ChangeFPS(7.5) 附加到 clip120 不会产生相同的反向效果 - 在这种情况下,它确实达到了预期的效果。或者,如果我尝试:
clip30 = AviSource("0326.avi").AssumeFPS(7.5)
clip120 = AviSource("0326-120fps.avi")
根本没有任何效果,两个片段都以 30fps 播放,这意味着当 30fps 片段结束时,只显示了 120fps 片段的四分之一。
那么我该如何以我想要的方式组合这两个剪辑呢?我找不到任何其他可以帮助我做到这一点的内部或外部过滤器。在我看来,如果按照ChangeFPS
手册所说的去做,这将是适合这项工作的。
答案1
我已经通过使用问题中的第一个片段(将 30fps 剪辑的帧速率更改为 120fps)解决了我的问题,然后还通过AssumeFPS(30)
将该函数附加到我使用的最后一个过滤器的末尾来设置最终的组合视频。例如:
clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")
StackHorizontal(clip30, clip120).AssumeFPS(30)
效果很好。我现在有一段视频,其时长为 120fps 剪辑,速度为 30fps(原始录制时长的四倍),并且 30fps 的每一帧都翻了四倍,正如我想要的那样。
不过,我不太清楚为什么AssumeFPS(30)
需要 final,因为没有它,我得到的剪辑也是 30fps。我在 AviDemux 中逐帧检查了输出,如果没有对 的最终调用AssumeFPS
, 的帧数clip30
就不会像应该的那样增加四倍。