最近工作中在使用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项目(保姆级教程)
<dependency>
<groupId>io.gitee.wangfugui-ma</groupId>
<artifactId>ffmpeg-spring-boot-starter</artifactId>
<version>${最新版}</version>
</dependency>
在yml或者properties文件中配置如下信息
ffmpeg.ffmpegPath=D:\\ffmpeg-7.0.1-full_build\\bin\\
注意这里要配置为你所安装ffmpeg的bin路径,也就是脚本(ffmpeg.exe)所在的目录,之所以这样设计的原因就是可以不用在系统中配置环境变量,直接跳过了这一个环节(一切为了Starter)
@Autowired
private FFmpegTemplate ffmpegTemplate;
在你的项目中直接使用Autowired
注解注入FFmpegTemplate
即可使用
execute(String command)
command
- 需要执行的FFmpeg命令字符串。Runtime.getRuntime().exec()
启动外部进程,通过线程分别读取标准输出流和错误输出流,确保命令执行过程中的所有输出都被记录并可被进一步分析。IOException
和InterruptedException
,需在调用处妥善处理。FFmpeg执行器,这是这里面最核心的方法,之所以提供这个方法,是来保证大家的自定义的需求,例如FFmpegTemplate中没有封装的方法,可以灵活自定义ffmpeg的执行参数。
convert(String inputFile, String outputFile)
inputFile
- 待转换的源文件路径;outputFile
- 转换后的目标文件路径。就像这样:
@Test
void convert() {
ffmpegTemplate.convert("D:\\video.mp4","D:\\video.avi");
}
extractAudio(String inputFile)
inputFile
- 需要提取时长信息的媒体文件路径。就像这样:
@Test
void extractAudio() { System.out.println(ffmpegTemplate.extractAudio("D:\\video.mp4"));
}
copy(String inputFile, String outputFile)
功能:执行流复制,即在不重新编码的情况下快速复制媒体文件。
参数:inputFile
- 源媒体文件路径;outputFile
- 目标媒体文件路径。
实现:创建包含流复制指令的FFmpeg命令,直接调用FFmpeg执行器,以达到高效复制的目的。
就像这样:
@Test
void copy() {
ffmpegTemplate.copy("D:\\video.mp4","D:\\video.avi");
}
captureVideoFootage(String inputFile, String outputFile, String startTime, String endTime)
inputFile
- 源视频文件路径;outputFile
- 截取片段的目标文件路径;startTime
- 开始时间;endTime
- 结束时间。@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
- 目标高度。 @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
- 裁剪框高度。 @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
- 字幕文件路径。 @Test
void embedSubtitle() {
ffmpegTemplate.embedSubtitle("D:\\video.mp4","D:\\video1211.mp4","D:\\srt.srt");
}
merge(String inputFile, String outputFile)
inputFile
: 包含待合并视频列表的文本文件路径。outputFile
: 合并后视频的输出路径。是这样用的:
@Test
void merge() {
ffmpegTemplate.merge("D:\\mylist.txt","D:\\videoBig.mp4");
}
注意,这个mylist.txt文件长这样:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。