java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)

说明:

视频加水印支持右上角、左上角、左下角、右下角、底部居中几个方位

1.根据水印文字---添加视频水印

/**

* 根据水印文字---添加视频水印

* @param srcPath 原视频路径

* @param tarVideoPath 生成后的视频路径

* @param wmPosition 水印位子

* @param alpha 透明度

* @param txt String 文字

* @param fontSize 每个字的宽度和高度是一样的

* @param fontColor Color 字体颜色

* @param isBold 字体是否加粗

* @param fontType 字体样式

* @param fontPath 字体文件

* @return

*/

public static boolean processFfmpegWatermkByFont(String srcPath,String tarVideoPath,int wmPosition, float alpha,String txt, int fontSize,Color fontColor,boolean isBold,String fontType,String fontPath) {

//通过文字生成的图片临时路径

String waterMarkPath = WebAppUtils.getWebAppRoot() +BaseCommonUtil.TXTIMGPATH + BaseCommonUtil.getDateNum() + ".png";

//waterMarkPath = "D:/project/BSRCM_TRUNK/WebRoot/swf/txtImg/1.png";

//通过文字生成透明图片

ImageHelps.createJpgByFont(txt,fontSize,fontColor,isBold,fontType,fontPath,waterMarkPath);

//avs ---通过水印图片添加水印视频

//return processFfmpegWatermarkByImage(srcPath,tarVideoPath,waterMarkPath,wmPosition,alpha);

//vfilters ---通过水印图片添加水印视频

boolean boo = processFfmpegWatermarkByImg(srcPath,tarVideoPath,waterMarkPath,wmPosition,alpha);

if(boo){

logger.info("【" + srcPath +"】 视频添加文字水印图片成功! ");

return true;

}else{

logger.error("【" + srcPath +"】 processFfmpegWatermkByFont 视频添加文字水印图片失败! ");

return false;

}

}

2.根据水印图片---添加视频水印

/**

*根据水印图片---添加视频水印

* @param srcPath 原视频路径

* @param tarVideoPath 生成后的视频路径

* @param waterMarkPath 水印图片路径

* @param wmPosition 水印位子

* @param alpha 透明度

* @return

*/

public static boolean processFfmpegWatermarkByImg(String srcPath,String tarVideoPath,String waterMarkPath,int wmPosition, float alpha) {

if (!checkfile(srcPath)) {

logger.error("【" + srcPath + "】 不存在 !");

return false;

}

if (!checkfile(waterMarkPath)) {

logger.error("【" + waterMarkPath + "】 不存在 !");

return false;

}

//如果父目录不存在就创建一个

tarVideoPath = BaseCommonUtil.replaceFliePathStr(tarVideoPath);

BaseCommonUtil.mkdir(tarVideoPath);

//缩放图片

zooImage(srcPath, waterMarkPath);

//要执行的shell脚本路径

String shellPath = WebappConfigUtil.getParameter("shellPath");

if (!checkfile(shellPath)) {

logger.error("【" + shellPath + "】shell脚本路径 不存在 !");

}

String extendTarName = tarVideoPath.substring(tarVideoPath.lastIndexOf(".")+1,tarVideoPath.length());

Process process = null;

try {

String os = System.getProperty("os.name");

if (os != null && os.toLowerCase().startsWith("windows")) {

String picPath = waterMarkPath.substring(waterMarkPath.indexOf("WebRoot"),waterMarkPath.lastIndexOf("/"));

waterMarkPath = waterMarkPath.substring(waterMarkPath.lastIndexOf("/")+1,waterMarkPath.length());

process = Runtime.getRuntime().exec(shellPath +" "+picPath+" " + ffmpegPath + " " + srcPath + " " + waterMarkPath + " " + getVideoPosition(wmPosition) + " " + tarVideoPath);

} else{

process = Runtime.getRuntime().exec(shellPath + " " + ffmpegPath + " " + srcPath + " " + waterMarkPath + " " + getVideoPosition(wmPosition) + " " + tarVideoPath);

}

doWaitFor(process);

//转换mate信息

if("MP4".equals(extendTarName.toUpperCase())){

return execMp4Box(tarVideoPath);

}

if (!checkfile(tarVideoPath)) {

logger.error("【" + srcPath + "】processFfmpegWatermarkByImage 视频添加水印不成功 !");

return false;

}

return true;

} catch (Exception e) {

logger.error("【" + srcPath + "】processFfmpegWatermarkByImage 视频添加水印不成功 !");

return false;

}finally{

if(process != null){

process.destroy();

}

}

}

3.根据方位数字获取值

/**

* 根据方位数字获取值

* @param wmPosition

* 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:main_h-overlay_h-10 [out]" outputvideo.flv

* @return

*/

public static String getVideoPosition(int wmPosition){

String positionStr = "main_w-overlay_w-10:main_h-overlay_h-10"; //默认右上角

switch (wmPosition) {

case 0:

positionStr ="10:10"; //左上角

break;

case 1:

positionStr ="main_w-overlay_w-10:10"; //右上角

break;

case 2:

positionStr ="10:main_h-overlay_h-10"; //左下角

break;

case 3:

positionStr ="main_w-overlay_w-10:main_h-overlay_h-10"; //右下角

break;

case 4:

positionStr ="(main_w-overlay_w)/2:main_h-overlay_h:1"; //底部居中

break;

default:

break;

}

return positionStr;

}

4.缩放图片

/**

* 缩放图片

* @param srcPath 视频路径

* @param wmImgPath 水印图片路径

* @return

*/

public static void zooImage(String srcPath,String wmImgPath){

//获取视频信息

VideoInfo videoInfo = VideoInfoHelps.getVideoInfo(srcPath);

int width = 0; //视频宽

int height = 0; //视频高

if(videoInfo != null){

String widthStr = videoInfo.getWidth(); //宽

if(StringUtils.isNotEmpty(widthStr)) width = Integer.parseInt(widthStr);

String heightStr = videoInfo.getHeight(); //高

if(StringUtils.isNotEmpty(heightStr)) height = Integer.parseInt(heightStr);

}

if(width !=0 || height !=0){ //如果获取到视频宽高

//进行图片缩放

ImageHelps.zoomPerImg(wmImgPath, wmImgPath,width,height);

}

}

5.获取x,y坐标值,返回String数组

/**

* 获取x,y坐标值,返回String数组

* @param wmPosition

* 0:左上角

* 1:右上角

* 2:左下角

* 3:右下角

* 4:居中

* @param srcPath 视频路径

* @param wmImgPath 水印图片路径

* @return

*/

public static int[] getXy(int wmPosition,String srcPath,String wmImgPath){

int x=10,y=10; //定义默认为左上角

int[] xy = new int[2];

//获取视频信息

VideoInfo videoInfo = VideoInfoHelps.getVideoInfo(srcPath);

int width = 0; //视频宽

int height = 0; //视频高

if(videoInfo != null){

String widthStr = videoInfo.getWidth(); //宽

if(StringUtils.isNotEmpty(widthStr)) width = Integer.parseInt(widthStr);

String heightStr = videoInfo.getHeight(); //高

if(StringUtils.isNotEmpty(heightStr)) height = Integer.parseInt(heightStr);

}

if(width !=0 || height !=0){ //如果获取到视频宽高

//取得坐标方位编码

int position =BaseCommonUtil.getWmDegree(wmPosition);

int wideth_biao =0; //水印图片的宽

int height_biao = 0; //水印图片的高

try {

//首先进行图片缩放

ImageHelps.zoomPerImg(wmImgPath, wmImgPath,width,height);

//水印文件

Image src_biao = ImageIO.read(new File(wmImgPath));

wideth_biao = src_biao.getWidth(null);

height_biao = src_biao.getHeight(null);

} catch (IOException e) {

logger.error("【" + wmImgPath + "】getXy 读取水印图片失败 !");

}

//左上角距离边距10像素

int leftUpWideth = 10;

int leftUpHeight = 10;

//右上角距离边距10像素

int rightUpWideth = (width - wideth_biao) - 10;

int rightUpHeight = 10;

//左下角距离边距10像素

int leftDownWideth = 10;

int leftDownHeight = (height - height_biao) - 10;

//右下角距离边距10像素

int rightDownWideth = (width - wideth_biao) - 10;

int rightDownHeight = (height - height_biao) - 10;

//居中

int centerWideth = (width - wideth_biao) / 2;

int centerHeight = (height - height_biao) / 2;

switch (position) {

case 0:

x = leftUpWideth;

y = leftUpHeight;

break;

case 1:

x = rightUpWideth;

y = rightUpHeight;

break;

case 2:

x = leftDownWideth;

y = leftDownHeight;

break;

case 3:

x = rightDownWideth;

y = rightDownHeight;

break;

case 4:

x = centerWideth;

y = centerHeight;

break;

default:

break;

}

}

//设值

xy[0] =x;

xy[1] =y;

return xy;

}

java ffmpeg 视频水印_java 实现视频转换通用工具类:视频加水印-Ffmpeg(五-1)相关推荐

  1. java字体颜色编程_Java 字体颜色转换工具类 ColorUtil

    Java 字体颜色转换工具类 ColorUtil,Java 字体颜色转换工具类 ColorUtil-- import java.awt.Color; import jxl.format.Colour; ...

  2. java基于geotools实现的几何图形坐标系转换通用工具类,geotools几何坐标转换,java几何坐标转换

    在GIS开发中,前端地图通常使用地理坐标,而后端在计算几何面积等操作时,需要使用投影坐标.这过程中则需要进行坐标转换.下面带来了一个Java基于geotools开发的坐标转换工具类,支持点.线.面等几 ...

  3. 【PC工具】简单好用的视频编辑工具GiliSoft Video Editor,视频裁剪、转换、合并、加水印、加特效...

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近各种小视频平台非常火,基本进入了全民自媒体时代,自媒体可以说是副业和创业首选项目 ...

  4. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴

    PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...

  5. 如何使用在线视频转换器将mkv格式转换成mp4视频

    如何快速的将视频mkv转mp4?用于mkv格式转换为mp4格式的软件有很多,但是小编发现大多数朋友就只会修改后缀名或者利用cmd命令来实现mkv格式转换为mp4,不知道其他的方法,所以今天小编就来教大 ...

  6. 怎么利用ffmpeg和AviSynth给在windows下面为flv文件加水印

    之前一直在找怎么为flv文件加上自己的水印,ffmpeg和vhook是在linux下面支持.在windows下面不支持.所以我就选择用ffmpeg和AviSynth为flv文件加水印.详细步骤如下: ...

  7. java对象生命周期_Java对象生命周期和类生命周期

    原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...

  8. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  9. java ueditor 图片上传加水印_关于ueditor多图上传加水印

    最近小二哥应运营要求,需在后台编辑器做图片添加水印功能,由于ueditor编辑器本身没有添加水印的功能: 所以小二哥参考了网上的一些方法,加上实现的步骤整理成文档,希望对需要的人有帮助. 1.打开ue ...

  10. java spring上传图片_基于Spring Boot实现图片上传/加水印一把梭操作

    文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现 ...

最新文章

  1. mysql 联合索引长度_MySQL 中索引的长度的限制
  2. 天津科技大学 物理实验平台使用教程及相关问题
  3. LaTeX输入极限下标,输入目标函数中的max下标约束条件
  4. 使用python logging的配置
  5. Module System of Swift (简析 Swift 的模块系统)
  6. python 查询包_查找Python包的依赖包(语句)
  7. VC模拟鼠标的两种方式(SendMessage、mouse_event)
  8. 【shiro基础】springboot + shiro整合thymeleaf
  9. 玩转手机中的linux系统termux并搭建java开发环境
  10. 【面试准备】MySQL索引篇
  11. reportportal 集成 robotframework 自动化执行及结果可视化
  12. 一些关于网页设计的优秀网站
  13. 一文看懂Google I/O 2021开发者大会
  14. 手机屏和大屏LCD显示面板接口(和处理器连接的接口类似12864等单片机处理器和屏接口的8086,SPI等并口串口屏以及RGB屏接口)LVDS接口常见于液晶电视中。eDP,LVDS,MIPI,HDMI
  15. single cell marker 基因数据库
  16. java jdk 7_jdk1.7下载|Java Development Kit (JDK) 下载「64位」-太平洋下载中心
  17. Origin如何绘制三维图形?
  18. RTEMS文件系统(6):内存文件系统(上)
  19. 深入了解模电数电目录篇
  20. java归一化方法_Java之Normalizer(归一化)

热门文章

  1. 遵义二十一中2021高考成绩查询入口,遵义第二十一中学2021年招生简章
  2. Helio Protocol — 分布式代币借贷和流动性质押协议
  3. word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
  4. “微肥”还是“歪fai”
  5. 带有Arduino的WS2812B可寻址RGB LED灯条指南
  6. MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G
  7. 路由器dns被劫持怎么办 路由器DNS被劫持解决方法
  8. 【千锋】网络安全学习笔记(一)
  9. 第七周 OJ总结4-求三角形面积-gyy
  10. android跑马灯效果横向,Android 通过自定义View实现纵向跑马灯效果