maven依赖
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version>
</dependency>
工具类/*** @author excuse* @apiNote 视频剪辑工具类* @version 1.0.0** */
public class VideoUtil {public static String videoPath_temp_path= "D://video1/";/**** @apiNote 切割视频指定的位置* @param videoPath 视频路径* @param start 视频开始时间 ,单位秒* @param end 视频结束时间* @param recodeAudio 是否录制音频* @return 生成文件路径* */public static String  cutVideo(String videoPath,Integer start,Integer end,boolean recodeAudio) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);grabber.start();String s = UUID.randomUUID().toString()+".mp4";FFmpegFrameRecorder fFmpegFrameRecorder = new FFmpegFrameRecorder(videoPath_temp_path + s,grabber.grabImage().imageWidth,grabber.grabImage().imageHeight,recodeAudio?1:0);fFmpegFrameRecorder.start();Frame frame = null;while ((frame=grabber.grabFrame(recodeAudio,true,true,false))!=null){if ((start==null?0:(start*1000000))<frame.timestamp&&(end == null || ((end * 1000000) > frame.timestamp))){fFmpegFrameRecorder.record(frame);}}fFmpegFrameRecorder.stop();fFmpegFrameRecorder.release();return s;}/*** @apiNote 视频添加水印* @param videoPath 视频路径* @param text 水印文本* @param x 水印位置x* @param y 水印位置y* @param color 水印颜色* @param fontSize 水印文字大小* @return 生成文件路径** */public static String waterMark(String videoPath, String text, Integer x, Integer y, Color color, Integer fontSize) throws Exception {FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);grabber.start();Frame frame = grabber.grabImage();String s = videoPath_temp_path + UUID.randomUUID().toString()+".mp4";FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(s,frame.imageWidth,frame.imageHeight,0);recorder.start();int j= 0;while ((frame=grabber.grabImage())!=null){Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bufImg = converter.getBufferedImage(frame);Font font = new Font("微软雅黑", Font.BOLD, 64);
//            String content = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//            String content1 = "字符滚动效果";FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);int width = bufImg.getWidth();//计算图片的宽int height = bufImg.getHeight();//计算高Graphics2D graphics = bufImg.createGraphics();graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));graphics.drawImage(bufImg, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);graphics.setColor(color);graphics.setFont(new Font("微软雅黑", Font.BOLD, fontSize));graphics.drawString(text,  x, y);graphics.dispose();frame = converter.getFrame(bufImg);recorder.record(frame);j++;}grabber.stop();recorder.stop();recorder.release();return s;}/*** @apiNote 合并音视频* @param audioPath 音频路径* @param videoPath 视频路径* @return 最终生成文件地址** */public String mergeAV(String audioPath,String videoPath){String outputPath = videoPath_temp_path+UUID.randomUUID()+".mp4";try (FFmpegFrameGrabber imageGrabber = new FFmpegFrameGrabber(videoPath);FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(audioPath)) {imageGrabber.start();audioGrabber.start();try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, imageGrabber.getImageWidth(), imageGrabber.getImageHeight(),1);) {recorder.setInterleaved(true);recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("mp4");recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // yuv420pint frameRate = 25;recorder.setFrameRate(frameRate);recorder.setGopSize(frameRate * 2);recorder.setAudioOption("crf", "0");recorder.setAudioQuality(0);// 最高质量recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.setAudioChannels(2);recorder.setSampleRate(44100);recorder.start();long videoTime = imageGrabber.getLengthInTime();Frame imageFrame = null;while ((imageFrame = imageGrabber.grabImage()) != null) {recorder.record(imageFrame);}long audioPlayTime = 0L;Frame sampleFrame = null;while ((sampleFrame = audioGrabber.grabSamples()) != null || audioPlayTime < videoTime) {if (sampleFrame == null) {audioGrabber.restart();//重新开始sampleFrame = audioGrabber.grabSamples();videoTime -= audioPlayTime;}recorder.record(sampleFrame);audioPlayTime = audioGrabber.getTimestamp();if (audioPlayTime >= videoTime) {break;}}}} catch (Exception e) {throw new RuntimeException(e);}return outputPath;}/**** @apiNote 合并多个视频* @param list 要合并的视频列表* @param outputPath 输出文件位置* @return 返回输出文件位置*** */public static String mergeVideo(java.util.List<String> list,String outputPath) throws FrameGrabber.Exception {ArrayList<FFmpegFrameGrabber> grabbers = new ArrayList<>();OpenCVFrameGrabber grabber1 = new OpenCVFrameGrabber(list.get(0));grabber1.start();Frame frame1 = grabber1.grabFrame();for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));grabbers.add(new FFmpegFrameGrabber(list.get(i)));FFmpegFrameGrabber grabber = grabbers.get(i);grabber.start();}Map<String, String> metadata = grabbers.get(0).getMetadata();FFmpegFrameRecorder fFmpegFrameRecorder = new FFmpegFrameRecorder(outputPath+"temp0"+".mp4",frame1.imageWidth,frame1.imageHeight,grabbers.get(0).getAudioChannels());grabber1.stop();fFmpegFrameRecorder.setFormat("mp4");fFmpegFrameRecorder.setAudioChannels(2);fFmpegFrameRecorder.setGopSize(4);try {fFmpegFrameRecorder.start();for (int i = 0; i < grabbers.size(); i++) {FFmpegFrameGrabber grabber = grabbers.get(i);if (i>0){FFmpegFrameGrabber grabber2 = new FFmpegFrameGrabber(outputPath + "temp" + (i - 1) + ".mp4");grabber2.start();fFmpegFrameRecorder = new FFmpegFrameRecorder(outputPath+"temp"+(i)+".mp4",frame1.imageWidth,frame1.imageHeight,grabber2.getAudioChannels());fFmpegFrameRecorder.start();grabber2.setFormat("mp4");System.out.println(grabber2.getFormat());Frame avFrame = null;while ((avFrame = grabber2.grabFrame())!=null){fFmpegFrameRecorder.record(avFrame);}grabber2.release();grabber2.stop();grabber2.close();new File(outputPath + "_temp_" + (i - 1) + ".mp4").deleteOnExit();}Frame avFrame = null;while ((avFrame = grabber.grabFrame(true,true,true,false))!=null){
//                    fFmpegFrameRecorder.record(avFrame);fFmpegFrameRecorder.record(avFrame);}grabber.stop();fFmpegFrameRecorder.stop();System.gc();}fFmpegFrameRecorder.stop();File file = new File(outputPath + "temp" + (grabbers.size() - 1) + ".mp4");file.renameTo(new File(outputPath+".mp4"));return outputPath;} catch (FFmpegFrameRecorder.Exception | FrameGrabber.Exception e) {e.printStackTrace();try {fFmpegFrameRecorder.stop();for (int i = 0; i < grabbers.size(); i++) {grabbers.get(i).stop();}} catch (FFmpegFrameRecorder.Exception | FrameGrabber.Exception ex) {ex.printStackTrace();}throw new RuntimeException("合成失败");}}}

JavaCV常用工具相关推荐

  1. 一些常用工具地址,随时更新中~

    2019独角兽企业重金招聘Python工程师标准>>> 一些常用工具地址的备份: 一款比较全的先到化界面编辑器Neditor:https://gitee.com/notadd/ned ...

  2. aes离线解密工具_CTF常用工具、网站、练习平台

    常用工具网站  CTFtools  比较全的工具下载网站,提供百度云链接  BUUCTF  比较全的工具下载网站,提供百度云链接  XSS 之旅  xss 攻击练习网站,闯关式设计,难度递增  too ...

  3. 西湖大学鞠峰组:环境宏病毒组学分析思路与常用工具

    环境宏病毒组学分析思路与常用工具 袁凌1, 2,倪艳4,鞠峰1, 2, 3 * 1 浙江省海岸带环境与资源研究重点实验室,工学院, 西湖大学, 杭州, 浙江 2  前沿技术研究所, 浙江西湖高等研究院 ...

  4. 自动化测试现状趋势解读,附带近年自动化测试常用工具

    前几天在知乎上写了一篇文章和网友们一起探讨自动化测试,其中就有一个网友给我的回复我印象很深刻.他说做测试好像要什么内容都需要会,太累了.今天我就这个问题来给大家介绍一下自动化测试的常用工具以及自动化测 ...

  5. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /*** StringUti ...

  6. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  7. C#(Net)软件开发常用工具汇总,提高你的开发效率

    C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...

  8. Playmaker全面实践教程之Playmaker常用工具

    Playmaker全面实践教程之Playmaker常用工具 Playmaker常用工具 Playmaker插件搭载了8个工具:FSM Browser.State Browser.Templates.T ...

  9. Linux网络常用工具分类介绍

    Linux网络命令较多,单纯的介绍网络命令的用法也没什么意思.本文将常见的网络命令进行分类,并做出思维导图,对每个分类的命令选择性的介绍其作用.常见选项和用法举例.BTW,不建议记住所有命令,了解一下 ...

最新文章

  1. java线程wait_java多线程学习(四) 之 wait和notify
  2. 分享做LOGO 的方法和思维方式 -liuleihai
  3. VS为VC++添加UAC控制(VC程序默认管理员运行)
  4. android gradle自定义钉钉群提醒
  5. Redis学习笔记(11)——Redis缓存集群方案
  6. flutter获取Android照片地址,Flutter项目安卓配置启动图片
  7. Atcoder 084D - Small Multiple(最短路径+思维)
  8. HTML5和CSS3:游戏的变革Flexbox
  9. addEventListener方法与on事件的区别
  10. 【华为云技术分享】云小课 | OBS提供多方面数据安全保障,让存储放心、贴心、省心
  11. ubuntu下rar文件解压后文件名乱码
  12. react打包后图片丢失_给 React 组件自动加上 react-hot-loader
  13. K均值算法(K-means)聚类
  14. flashfxp怎么用,flashfxp怎么用
  15. HTML- 01:HTML 语言简介
  16. hadoop性能优化(调优)
  17. office正在更新,请稍后(无法正常启动,错误0xc0000142)
  18. 苹果cms试看提示文字怎么改[苹果CMS技术教程]
  19. 使整个网站变黑白(灰色)的特效代码
  20. [原创]夺棋赛HackTheBox OpenSource攻略

热门文章

  1. Java实现 蓝桥杯 算法训练 字串统计
  2. 大兴火灾难觅真相,违建楼房阻隔希望
  3. 大学生旅游网页制作作业5页 西柏坡介绍网页成品源代码下载 河北红色旅游景点网页设计
  4. 编写程序,输入一个3位整数,反转后输出。
  5. 李宏毅机器学习笔记(一)
  6. LeetCode-1374-生成每种字符都是奇数个的字符串
  7. 《PyTorch深度学习实践》完结合集--B站刘二大人学习总结
  8. Matlab镜像建模产生啸叫信号,基于MATLAB有噪声语音信号的处理最终稿(样例3)...
  9. 惩罚因子(penalty term)与损失函数(loss function)
  10. 高通:推出全新5G基站