十堰英文网站建设,上海市官方网站,wordpress商业插件,1小时赚8000元游戏java 实现视频转换通用工具类#xff1a;视频相互转换-Ffmpeg(三)说明#xff1a;视频加水印支持右上角、左上角、左下角、右下角、底部居中几个方位1.根据水印文字---添加视频水印/*** 根据水印文字---添加视频水印* param srcPath 原视频路径* param tarVideoPath 生成后的…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 moviewatermarklogo.png [watermark]; [in][watermark] overlay10:10 [out] outputvideo.flv* Top right corner* ffmpeg –i inputvideo.avi -vf moviewatermarklogo.png [watermark]; [in][watermark] overlaymain_w-overlay_w-10:10 [out] outputvideo.flv* Bottom left corner* ffmpeg –i inputvideo.avi -vf moviewatermarklogo.png [watermark]; [in][watermark] overlay10:main_h-overlay_h-10 [out] outputvideo.flv* Bottom right corner* ffmpeg –i inputvideo.avi -vf moviewatermarklogo.png [watermark]; [in][watermark] overlaymain_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.获取xy坐标值返回String数组/*** 获取xy坐标值返回String数组* param wmPosition* 0:左上角* 1:右上角* 2:左下角* 3:右下角* 4:居中* param srcPath 视频路径* param wmImgPath 水印图片路径* return*/public static int[] getXy(int wmPosition,String srcPath,String wmImgPath){int x10,y10; //定义默认为左上角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;}