本人最近做了一个功能就是在视频转码过程中同时为视频添加一个水印,做这个功能整整坑了三天时间。各种踩坑。

 

下面记录一下视频转码添加水印时遇到最大的坑,也是小伙伴基本都会踩的坑。

1,ffmpeg为视频添加水印的相关命令,大家可以访问一下这个网址

https://stackoverflow.com/questions/10918907/how-to-add-transparent-watermark-in-center-of-a-video-with-ffmpeg

2,转码的命令有两种方式。

1) 

Top left corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv

Top right corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]" outputvideo.flv

Bottom left corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:main_h-overlay_h-10 [out]" outputvideo.flv

Bottom right corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=(main_w-overlay_w-10)/2:(main_h-overlay_h-10)/2 [out]" outputvideo.flv

2)

ffmpeg -i input.mp4 -i logo.png -filter_complex \
"overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" \
-codec:a copy output.mp4

要用第二种的同学可以访问上面那个网页。

因为公司版本的问题,这里本人用的是第一种。

下面介绍一下,在java中调用ffmpeg 进行转码添加水印应注意的问题。

1,java代码调用ffmpeg因为系统的差别,导致转码出错。

这里拿上面的命令做举例

ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]" outputvideo.flv

因为上面代码命令中有一段有双引号的命令 : ”movie=.....“

这里还有一个小坑,就是movie=后面的水印图片watermarklogo.png 如果是在windows系统进行转码的话,需要对 :进行转义,不然转码也会报错。如 c:/tem/wm.png 需要转义成 c\\:/tem/wm.png(linux文件的绝对路径没有:

一般如果在java 字符串中出现 双引号,我们都会用反斜杠 \“ 来进行转义。这样的写法是没问题的。

在windows运行程序,ffmpeg可以正常转码,但是如果把代码放到linux系统中就不行。ffmpeg日志会报我们看不懂的错误,这个错误是不好定位的。

比如下面的例子

linux的写法。(这种写法在linux可以运行,但在window会报错。)

java ffmpeg视频加图片水印 ffmpeg添加视频水印_java ffmpeg视频加图片水印

 windows的写法。(这种写法是很多小伙伴都会写的,这样写在windows运行就是没有问题,linux会报错误,转码失败)

java ffmpeg视频加图片水印 ffmpeg添加视频水印_linux_02

 这里我用的是java的new ProcessBuilder(command).start();调用ffmpeg执行命令的。

到这里使用java ffmpeg对视频添加水印的坑的描述就在这里了,希望各位小伙伴,不要踩,真的很费时间。(调程序搞了我三天时间。)

好了,文章就写到这里了,希望对大家有所帮助。有不足之处请多多指出。