# ffmpeg-spring-boot-starter **Repository Path**: LevelCoder/ffmpeg-spring-boot-starter ## Basic Information - **Project Name**: ffmpeg-spring-boot-starter - **Description**: 最近工作中在使用FFmpeg,加上之前写过较多的SpringBoot的Starter,所以干脆再写一个FFmpeg的Starter出来给大家使用。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 10 - **Created**: 2024-09-29 - **Last Updated**: 2024-09-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 最近工作中在使用FFmpeg,加上之前写过较多的SpringBoot的Starter,所以干脆再写一个FFmpeg的Starter出来给大家使用。 首先我们来了解一下FFmpeg能干什么,FFmpeg 是一个强大的命令行工具和库集合,用于处理多媒体数据。它可以用来做以下事情: - 解码:将音频和视频从压缩格式转换成原始数据。 - 编码:将音频和视频从原始数据压缩成各种格式。 - 转码:将一种格式的音频或视频转换为另一种格式。 - 复用:将音频、视频和其他流合并到一个容器中。 - 解复用:从一个容器中分离出音频、视频和其他流。 - 流媒体:在网络上传输音频和视频流。 - 过滤:对音频和视频应用各种效果和调整。 - 播放:直接播放媒体文件。 FFmpeg支持广泛的编解码器和容器格式,并且由于其开源性质,被广泛应用于各种多媒体应用程序中,包括视频会议软件、在线视频平台、编辑软件等。 例如 ![在这里插入图片描述](img/94d4a6a7bbef49feacef7ec0eb4f0914.png) 作者很喜欢的一款截图软件ShareX就使用到了FFmpeg的功能。 现在**ffmpeg-spring-boot-starter**已发布,maven地址为 [ffmpeg-spring-boot-starter](https://central.sonatype.com/artifact/io.gitee.wangfugui-ma/ffmpeg-spring-boot-starter) ![在这里插入图片描述](img/248cc338164a42c2a77fe314ece89cb6.png) 那么如何使用ffmpeg-spring-boot-starter 呢? ## 第一步,新建一个SpringBoot项目 [SpringBoot入门:如何新建SpringBoot项目(保姆级教程)](https://juejin.cn/post/7350168797637656576) ## 第二步,在pom文件里面引入jar包 ```java io.gitee.wangfugui-ma ffmpeg-spring-boot-starter ${最新版} ``` ## 第三步,配置你的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()`启动外部进程,通过线程分别读取标准输出流和错误输出流,确保命令执行过程中的所有输出都被记录并可被进一步分析。 - **异常**:抛出`IOException`和`InterruptedException`,需在调用处妥善处理。 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文件长这样: ![在这里插入图片描述](img/9d0629c59b8348e3ab551f2573f971a9.png) ## 后续版本考虑支持 1. 添加更多丰富的api 2. 区分win和Linux环境(脚本执行条件不同) 3. 支持在系统配置环境变量(用户如果没有配置配置文件的ffmpegPath信息可以自动使用环境变量) > ![在这里插入图片描述](img/7e5d6303bac33a439cb406fc76313585.png)