如何在 ffmpeg 过滤器复合体中缩放覆盖层?

如何在 ffmpeg 过滤器复合体中缩放覆盖层?

我想应用 PNG覆盖使用 ffmpeg 将水印添加到任意视频文件。我希望视频保持其原始大小(我事先不知道),PNG 为缩放相对于视频。

例如,以下命令将覆盖置于左上角:

ffmpeg.exe -i input.mov -i header.png -filter_complex \
    "[0][1] overlay=0:0" output.mkv

以下命令将覆盖层相对于其自身进行缩放(宽度的 1/5,高度相对):

ffmpeg.exe -i input.mov -i header.png -filter_complex \
    "[1] scale=iw/5:-1 [scaled]; \
    [0][scaled] overlay=0:0" output.mkv

我怎样才能使覆盖宽度为 的 1/5 input.mov?(例如,是否可以存储和/或查询另一个过滤子句的宽度?)

我遇到过最接近的问题是使用 ffmpeg 根据视频大小缩放水印叠加但该答案使用外部 Linux/Cygwin 命令。FFmpeg 水印在我弄清楚 ffmpeg 时也很有用。但是,我在 Windows 上,并通过 Python 调用 ffmpeg,所以我想在 filter_complex 子句中完成所有操作。如果这不可能,我想确定一下,这样我就可以停止尝试了 :)

答案1

我的方法是使用两个单独的命令,一个用于计算尺寸,另一个用于叠加。您只需使用FFprobe随之而来的是FFmpeg。要计算尺寸,您可以使用以下命令。

ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 input_video

结果如下。

宽度=1280

高度=720

之后,您可以进行任何您想要的数学运算,并将其应用于您的覆盖命令。此外这里还有更多缩放选项。

希望这可以帮助!

答案2

比使用 FFprobe 然后“做任何你想做的数学运算”更简单的解决方案是简单地使用 FFmpeg 的内置scale2ref过滤器,使用主视频作为参考:

ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1][0]scale2ref=w=oh*mdar:h=ih*0.1[logo][video];[video][logo]overlay=5:H-h-5" -c:a copy output.mp4

本示例将使徽标成为主视频大小的 10%(即 1/10),并由llogan 对 SO 的回答

相关内容