java 使用ffmpeg对视频进行添加水印

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

 

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

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会报错。)

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

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

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

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

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
使用FFmpeg视频加图片水印,需要先安装FFmpeg并设置环境变量。然后,可以使用Java调用FFmpeg的命令行工具来实现添加图片水印的功能。以下是一个示例代码: ```java public class VideoUtils { /** * 给视频添加图片水印 * @param videoPath 视频文件路径 * @param imagePath 水印图片路径 * @param outputPath 输出文件路径 * @throws Exception */ public static void addImageWatermark(String videoPath, String imagePath, String outputPath) throws Exception { // 构造FFmpeg命令 List<String> command = new ArrayList<>(); command.add("ffmpeg"); command.add("-i"); command.add(videoPath); command.add("-i"); command.add(imagePath); command.add("-filter_complex"); command.add("[0:v][1:v]overlay=10:10"); command.add("-codec:a"); command.add("copy"); command.add(outputPath); // 执行FFmpeg命令 ProcessBuilder builder = new ProcessBuilder(command); Process process = builder.start(); process.waitFor(); } } ``` 在上面的代码中,我们使用FFmpeg的overlay过滤器来实现将水印图片叠加在视频上的功能。其中,`[0:v]`表示第一个输入文件的视频流,`[1:v]`表示第二个输入文件的视频流,`overlay=10:10`表示在视频的左上角叠加水印图片,并且水印图片的左上角坐标为(10, 10)。如果要调整水印图片的位置,可以修改`overlay`参数的值。 使用时,可以调用`VideoUtils.addImageWatermark()`方法来给视频添加水印,例如: ```java try { VideoUtils.addImageWatermark("input.mp4", "watermark.png", "output.mp4"); } catch (Exception e) { e.printStackTrace(); } ``` 其中,`input.mp4`是要添加水印视频文件,`watermark.png`是水印图片文件,`output.mp4`是输出文件路径。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值