在 ffmpeg 中过滤器图的排序方式重要吗?

在 ffmpeg 中过滤器图的排序方式重要吗?

我最近创建了一个 ffmpeg 脚本,该脚本包含两组各三个视频,首先按组一起运行它们,然后垂直堆叠它们,同时仅保留第一组的音频。

filtergraph 的流程如下:

  1. concat过滤器 - 同时运行输入 1 到 3,包括音频
  2. scale过滤器-缩小上述连接
  3. concat过滤器 - 将输入 4 到 6 一起运行,不包括音频
  4. scale过滤器-缩小上述连接
  5. vstack过滤器-垂直堆叠步骤 2 和 4 的视频输出。
  6. 映射步骤五中的视频和步骤一中的音频。

它确实有效,我对结果很满意。我还没有试验过,但我想知道如果我重新排序过滤器,是否会对性能产生任何影响,例如减少内存或 CPU,甚至渲染速度更快。如果我做了以下事情,会有帮助吗?:

  1. vstack过滤器 - 垂直堆叠输入 1 和 4,仅保留来自 1 的音频。
  2. vstack过滤器 - 垂直堆叠输入 2 和 5,仅保留来自 2 的音频。
  3. vstack过滤器 - 垂直堆叠输入 3 和 6,仅保留来自 3 的音频。
  4. concat过滤器-同时运行步骤 1 至 3 的视频输出。
  5. scale过滤器 - 缩小连接上方的尺寸
  6. 从步骤 4 映射视频和音频。

是否存在我们应该预期不同过滤器顺序会影响性能的情况?


这是我的精确过滤图:

-filter_complex "\
[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[spvid][a];\
[spvid]scale=640:-1,setsar=1[top];\
[3:v][4:v][5:v]concat=n=3:v=1:a=0[slvid];\
[slvid]scale=640:-1,setsar=1[bottom];\
[top][bottom]vstack=inputs=2[outv]" \
-map "[outv]" -map "[a]"

答案1

是的,过滤器图的排序很重要。涉及较少计算或内存操作的过滤器图将更快。

更改分辨率或像素格式的视频滤镜或任何无法就地修改帧的操作都需要生成新帧并计算新像素值,因此需要更多时间。像 concat 这样的滤镜会从多个来源接收帧并简单地更改时间戳,因此需要的时间更少。根据经验,并行执行此类操作,并序列化更昂贵的操作,但是必须分析特定的滤镜图才能确定这是否成立。

我测试了您当前的过滤器图与建议的过滤器图,当前的过滤器图在 3 次试验中快了约 10%。我怀疑是因为并行 vstacks 可能会延迟将帧馈送到 concat 过滤器。

相关内容