有没有办法在 ffmpeg 中使用 crop/scale 作为身份过滤器(即绕过)?

有没有办法在 ffmpeg 中使用 crop/scale 作为身份过滤器(即绕过)?

我使用 ffmpeg-python 来构建和维护一个相对复杂的过滤器链,它可能(但不总是)需要包含缩放和裁剪过滤器(可能每种过滤器不止一个)。

我当前的代码有很多 if/then/else 逻辑,它们查看从用户传递的参数,然后根据参数将这些过滤节点插入链中或不插入。

如果我可以将所有可能的过滤器保留在链中,但以某种方式向它们传递参数使它们充当身份过滤器,那么代码将更加干净且更易于维护 - 这意味着它们只是将输入直接传递到输出而不实际执行任何操作。

这是在这些过滤器中以某种方式实现的吗?例如,如果我运行带有参数(x=0、y=0、h=in_h、w=in_w)的裁剪过滤器,这应该会使输出与输入相同,但我不清楚这是否是真正的绕过(意味着我不花费周期/精力)或者我们是否实际上以某种方式裁剪了帧。

同样的问题也适用于比例过滤器:如果我输入比例过滤器参数,导致输出尺寸与输入尺寸相同,我们实际上会对这些帧做什么吗?

答案1

如果输入和输出参数相同,则比例过滤器为无操作,但裁剪并非如此,最终将在内存中执行帧复制。

您可以使用空过滤器来进行绕过。

因此,如果您的过滤链是,filter1,scale,filter3,crop,filter5那么在绕过的情况下,您可以声明filter1,null,filter3,null,filter5

答案2

您基本上计划将这些if/else决策从参数生成代码移到ffmpeg可执行文件中。这不是一个好主意。

原因之一是,libav(正确地)不要求流中的每一帧都具有相同的大小 - 因此必须对每一帧做出裁剪决定,而在参数生成代码中只需做出一次。

关于我的正确性假设的几句话:ffmpeg广泛应用于广播行业 - 并且 SD/HD/UHD 内容序列(老电影、电视剧、新电影内容)很正常,预计会得到正确处理。

相关内容