Technology ramblings of a pro breaker and fixer.
Categories

FFMPEG Watermark video without vhook solution

So recently ive been playing around with ffmpeg, ive found it quite a useful tool for converting video types, encoding / compressing for online use.

I had quite a challenge on getting it all setup on centos with CPANEL, using the latest SVN versions and libraries.

One of the reasons i went from using an older somewhat functioning version,was that version seemed to fail when converting any avi to flv. Other formats worked fine.

So after upgrading to the latest SVN; and being able to convert avi’s i was nearly floored when i found they removed ffmpeg vhook support for adding watermarks and didnt really leave a viable solution open. Their thought process was to encourage the development of libavfilter and its various filters, they would disable and remove the fucntionality of vhooks in the lead up to Googles Summer of coding – in the hope a solution gets developed.

Currently libavfilter is unfinished and very much undocumented – which from my reading online has impacted many many users.

I searched for days and didnt find a single solution to using libavfilter to overlay the image watermark correctly. I did find a possible vf_logo.c patch that could add some functionality but it needed to be further developed and wasnt a supported patch.

Well i was lucky enough to stumble accross an entry in the SOC conversation  (thankyou google for having the find pages in the last 7 days option). Seems the libavfilter SOC SVN just got a fresh patch to libavfilter overlay that allows it to work.

So i downloaded the libavfilter from the SOC SVN, installed and recompiled FFMPEG from the libavfilter source.

(NOTE the FFMPEG SVN DOESNT HAVE THE LATEST FILES AND SUPPORT FOR THE LATEST LIBAVFILTER – YOU NEED TO DOWNLOAD THE INCLUDED FFMPEG FROM THE LIBAVFILTER SOC SVN AND COMPILE FROM THAT)

I was then able to issue the command.

ffmpeg -y -i sample.avi -vfilters “movie=0:png:watermark.png [wm];[in][wm] overlay=10:mainH-overlayH-10:1 [out]” -b 100k -ar 44100 -ab 24k -f flv -s 320×240 -acodec libmp3lame -ac 1 samplewithwater.flv

Which converted from AVI to FLV and added my watermark.

ive included a couple of examples below for just adding the watermark.

Example 1 – insert transparent PNG watermark in bottom left corner of the video:
-vfilters “movie=0:png:logo.png [wm];[in][wm] overlay=10:mainH-overlayH-10:1 [out]”

Notice the last parameter to overlay “:1” – this enables alpha blending.

Example 2 – insert 2 different transparent PNG watermarks (second watermark on bottom right corner):
-vfilters “movie=0:png:logo.png [wm];movie=0:png:logo2.png [awm];[in][wm] overlay=10:mainH-overlayH-10:1 [int];[int][awm] overlay=mainW-overlayW-10:mainH-overlayH-10:1 [out]”

You could chain and add more overlays this way but the efficiency of such approach is yet to be tested.

 Feel free to comment, post any tips and tricks or even issues you are having!

Im just happy to now have FFMPEG compiled with the latest SVN Source with libavfilters watermarking solution on a CPANEL centos server!!! and not be using an ancient buggy version. just for reference.

FFmpeg version SVN-r23004, Copyright (c) 2000-2010 the FFmpeg developers

  libavutil     50.15. 0 / 50.15. 0
  libavcodec    52.66. 0 / 52.66. 0
  libavformat   52.62. 0 / 52.62. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libavfilter    1.19. 0 /  1.19. 0
  libswscale     0.10. 0 /  0.10. 0
Filters:
aspect           Set the frame aspect ratio.
crop             Crop the input video to x:y:width:height.
drawbox          (null)
fifo             (null)
format           Convert the input video to one of the specified pixel formats.
fps              (null)
hflip            (null)
negate           (null)
noformat         Force libavfilter not to use any of the specified pixel formats for the input to the next filter.
null             Pass the source unchanged to the output.
overlay          Overlay a video source on top of the input.
pad              Add pads to the input image.
pixelaspect      Set the pixel aspect ratio.
rotate           (null)
scale            Scale the input video to width:height size and/or convert the image format.
setpts           (null)
slicify          Pass the images of input video on to next video filter as multiple slices.
split            (null)
transpose        (null)
unsharp          Sharpen or blur the input video.
vflip            Flip the input video vertically.
buffer           (null)
movie            (null)
nullsrc          Null video source, never return images.
nullsink         Do absolutely nothing with the input video.

So in summary, to get watermarks in ffmpeg without using vhooks you need the following

  1. libavfilter from the SOC repository (it has the latest filters) – checkout.sh , install it
  2. compile ffmpeg from the ffmpeg source in the libavfilter you just downloaded.

The libavfilter SVN is – svn://svn.ffmpeg.org/soc/libavfilter

it doesnt seem so complicated anymore oO

FFMPEG Watermark video without vhook solution, 4.3 out of 5 based on 3 ratings

17 Responses to “FFMPEG Watermark video without vhook solution”

  • macz - August 16, 2010 at 9:28 pm

    Hi,

    Great article! I followed the same steps as you, but ffmpeg seems not able to read pngs

    How did you do it?

    Best,

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Denis - September 23, 2010 at 3:16 am

    Please, tell me what is your x264 version?
    I cant compile my ffmpeg with x264.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • $andy - September 27, 2010 at 8:59 pm

    Thanks dear… it really work for me.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Yeno - October 18, 2010 at 12:33 am

    ffmpeg is cool. but pain in butt to config/install -vhook etc/ libraries/dependencies
    i like the -vf “hflip” options and -vframe 4 -image2 %d.jpg
    for flipping the frames horizontal and extracting images.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Soumya - October 28, 2010 at 2:22 pm

    plz tell me how to add watermark in a specific position of a video file……i mean a specific run time like 00:01:00 to 00:03:00 of a 5 minutes video

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Soumya - October 28, 2010 at 2:24 pm

    btw, your article is very helpful ,thanx 4 the share………

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • francesco - November 2, 2010 at 4:38 am

    won’t work for me:
    Unable to find a suitable output format for ‘[wm]’
    -jailshell: [in][wm]: command not found

    can you help me?
    thanks a lot

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Kyle - November 2, 2010 at 7:18 am

    Regrettably the latest libavfilter checkout ffmpeg does not support the configure option of –enable-avfilter-lavf, which from all reading suggests that the method above cannot work with the latest code – bugger!

    So I am reverting to 0.5 ffmpeg as I’d rather ffmpeg to take care of all the processing rather than hook in transcode or similar etc.

    Any ideas on eta re: watermarking with 0.6 ffmpeg???
    Kyle

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Kyle - November 2, 2010 at 10:51 am

    I AM INCORRECT ABOVE SORRY – You don’t need the –enable-avfilter-lavf options & the movie option will work. I did have an issue with the dimension values but I can hard code these!
    So very happy now!
    Kyle

    VA:F [1.9.22_1171]
    Rating: +1 (from 1 vote)
  • Mike - November 20, 2010 at 5:17 am

    Thanks for the very useful tip, the only comment – with the recent ffmpeg (r25741), use -vf instead of -vfilters.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • kyle - November 23, 2010 at 7:33 am

    I keep getting

    [movie @ 0x302fb00] movie_init() Failed to av_open_input_file ‘logo.png’
    Error initializing filter ‘movie’ with args ‘0:png:logo.png’

    when trying to test this out. anyone have a fix?

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • misterwebnet - December 15, 2010 at 4:00 am

    Hey, Thanks a million for this! Saved me a bunch of time and (finally) able to watermark videos again!

    If anybody getting a vfilters not recognized option, try -vf instead of -vfilters in the command line!

    VA:F [1.9.22_1171]
    Rating: +1 (from 1 vote)
  • code78 - January 3, 2011 at 2:28 am

    Hello!

    Watermark etc works fine, I have latest SVN & stuff installed.
    How ever, if I convert avi files to h264/aac mp4 and try to play (from stream) it on Android tablet (MID 1.1) replay looks like a diashow and sound
    & video are out of sync. Playing from PC (mplayer/vlc)
    everything looks normal and audio&video are in sync.

    If I compile latest SVN ffmpeg without patched libavfilter
    videos are working also in Android tablet and other mobile
    devices.

    I stream mp4s thru Wowza streaming server to a mobile
    devices.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Coeus - March 29, 2011 at 1:16 am

    I wanted to watermark my movies in the bottom-right corner, and eventually found there’s a new syntax to the filter. It should go thus :

    -vf “movie=image.png:f=png [img]; [in] [img] overlay=W-w-10:H-h-10:1 [movie]; [movie] setdar=16:9”

    Try this if you keep getting errors. Keep in mind though it won’t work for just any FFmpeg version.

    VA:F [1.9.22_1171]
    Rating: +1 (from 1 vote)
  • Mike D - April 20, 2011 at 7:40 am

    Hey – great article.

    I tried following along with latest but couldn’t get it to work on my Windows environment. Do you happen to have a windows binary already working with png alpha transparency overlay that you could send along? (or put in a safe place to download)?

    – Mike

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Noah - June 24, 2011 at 10:21 am

    I would love a Windows binary version of this as well. If someone has it, please send to noahsw AT gmail.com.

    Thanks in advance!

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  • Manish - January 20, 2012 at 3:38 pm

    The vhook option is deprecated in new releases.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Leave a Reply for Mike