FFmpeg - 如何缩放视频然后应用水印?

Oli*_*num 10 overlay watermark ffmpeg filter scale

我试图缩放视频,使其总是512宽,其高度与原始视频成比例变化.一旦缩放,我就想对视频应用水印/叠加,因此视频会缩放,但水印不会.

我可以使用以下过滤器分别实现这些过程:

规模

-vf "scale=512:-1"
Run Code Online (Sandbox Code Playgroud)

水印

-vf "movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"
Run Code Online (Sandbox Code Playgroud)

他们自己成功地工作.

然而,当试图将两者结合起来时,我有点麻烦.

当然,将两个作为参数都不起作用,因为一个参数将覆盖另一个.

我试过了:

-vf "scale=512:-1,movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"
Run Code Online (Sandbox Code Playgroud)

我的想法是,首先应用比例然后应用水印,但我得到的只是一个错误

为"电影"过滤器指定的输入太多.

打开过滤器出错!

然后改变,到; 导致:

简单的filtergraph'scale = 512:-1; movie = watermark.png [watermark]; [in] [watermark] overlay =(main_w-overlay_w)/ 2:(main_h-overlay_h)/ 2 [out]'没有一个输入和输出.

打开过滤器出错!

我认为我需要用过滤链做更多的事情,但我正在努力解决这个问题.

任何人的想法?

提前谢谢了.

llo*_*gan 20

您可以将该-filter_complex选项与比例和叠加过滤器一起使用:

ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v]scale=512:-1[bg];[bg][1:v]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" output
Run Code Online (Sandbox Code Playgroud)
  • 有关详细信息,请参阅比例叠加过滤器文档
  • 不需要像其他示例中那样使用电影源过滤器.
  • 您可以添加-c:a copy,如果你想流拷贝(重新MUX)原始音频,而不是重新编码它.如果输入和输出容器格式相同,这将非常有用.
  • 该示例将徽标放在中心.对于其他展示位置选项
    • 左上角有10个px填充: overlay=10:10
    • 右上角有10个px填充: overlay=W-w-10:10
    • 右下角有10个px填充: overlay=W-w-10:H-h-10
    • 左下方有10 px填充: overlay=H-h-10:10


Oli*_*num 15

感谢@DiJuMx和@LordNeckbeard,你们都让我更接近我的解决方案.我还没有尝试过filter_complex选项,但它看起来肯定更简单.

我发现工作的解决方案是:

-vf "movie=watermark.png [watermark]; [in]scale=512:trunc(ow/a/2)*2 [scale]; [scale][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"
Run Code Online (Sandbox Code Playgroud)

请注意,我已经在比例尺中替换了-1,因为在缩放时可能会导致视频高度不均匀的像素数,从而导致编码错误.