Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FFmpeg - How to scale a video then apply a watermark?

Im trying to scale a video so that it is always 512 wide where the height changes in proportion to the original video. Once scaled, I then want to apply a watermark/overlay to the video, therefore the video will scale but the watermark wont.

I am able to achieve each of these separately using the following filters:

Scale

-vf "scale=512:-1"

Watermark

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

They work successfully on their own.

However when trying to combine the two, Im having a bit of trouble.

Having both as parameters of course does not work as one will override the other.

Ive tried:

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

my thinking was that the scale would be applied first then the watermark but all I get is an error

Too many inputs specified for the "movie" filter.

Error opening filters!

Then changing the , to a ; resulted in:

Simple filtergraph 'scale=512:-1; movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]' does not have exactly one input and output.

Error opening filters!

I presume I need to do something more with filterchains but Im struggling to figure it out.

Any ideas anyone?

Many thanks in advance.

like image 729
Olibanum Avatar asked Jun 07 '12 15:06

Olibanum


People also ask

How do I add a watermark to a video in FFmpeg?

FFMPEG filters provide a powerful way to programmatically enhance or alter videos, and it’s fairly simple to add a watermark to a video using the overlay filter. The easiest way to install ffmpeg is to download a pre-built binary for your specific platform.

What is overlay FFmpeg?

FFmpeg offers the overlay filter as a way to overlay images (or even other videos) onto video streams. To centre overlay/watermark on a video, use this command: ffmpeg -i inputvideo.avi -i watermarklogo.png -filter_complex \ "overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" -codec:a copy output.flv.


2 Answers

You can use the -filter_complex option with the scale and overlay filters:

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
  • See scale and overlay filter documentation for more info.
  • No need for the movie source filter as in the other examples.
  • You can add -c:a copy if you want to stream copy (re-mux) the original audio instead of re-encoding it. This is useful if your input and output container formats are the same.
  • The example will place the logo in the center. For other placement options:
    • Upper left with 10 px padding: overlay=10:10
    • Upper right with 10 px padding: overlay=W-w-10:10
    • Lower right with 10 px padding: overlay=W-w-10:H-h-10
    • Lower left with 10 px padding: overlay=H-h-10:10
like image 79
llogan Avatar answered Sep 21 '22 20:09

llogan


Thank you to both @DiJuMx and @LordNeckbeard, you both got me closer to my solution. Ive not tried the filter_complex option yet but it certainly looks simpler.

The solution I found to work is:

-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]"

Note that Ive replaced the -1 in the scale as that had the potential to cause an uneven number of pixels in the height of the video when scaling which would then cause encoding errors.

like image 24
Olibanum Avatar answered Sep 18 '22 20:09

Olibanum