我写了个ffmpeg-spring-boot-starter 使得Java能剪辑视频!!

最近工作中在使用FFmpeg,加上之前写过较多的SpringBoot的Starter,所以干脆再写一个FFmpeg的Starter出来给大家使用。

首先我们来了解一下FFmpeg能干什么,FFmpeg 是一个强大的命令行工具和库集合,用于处理多媒体数据。它可以用来做以下事情:

  • 解码:将音频和视频从压缩格式转换成原始数据。
  • 编码:将音频和视频从原始数据压缩成各种格式。
  • 转码:将一种格式的音频或视频转换为另一种格式。
  • 复用:将音频、视频和其他流合并到一个容器中。
  • 解复用:从一个容器中分离出音频、视频和其他流。
  • 流媒体:在网络上传输音频和视频流。
  • 过滤:对音频和视频应用各种效果和调整。
  • 播放:直接播放媒体文件。

FFmpeg支持广泛的编解码器和容器格式,并且由于其开源性质,被广泛应用于各种多媒体应用程序中,包括视频会议软件、在线视频平台、编辑软件等。

例如

作者很喜欢的一款截图软件ShareX就使用到了FFmpeg的功能。

现在ffmpeg-spring-boot-starter 已发布,maven地址为
ffmpeg-spring-boot-starter

那么如何使用ffmpeg-spring-boot-starter 呢?

第一步,新建一个SpringBoot项目

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

第二步,在pom文件里面引入jar包

java 复制代码
<dependency>
    <groupId>io.gitee.wangfugui-ma</groupId>
    <artifactId>ffmpeg-spring-boot-starter</artifactId>
    <version>${最新版}</version>
</dependency>

第三步,配置你的ffmpeg信息

在yml或者properties文件中配置如下信息

yml 复制代码
ffmpeg.ffmpegPath=D:\\ffmpeg-7.0.1-full_build\\bin\\

注意这里要配置为你所安装ffmpeg的bin路径,也就是脚本(ffmpeg.exe)所在的目录,之所以这样设计的原因就是可以不用在系统中配置环境变量,直接跳过了这一个环节(一切为了Starter)

第四步,引入FFmpegTemplate

java 复制代码
    @Autowired
    private FFmpegTemplate ffmpegTemplate;

在你的项目中直接使用Autowired注解注入FFmpegTemplate即可使用

第五步,使用FFmpegTemplate

execute(String command)
  • 功能:执行任意FFmpeg命令,捕获并返回命令执行的输出结果。
  • 参数command - 需要执行的FFmpeg命令字符串。
  • 返回:命令执行的输出结果字符串。
  • 实现 :使用Runtime.getRuntime().exec()启动外部进程,通过线程分别读取标准输出流和错误输出流,确保命令执行过程中的所有输出都被记录并可被进一步分析。
  • 异常 :抛出IOExceptionInterruptedException,需在调用处妥善处理。

FFmpeg执行器,这是这里面最核心的方法,之所以提供这个方法,是来保证大家的自定义的需求,例如FFmpegTemplate中没有封装的方法,可以灵活自定义ffmpeg的执行参数。

convert(String inputFile, String outputFile)
  • 功能:实现媒体文件格式转换。
  • 参数inputFile - 待转换的源文件路径;outputFile - 转换后的目标文件路径。
  • 实现:构建FFmpeg命令,调用FFmpeg执行器完成媒体文件格式的转换。

就像这样:

java 复制代码
    @Test
    void convert() {
        ffmpegTemplate.convert("D:\\video.mp4","D:\\video.avi");
    }
extractAudio(String inputFile)
  • 功能:精确提取媒体文件的时长信息。
  • 参数inputFile - 需要提取时长信息的媒体文件路径。
  • 实现:构造特定的FFmpeg命令,仅请求媒体时长数据,直接调用FFmpeg执行器并解析返回的时长值。

就像这样:

java 复制代码
    @Test
    void extractAudio() {  System.out.println(ffmpegTemplate.extractAudio("D:\\video.mp4"));
    }
copy(String inputFile, String outputFile)
  • 功能:执行流复制,即在不重新编码的情况下快速复制媒体文件。

  • 参数inputFile - 源媒体文件路径;outputFile - 目标媒体文件路径。

  • 实现:创建包含流复制指令的FFmpeg命令,直接调用FFmpeg执行器,以达到高效复制的目的。

    就像这样:

java 复制代码
    @Test
    void copy() {
        ffmpegTemplate.copy("D:\\video.mp4","D:\\video.avi");
    }
captureVideoFootage(String inputFile, String outputFile, String startTime, String endTime)
  • 功能:精准截取视频片段。
  • 参数inputFile - 源视频文件路径;outputFile - 截取片段的目标文件路径;startTime - 开始时间;endTime - 结束时间。
  • 实现:构造FFmpeg命令,指定视频片段的开始与结束时间,直接调用FFmpeg执行器,实现视频片段的精确截取。
java 复制代码
@Test
    void captureVideoFootage() {
        ffmpegTemplate.captureVideoFootage("D:\\video.mp4","D:\\cut.mp4","00:01:01","00:01:12");
    }
scale(String inputFile, String outputFile, Integer width, Integer height)
  • 功能:调整媒体文件的分辨率。
  • 参数inputFile - 源媒体文件路径;outputFile - 输出媒体文件路径;width - 目标宽度;height - 目标高度。
  • 实现:创建包含分辨率调整指令的FFmpeg命令,直接调用FFmpeg执行器,完成媒体文件分辨率的调整。
java 复制代码
    @Test
    void scale() {
        ffmpegTemplate.scale("D:\\video.mp4","D:\\video11.mp4",640,480);
    }
cut(String inputFile, String outputFile, Integer x, Integer y, Integer width, Integer height)
  • 功能:实现媒体文件的精确裁剪。
  • 参数inputFile - 源媒体文件路径;outputFile - 裁剪后媒体文件路径;x - 裁剪框左上角X坐标;y - 裁剪框左上角Y坐标;width - 裁剪框宽度;height - 裁剪框高度。
  • 实现:构造FFmpeg命令,指定裁剪框的坐标与尺寸,直接调用FFmpeg执行器,完成媒体文件的精确裁剪。
java 复制代码
    @Test
    void cut() {
        ffmpegTemplate.cut("D:\\video.mp4","D:\\video111.mp4",100,100,640,480);
    }
embedSubtitle(String inputFile, String outputFile, String subtitleFile)
  • 功能:将字幕文件内嵌至视频中。
  • 参数inputFile - 视频文件路径;outputFile - 输出视频文件路径;subtitleFile - 字幕文件路径。
  • 实现:构造FFmpeg命令,将字幕文件内嵌至视频中,直接调用FFmpeg执行器,完成字幕的内嵌操作。
java 复制代码
    @Test
    void embedSubtitle() {
        ffmpegTemplate.embedSubtitle("D:\\video.mp4","D:\\video1211.mp4","D:\\srt.srt");
    }
merge(String inputFile, String outputFile)
  • 功能: 通过外部ffmpeg工具将多个视频文件合并成一个。
  • 参数 :
    • inputFile: 包含待合并视频列表的文本文件路径。
    • outputFile: 合并后视频的输出路径。

是这样用的:

java 复制代码
   @Test
    void merge() {
        ffmpegTemplate.merge("D:\\mylist.txt","D:\\videoBig.mp4");
    }

注意,这个mylist.txt文件长这样:

后续版本考虑支持

  1. 添加更多丰富的api
  2. 区分win和Linux环境(脚本执行条件不同)
  3. 支持在系统配置环境变量(用户如果没有配置配置文件的ffmpegPath信息可以自动使用环境变量)
相关推荐
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶6 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb