热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java调用ffmpeg实现视频编辑

1.前言FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决

1. 前言

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。


2.1 实现格式转换功能

该方法就设置了一个入参,即文件路径。参数ffmpegPath是@value引入的yml配置,如下图
在这里插入图片描述
指向的路径下放入FFmpeg的.exe文件即可。
在这里插入图片描述

&#64;Value("${ffmpeg.path}")String ffmpegPath;public String transCoding(String path) throws IOException {String ffmpegExePath &#61; new ClassPathResource(ffmpegPath&#43;"/ffmpeg.exe").getAbsolutePath();ArrayList command &#61; new ArrayList<>();command.add(ffmpegExePath);command.add("-i");command.add(path);command.add("-vcodec");command.add("copy");command.add("-f");command.add("mpegts");String s &#61; "E:\\data\\split\\" &#43; IdUtil.simpleUUID() &#43; ".mp4";command.add(s);// 执行操作ProcessBuilder builder &#61; new ProcessBuilder();builder.command(command);builder.redirectErrorStream(true);Process process &#61; builder.start();return s;}

2.2 实现视频剪辑

public String videoSpit(String path, String startTime, String duration) throws IOException {int i &#61; Integer.parseInt(startTime) / 1000;int i1 &#61; Integer.parseInt(duration) / 1000;String ffmpegExePath &#61; new ClassPathResource(ffmpegPath &#43;"/ffmpeg.exe").getAbsolutePath();List command &#61; new ArrayList<>();command.add(ffmpegExePath);command.add("-ss");command.add(String.valueOf(i));command.add("-t");command.add(String.valueOf(i1));command.add("-accurate_seek");command.add("-i");if (!FileUtil.file(path).isFile()) {return "文件不存在&#xff0c;请检查&#xff01;&#xff01;";}command.add(path);command.add("-codec");command.add("copy");command.add("-avoid_negative_ts");command.add("1");String s &#61; IdUtil.simpleUUID();//本地开发写死路径String substring &#61; path.substring(path.lastIndexOf("."));String e1 &#61; "E:\\data\\split\\" &#43; s &#43; path.substring(path.lastIndexOf("."));StringBuilder stringBuffer &#61; new StringBuilder();//业务需求&#xff0c;判断是否为mp4&#xff0c;如不需要可以去掉if (!"mp4".equals(substring)) {String s1 &#61; transCoding(e1);command.add(s1);stringBuffer.append(s1);}else {command.add(e1);stringBuffer.append(e1);}try {System.out.println(command);ProcessBuilder builder &#61; new ProcessBuilder();builder.command(command);//正常信息和错误信息合并输出builder.redirectErrorStream(true);//开始执行命令Process process &#61; builder.start();//如果你想获取到执行完后的信息&#xff0c;那么下面的代码也是需要的StringBuilder sbf &#61; new StringBuilder();String line;BufferedReader br &#61; new BufferedReader(new InputStreamReader(process.getInputStream()));while ((line &#61; br.readLine()) !&#61; null) {sbf.append(line);sbf.append(" ");}String resultInfo &#61; sbf.toString();System.out.println(resultInfo);System.out.println(stringBuffer);return stringBuffer.toString();} catch (IOException e) {e.printStackTrace();}return "操作失败";}

path 是文件路径&#xff0c;startTime是开始时间&#xff0c;duration是持续时间&#xff0c;我这里传入的时间是ms&#xff0c;所以先转换成s。方便FFmpeg处理


2.3 实现对指定区域的裁剪并切割

public void spit(String filePath, Integer startTime, String location, String continuous, Integer number) throws IOException {ArrayList command &#61; new ArrayList<>();DecimalFormat df &#61; new DecimalFormat("0.00");StringBuilder stringBuffer &#61; new StringBuilder();for (int i &#61; 0; i

filePath 文件路径
startTime 开始时间&#xff08;单位/s&#xff09;
location 裁剪的位置&#xff0c;格式如&#xff1a;crop&#61;w&#61;100:h&#61;100:x&#61;12:y&#61;34 &#xff0c;其中w和h指的是裁剪完的帧宽度和帧高度&#xff0c;x和y指裁剪的坐标点&#xff0c;裁剪时会按照该点坐标往右下裁剪。
continuous 持续时间
number 颗粒度 该参数是业务为需求定制&#xff0c;因为我需要按照业务会把视频以0.1s、0.01s切片&#xff0c;则此参数影响for循环次数&#xff0c;根据具体业务修改

截取前&#xff1a;
在这里插入图片描述

截取后&#xff1a;
在这里插入图片描述


推荐阅读
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
手机用户2502914287
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有