我写了个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信息可以自动使用环境变量)
相关推荐
儿时可乖了34 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol35 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-13141 小时前
jdk各个版本介绍
java
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
简鹿办公1 小时前
如何提取某站 MV 视频中的音乐为 MP3 音频
音视频·简鹿视频格式转换器·视频提取mp3音频
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
yufengxinpian1 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件