实际业务需求:

在存储视频文件时先对上传的文件做加水印处理,之前做过通过七牛云服务器加水印的功能,虽然可以完成需求,但是毕竟是收费的呀!以下介绍在上传加水印的视频前对视频加水印的过程,至于上传功能,可根据自己的需求上传七牛或者阿里的OSS都可以,不在这里讲述。

现将ffmpeg加水印的代码献上。仅供参考,希望能帮到你。。。。如下:

//加水印的请求方法:private String toAddLogoVideo() {       //本地视频-----待加水印的视频String videoLocalPath = "D:\\sjb\processing\\video\\12344.mp4";        //本地水印logoString logoLocalPath = "D:\\sjb\processing\\1624325924993.png";     //加水印的方法String fileName = videoAddLogo(logoLocalPath, videoLocalPath);             return "D:\\sjb\processing\\" + fileName;}/*** @Description :视频添加水印方法* @param: [* logoPath:  水印地址,本地磁盘地址 如:C:\\video\\xxx.mp4* , videoPath 视频地址,本地磁盘地址 如:D:\\video\\xxx.mp4* ]*/public String videoAddLogo(String logoPath, String videoPath) {//获取随机值String uuid = UUID.randomUUID().toString();HashMap<String, Object> map = FFMPEG.getWidthHeight(videoPath);//视频宽Integer videoWidth = (Integer) map.get("width");//视频高Integer videoHeight = (Integer) map.get("height");//根据不同的视频生成相应的logo,存放在本地磁盘String newLogo = markVideoByLogoType(logoPath, "D:\\sjb\\logo\\" + uuid + ".png", videoWidth, videoHeight, "D:\\sjb\\processing\\", uuid + ".png");//创建给视频加水印的方法FFMPEG ff = new FFMPEG();//加水印后的视频本地缓存地址String videoConvertedPath = "D:\\sjb\\processing\\" + uuid + ".mp4";HashMap<String, String> dto = new HashMap<String, String>();//待处理的视频地址dto.put("input_path", videoPath);//设置宽高dto.put("screen_size", videoWidth.toString() + "x" + videoHeight.toString());dto.put("xaxis", "0");dto.put("yaxis", "0");//修改后与的地址dto.put("video_converted_path", videoConvertedPath);if (map.get("type").equals(1)) {//插件地址dto.put("ffmpeg_path", "D:\\VoidUtil\\bin\\ffmpeg.exe");//是win logo地址dto.put("logo", "D\\\\://sjb/processing/" + uuid + ".png");ff.videoTransfer(dto);//删除缓存文件new File(newLogo).delete();return uuid + ".mp4";} else {//等比放大后再加ff.videoTransfer(dto);//等比放大后视频缓存地址:重命名放大后的加水印文件,避免与videoConvertedPath重复,导致加水印失败。。。String videoNewPath = "D:\\sjb\\processing\\" + uuid + "_.mp4";//插件地址dto.put("ffmpeg_path", "D:\\VoidUtil\\bin\\ffmpeg.exe");//是win logo地址dto.put("logo", "D\\\\://sjb/processing/" + uuid + ".png");dto.put("input_path", videoConvertedPath);dto.put("video_converted_path", videoNewPath);ff.videoTransfer(dto);//删除缓存文件new File(newLogo).delete();return uuid + "_.mp4";}}/*** @Description: 按照视频的分辨率生成大小适宜的水印* @Author: wyc*/public static String markVideoByLogoType(String icon, String newIcon, Integer tW,         Integer tH, String output, String imageName) {try {//优先创建newicon文件:等比放大或缩小调整之后的水印logoFile ficon = new File(newIcon);if (!ficon.exists()) {ficon.createNewFile();}//参照要加水印的文件,将logo做等比放大或缩小resizeImage(icon, newIcon, (int) tW);// 创建等比缩放后的Logo的Image对象Image ic = ImageIO.read(ficon);//logo图高度int sH = ic.getHeight(null);//logo图宽度int sW = ic.getWidth(null);//创建要加水印的文件的画布BufferedImage bi = new BufferedImage(tW, tH, BufferedImage.TYPE_INT_RGB);//  创建一个指定 BufferedImage 的 Graphics2D 对象Graphics2D g = bi.createGraphics();bi = g.getDeviceConfiguration().createCompatibleImage(tW, tH, Transparency.TRANSLUCENT);g = bi.createGraphics();//  x,y轴默认是从0坐标开始 第一行水印初始横坐标int x = (int) (sH / 3.5);//  底图的高度int y = (int) (sW / 1.5);//水印图象的路径 水印一般为gif或者png的,这样可设置透明度ImageIcon imgIcon = new ImageIcon(newIcon);//得到Image对象。Image con = imgIcon.getImage();g.drawImage(con, x, y, null);g.dispose();try {//保存原图 输出 文件 到指定的路径saveAs(bi, "png", new File(output + imageName));} catch (Exception e) {e.printStackTrace();}ficon.delete();} catch (Exception e) {e.printStackTrace();}return output + imageName;}/*** 修改logo的像素** @param srcPath   源图片路径* @param desPath   修改大小后图片路径* @param scaleSize 图片的修改比例,目标宽度*/public static void resizeImage(String srcPath, String desPath, int scaleSize) throws IOException {File srcFile = new File(srcPath);Image srcImg = ImageIO.read(srcFile);BufferedImage bi = null;try {bi = ImageIO.read(srcFile);} catch (Exception e) {e.printStackTrace();}float width = bi.getWidth(); // 像素float height = bi.getHeight(); // 像素float scale = width / scaleSize;BufferedImage buffImg = null;buffImg = new BufferedImage(scaleSize, (int) (height / scale), BufferedImage.TYPE_INT_RGB);//保持Png图片的透明背景属性Graphics2D g = buffImg.createGraphics();buffImg = g.getDeviceConfiguration().createCompatibleImage(scaleSize, (int) (height / scale), Transparency.TRANSLUCENT);g = buffImg.createGraphics();//使用TYPE_INT_RGB修改的图片会变色buffImg.getGraphics().drawImage(srcImg.getScaledInstance(scaleSize, (int) (height / scale), Image.SCALE_SMOOTH), 0,0, null);       //原图保存try {// 输出 文件 到指定的路径FileOutputStream out = new FileOutputStream(desPath);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(buffImg);param.setQuality(1, true);encoder.encode(buffImg, param);out.close();} catch (Exception e) {e.printStackTrace();}}//------------------------FFMPEG-------工具类--begin---import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;/*** FFMPEG转码的方式给视频加水印*/
public class FFMPEG {private static final boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win");public static String returnSecond(String instr) {String returnValue = null;if (null != instr) {String[] a = instr.split("\\.");String[] b = a[0].split(":");int returnNumber = 0;if (null != instr && b[0].length() != 0) {returnNumber = Integer.valueOf(b[0]) * 60 * 60 + Integer.valueOf(b[1]) * 60 + Integer.valueOf(b[2]);returnValue = String.valueOf(returnNumber);} else {returnValue = null;}}return returnValue;}/*** @ HashMap<String,String> dto 参数传递对象<br>* dto中包含的参数<br>* (必填)1.ffmpeg_path:ffmpeg执行文件地址,如 d:\\ffmpeg\\ffmpeg.exe* Linux下直接调用ffmpeg命令(当然你事先已经有这个程序了)<br>* (必填)2.input_path:原视频路径<br>* (必填)3.video_converted_path:转换后视频输出路径<br>* (可选)4.screen_size:视频尺寸 长度乘宽度 乘号用英文小写"x"如 512x480<br>* (可选)5.logo:水印地址(其实在ffmpeg中有一个专门的watermark参数,logo跟它有何不同,我还没看,不过对我来说效果一样* 貌似需要png图片才行)<br>* (可选,如果填写必须有logo才行,默认为0)6.xaxis:水印logo的横坐标(只有logo参数为一个正确路径才行) 比如0<br>* (可选,如果填写必须有logo才行,默认为0)6.yaxis:水印logo的纵坐标(只有logo参数为一个正确路径才行) 比如0<br>* (可选)vb:视频比特率,传入一个数值,单位在程序里面拼接了k (可选)ab:音频比特率,传入一个数值,单位在程序里面拼接了k*/public String videoTransfer(HashMap<String, String> dto) {List<String> cmd = new ArrayList<String>();if (isWindows) {//是wincmd.add(dto.get("ffmpeg_path"));} else {cmd.add("ffmpeg");}//设置水印每隔1秒钟从左移动右直至消失cmd.add("-y");cmd.add("-i");cmd.add(dto.get("input_path"));if (null != dto.get("screen_size")) {//-s:截取指定时间的缩略图,-ss后跟的时间单位是秒cmd.add("-s");cmd.add(dto.get("screen_size"));}if (null != dto.get("logo")) {String logo = dto.get("logo");//-vf:视频旋转cmd.add("-vf");String xaxis = dto.get("xaxis");String yaxis = dto.get("yaxis");xaxis = xaxis != null && !"".equals(xaxis) ? xaxis : "0";yaxis = yaxis != null && !"".equals(yaxis) ? yaxis : "0";String logoString = "movie=" + logo + "[logo],[in][logo]overlay=x=" + xaxis + ":y=" + yaxis + "[out]";cmd.add(logoString);}cmd.add("-strict");cmd.add("-2");if (null != dto.get("vb") && !"".equals(dto.get("vb"))) {cmd.add("-vb");cmd.add(dto.get("vb") + "k");}if (null != dto.get("ab") && !"".equals(dto.get("ab"))) {cmd.add("-ab");cmd.add(dto.get("ab") + "1500");}cmd.add("-q:v");cmd.add("4");cmd.add(dto.get("video_converted_path"));for (String a : cmd) {System.out.println(a);}String converted_time = CmdExecuter.exec(cmd);//插入水印花费的时间return returnSecond(converted_time);}/*** 视频等比放大缩小** @param filePath* @return*/public static HashMap<String, Object> getWidthHeight(String filePath) {File file = new File(filePath);Encoder encoder = new Encoder();FileChannel fc = null;try {MultimediaInfo m = encoder.getInfo(file);long ls = m.getDuration();FileInputStream fis = new FileInputStream(file);fc = fis.getChannel();BigDecimal fileSize = new BigDecimal(fc.size());HashMap<String, Object> map = new HashMap<String, Object>();if (m.getVideo().getSize().getWidth() < 1000) {//宽度小于1000px 则等比放大//float width = m.getVideo().getSize().getWidth() * 2;float width = 1500.0f;float height = m.getVideo().getSize().getHeight() * (width / m.getVideo().getSize().getWidth());int height1 = (int) height;if (height1 % 2 != 0) {height1 = height1 + 1;}map.put("width", (int) width);map.put("height", height1);map.put("screen_size", (int) width + "x" + height1);//两次--先等比放大,再加水印map.put("type", 2);} else {map.put("width", m.getVideo().getSize().getWidth());map.put("height", m.getVideo().getSize().getHeight());map.put("screen_size", m.getVideo().getSize().getWidth() + "x" + m.getVideo().getSize().getHeight());//一次--直接加水印map.put("type", 1);}return map;} catch (Exception e) {e.printStackTrace();} finally {if (null != fc) {try {fc.close();} catch (IOException e) {e.printStackTrace();}}}return null;}
}/*** 保存图片** @param image      图片* @param formatName 格式名称* @param outFile    输入文件* @throws IOException*/
public static void saveAs(BufferedImage image, String formatName, File outFile) throws IOException {//重画一下,要么会变色if (formatName.equalsIgnoreCase("jpg") || formatName.equalsIgnoreCase("jpeg")) {BufferedImage tag;tag = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_BGR);Graphics g = tag.getGraphics();// 绘制缩小后的图g.drawImage(image, 0, 0, null);g.dispose();image = tag;}ImageIO.write(image, formatName, outFile);}//------------------------FFMPEG-------工具类--end---

备注: 使用ffmpeg给视频加水印时需要下载不同的ffmpeg.exe。我这里是在widows系统完成的加水印的操作,直接下载接到对应的磁盘(如:本案例中使用的 D:\VoidUtil\bin 即本人下载的ffmpeg存放的位置),Linux系统的安装及配置请自行百度,不再赘述!!

java使用ffmpeg完成视频加水印功能相关推荐

  1. ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤

    FFmpeg给视频添加水印,根据官方文档的介绍可以知道FFmpeg在编译安装的时候还需要加 –enable-libfreetype.–enable-libfontconfig. --enable-li ...

  2. FFmpeg之视频加水印

    命令行方式: qq_weibo.mp4 : 出入视频文件路径 , shuiyin.png : 水印图片地址 , qq_weibo_shuiyin.flv : 加完水印的输出视频文件路径 , overl ...

  3. ffmpeg入门及java操作ffmpeg对视频进行处理

    一.ffmpeg 1.简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非 ...

  4. 电脑视频加水印软件哪个好?这些软件值得收藏

    相信不少小伙伴都有曾在社交平台上,发布过自己的一些视频吧.那你们有没有给自己的视频添加上水印呢?水印可以有效的降低自己的视频被他人盗用的风险,现在的市面上有很多种视频添加水印的软件.那你们知道视频添加 ...

  5. 技巧分享:如何给视频加水印?

    今天下课时,老师给我们布置了作业:每人制作一组关于"秋"的视频.说到"秋",我联想到的便是落叶,于是我便围绕落叶,制作了一个视频.等到快交作业时,才发现周围好多 ...

  6. 不懂怎么给视频加水印?给视频加水印你可以这样做

    大家有没有这样的烦恼?自己辛辛苦苦做的视频发布到网上却被他人盗用,我之前就遇到过这样的情况,后来我发现借助一些软件给自己的视频加上水印后,这种情况就比较少发生了,市面上可以给视频加水印的软件有很多,那 ...

  7. 怎样视频加水印?这几款软件不容错过

    在家上网课时,体育老师要求我们每天都拍摄一段运动的视频上传到群上,并且要求在视频上带上自己的名字和学号.第一次准备上传视频的时候,我就不太了解要怎么给视频加上文字水印,于是就上网搜索了一下,找到了几个 ...

  8. JAVA调用FFmpeg实现音视频转码加水印功能

    目录 目录 写在前面 MAVEN引用 获取音视频基本信息 音频转码成Mp3格式 视频转码成Mp4格式 视频转码成Mp4并添加文字水印 视频转码成Mp4并添加图片水印 测试代码 写在前面 如今各大云厂商 ...

  9. 七牛云 转码_YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能

    YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能 YYC松鼠短视频系统2020年03月18日V2.0日志: 1.新增上传视频自动转码添加水印功能,水印可以设定四个位置,左上角,右上角,左下 ...

  10. 关于安卓视频加水印与剪辑功能实现

    内容如题,文末有demo 核心功能使用rxffmpeg实现 感谢开源sdk-rxffmpeg 今日,公司有个需求,就是对视频实现剪辑,和加水印.先上图: 视频加水印效果 视频剪辑 使用方法 Video ...

最新文章

  1. Java中long和Long有什么区别
  2. Cookie,Session的区别
  3. (转)几种常用存储过程分页方法
  4. 3个多月,近3000人参与的源码共读,诚邀加入~
  5. codeforces280 C. Game on Tree(期望)
  6. this.$router.push如何刷新页面_小程序丨微信小程序如何实现页面下拉刷新
  7. android代码删除sd卡文件在哪里,android - 如何从SD卡中删除文件?
  8. 越成功的人越能直面人性的欲望
  9. 算法不会,尚能饭否之排序——折半插入排序(Binary Insert Sort)
  10. VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化
  11. Grids for mac(强大的Instagram客户端工具)
  12. GitHub上README.md文件的图片大小尺寸
  13. waiting for headers
  14. 关于页眉的奇偶页不同设置和奇数页页眉展示每一章名称的设置方法
  15. 分数的加法,有理数加法
  16. C语言的三种参数传递方式
  17. 知乎回答一键导出为PDF——Python实现
  18. Excel VBA高级编程 - 根据关键字自动搜索,自动生成下拉菜单
  19. 2.Linux文件IO编程
  20. 陕西单招计算机考试试题,陕西省单招考试试题-单招考试试题

热门文章

  1. wireshark密码嗅探侵入后台管理系统
  2. 像word手动插入分页符一样实现报表中强制分页(强制分页)
  3. 12 款超实用的 Win10 UWP 应用分享
  4. Excel中去重并只保留最近n次日期/最大最小值的数据
  5. VRRP 网关冗余备份
  6. Word——如何在框框□里打打勾√
  7. 小白都能看得懂的java回调
  8. 用Netty实现WebSocket网络聊天室
  9. GUI 图形用户界面编程(一)
  10. 细数黑帽seo七宗罪