java ffmpeg 视频水印_java 实现视频转换通用工具类:视频加水印-Ffmpeg(五-1)
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)相关推荐
- java字体颜色编程_Java 字体颜色转换工具类 ColorUtil
Java 字体颜色转换工具类 ColorUtil,Java 字体颜色转换工具类 ColorUtil-- import java.awt.Color; import jxl.format.Colour; ...
- java基于geotools实现的几何图形坐标系转换通用工具类,geotools几何坐标转换,java几何坐标转换
在GIS开发中,前端地图通常使用地理坐标,而后端在计算几何面积等操作时,需要使用投影坐标.这过程中则需要进行坐标转换.下面带来了一个Java基于geotools开发的坐标转换工具类,支持点.线.面等几 ...
- 【PC工具】简单好用的视频编辑工具GiliSoft Video Editor,视频裁剪、转换、合并、加水印、加特效...
公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近各种小视频平台非常火,基本进入了全民自媒体时代,自媒体可以说是副业和创业首选项目 ...
- PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴
PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...
- 如何使用在线视频转换器将mkv格式转换成mp4视频
如何快速的将视频mkv转mp4?用于mkv格式转换为mp4格式的软件有很多,但是小编发现大多数朋友就只会修改后缀名或者利用cmd命令来实现mkv格式转换为mp4,不知道其他的方法,所以今天小编就来教大 ...
- 怎么利用ffmpeg和AviSynth给在windows下面为flv文件加水印
之前一直在找怎么为flv文件加上自己的水印,ffmpeg和vhook是在linux下面支持.在windows下面不支持.所以我就选择用ffmpeg和AviSynth为flv文件加水印.详细步骤如下: ...
- java对象生命周期_Java对象生命周期和类生命周期
原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...
- java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- java ueditor 图片上传加水印_关于ueditor多图上传加水印
最近小二哥应运营要求,需在后台编辑器做图片添加水印功能,由于ueditor编辑器本身没有添加水印的功能: 所以小二哥参考了网上的一些方法,加上实现的步骤整理成文档,希望对需要的人有帮助. 1.打开ue ...
- java spring上传图片_基于Spring Boot实现图片上传/加水印一把梭操作
文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现 ...
最新文章
- mysql 联合索引长度_MySQL 中索引的长度的限制
- 天津科技大学 物理实验平台使用教程及相关问题
- LaTeX输入极限下标,输入目标函数中的max下标约束条件
- 使用python logging的配置
- Module System of Swift (简析 Swift 的模块系统)
- python 查询包_查找Python包的依赖包(语句)
- VC模拟鼠标的两种方式(SendMessage、mouse_event)
- 【shiro基础】springboot + shiro整合thymeleaf
- 玩转手机中的linux系统termux并搭建java开发环境
- 【面试准备】MySQL索引篇
- reportportal 集成 robotframework 自动化执行及结果可视化
- 一些关于网页设计的优秀网站
- 一文看懂Google I/O 2021开发者大会
- 手机屏和大屏LCD显示面板接口(和处理器连接的接口类似12864等单片机处理器和屏接口的8086,SPI等并口串口屏以及RGB屏接口)LVDS接口常见于液晶电视中。eDP,LVDS,MIPI,HDMI
- single cell marker 基因数据库
- java jdk 7_jdk1.7下载|Java Development Kit (JDK) 下载「64位」-太平洋下载中心
- Origin如何绘制三维图形?
- RTEMS文件系统(6):内存文件系统(上)
- 深入了解模电数电目录篇
- java归一化方法_Java之Normalizer(归一化)
热门文章
- 遵义二十一中2021高考成绩查询入口,遵义第二十一中学2021年招生简章
- Helio Protocol — 分布式代币借贷和流动性质押协议
- word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
- “微肥”还是“歪fai”
- 带有Arduino的WS2812B可寻址RGB LED灯条指南
- MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G
- 路由器dns被劫持怎么办 路由器DNS被劫持解决方法
- 【千锋】网络安全学习笔记(一)
- 第七周 OJ总结4-求三角形面积-gyy
- android跑马灯效果横向,Android 通过自定义View实现纵向跑马灯效果