Avisynth 总帧数不等于 VirtualDub 总帧数

Avisynth total frames does not equal VirtualDub total frames

Dissolve and/or Fade 似乎改变了 .avs 脚本中的总帧数。当我将 avs 脚本中的总帧数相加,然后在 Vdub 中加载 avs 脚本时,总帧数是不同的。我下面的真实世界示例显示了相同脚本的 822 帧与 1368 帧 的差异。我有 运行 一些似乎支持这个假设的基本测试。当然我可能在做一些愚蠢的事情。任何指导将不胜感激。如果我能澄清任何事情,请告诉我。 Ffmpeg 也对相同的脚本感到困惑,这让我认为这是一个 Avisynth 问题。或者我缺乏 avs 编码技能。

系统规格: Win7, FFmpeg 版本:20170223-dcd3418 win32 共享, AVISynth 版本:2.6

Test1.avs = 200 帧 长 = 预期行为

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
video = v1 + v2
return video

Test2.avs with return Dissolve = 195 frames long = 意外行为

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
return Dissolve(v1, v2, 5)

Test3.avs with fadeOut(fadeIn = 202 frames long = 意外行为

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
fadeOut(fadeIn(v1 + v2, 60), 60)

Test4.avs 溶解和淡入淡出 = 197 帧 长 = 意外行为

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
v3 = Dissolve(v1, v2, 5)
fadeOut(fadeIn(v3, 60), 60)

Test5.avs 明确指定溶解和淡入淡出的帧速率 = 197 帧 = 意外行为

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
v3 = Dissolve(v1, v2, 5, 24)
fadeOut(fadeIn(v3, 60, [=14=]0000, 24), 60, [=14=]0000, 24)

realExample = 822 帧 long = 预期行为(这就是我想要的)

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24).trim(1,106)
v3=ImageReader("3.png", fps=24).trim(1,471)
v9=ImageReader("9.png", fps=24).trim(1,58)
v10=ImageReader("10.png", fps=24).trim(1,35)
v11=ImageReader("11.png", fps=24).trim(1,152)
video = v1 + v3 + v9 + v10 + v11
return video

realExample = 1368 帧

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24).trim(1,106)
v3=ImageReader("3.png", fps=24).trim(1,471)
v9=ImageReader("9.png", fps=24).trim(1,58)
v10=ImageReader("10.png", fps=24).trim(1,35)
v11=ImageReader("11.png", fps=24).trim(1,152)
d1 = Dissolve(v1, v3, 5)
d3 = Dissolve(v3, v9, 5)
d9 = Dissolve(v9, v10, 5)
d10 = Dissolve(v10, v11, 5)
fadeOut(fadeIn(d1 + d3 + d9 + d10,60),60)

你说你的一些结果给出了 "unexpected behavior",但你没有具体说明你的预期是什么,所以不清楚你认为错误的地方以及你的误解在哪里。 (在讨论问题时,您应该始终说明您得到了什么结果以及您期望得到什么结果。)

在您的 Dissolve 示例 (Test2.avs) 中,您说 195 帧是意外的,但这对我来说是正确的。 "Dissolving" 两个片段在一起意味着一个片段的结尾与第二个片段的开头重叠,一个片段逐渐淡入另一个片段;这与淡出第一个剪辑然后淡入第二个剪辑不同。重叠意味着结果 必须 短于剪辑的各个长度之和。您组合了两个 100 帧的剪辑并指定了 5 帧重叠,因此 100 + 100 - 5 = 195。

在您的 FadeOut 示例 (Test3.avs) 中,您说 202 帧是意外的,但这对我来说也是正确的。 FadeIn/FadeOut 状态的文档:

An additional color frame is added at the start/end, thus increasing the total frame count by one (or for FadeIO, by two).

由于您在 test3.avs 中对 FadeIn 进行了一次调用并对 FadeOut 进行了一次调用,因此添加了两个额外的帧。如果您不想要这个,那么您可以使用 FadeIn0/FadeOut0(或 FadeIO0,因为您正在使用两者),但请注意,对于这些函数,first/last框架不会完全是黑色的。如果你想要精确,那么在使用正常的 FadeIn/FadeOut/FadeIO 函数之前,只需 trim 关闭第一个 and/or 最后帧。

您的 "real examples" 正在将苹果与橙子进行比较。带有 Dissolve 的版本显着增加了帧数,因为它将相同的剪辑组合 多次 :

d1 = Dissolve(v1, v3, 5)
d3 = Dissolve(v3, v9, 5)
...
fadeOut(fadeIn(d1 + d3 + d9 + d10,60),60)

d1d3 每个 包含 v3 剪辑的副本,然后拼接 d1d3 放在最后,意味着 v3 被包含了两次。 (v9v10 也是如此。)

您可能打算做类似的事情:

video = Dissolve(v1, v3, 5)
video = Dissolve(video, v9, 5)
video = Dissolve(video, v10, 5)
video = Dissolve(video, v11, 5)
video = FadeOut(FadeIn(video, 60), 60)

或更简洁:

video = FadeIO(Dissolve(v1, v3, v9, v10, v11, 5), 60)

结果应为 804 帧长:(来自原始剪辑的 822 帧)-(4 个溶解点)*(每次溶解 5 帧重叠)​​+(来自 FadeIO 的 2 帧)。

如果您真的想通过淡出然后淡入来组合剪辑,那么您可以通过执行以下操作来保留原始帧数:

video =   FadeIO0(v1, 60) \
        + FadeIO0(v3, 60) \
        + FadeIO0(v9, 60) \
        + FadeIO0(v10, 60) \
        + FadeIO0(v11, 60)