怀念夏天 发表于 2024-9-8 06:48:06

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

最近工作中在使用FFmpeg,加上之前写过较多的SpringBoot的Starter,以是干脆再写一个FFmpeg的Starter出来给大家使用。
起首我们来相识一下FFmpeg能干什么,FFmpeg 是一个强大的下令行工具和库聚集,用于处理多媒体数据。它可以用来做以下事变:


[*]解码:将音频和视频从压缩格式转换成原始数据。
[*]编码:将音频和视频从原始数据压缩成各种格式。
[*]转码:将一种格式的音频或视频转换为另一种格式。
[*]复用:将音频、视频和其他流归并到一个容器中。
[*]解复用:从一个容器中分离出音频、视频和其他流。
[*]流媒体:在网络上传输音频和视频流。
[*]过滤:对音频和视频应用各种结果和调整。
[*]播放:直接播放媒体文件。
FFmpeg支持广泛的编解码器和容器格式,并且由于其开源性子,被广泛应用于各种多媒体应用程序中,包括视频会议软件、在线视频平台、编辑软件等。
比方
https://i-blog.csdnimg.cn/direct/94d4a6a7bbef49feacef7ec0eb4f0914.png
作者很喜欢的一款截图软件ShareX就使用到了FFmpeg的功能。
现在ffmpeg-spring-boot-starter已发布,maven地点为
ffmpeg-spring-boot-starter
https://i-blog.csdnimg.cn/direct/248cc338164a42c2a77fe314ece89cb6.png
那么怎样使用ffmpeg-spring-boot-starter 呢?
第一步,新建一个SpringBoot项目

SpringBoot入门:怎样新建SpringBoot项目(保姆级教程)
第二步,在pom文件内里引入jar包

<dependency>
    <groupId>io.gitee.wangfugui-ma</groupId>
    <artifactId>ffmpeg-spring-boot-starter</artifactId>
    <version>${最新版}</version>
</dependency>
第三步,设置你的ffmpeg信息

在yml大概properties文件中设置如下信息
ffmpeg.ffmpegPath=D:\\ffmpeg-7.0.1-full_build\\bin\\
注意这里要设置为你所安装ffmpeg的bin路径,也就是脚本(ffmpeg.exe)所在的目录,之以是这样筹划的原因就是可以不消在系统中设置环境变量,直接跳过了这一个环节(一切为了Starter)
第四步,引入FFmpegTemplate

    @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实验器完成媒体文件格式的转换。
就像这样:
    @Test
    void convert() {
      ffmpegTemplate.convert("D:\\video.mp4","D:\\video.avi");
    }
extractAudio(String inputFile)



[*]功能:精确提取媒体文件的时长信息。
[*]参数:inputFile - 需要提取时长信息的媒体文件路径。
[*]实现:构造特定的FFmpeg下令,仅哀求媒体时长数据,直接调用FFmpeg实验器并解析返回的时长值。
就像这样:
    @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 - 竣事时间。
[*]实现:构造FFmpeg下令,指定视频片断的开始与竣事时间,直接调用FFmpeg实验器,实现视频片断的精确截取。
@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实验器,完成媒体文件分辨率的调整。
    @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实验器,完成媒体文件的精确裁剪。
    @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实验器,完成字幕的内嵌操作。
    @Test
    void embedSubtitle() {
      ffmpegTemplate.embedSubtitle("D:\\video.mp4","D:\\video1211.mp4","D:\\srt.srt");
    }
merge(String inputFile, String outputFile)



[*]功能: 通过外部ffmpeg工具将多个视频文件归并成一个。
[*]参数:

[*]inputFile: 包含待归并视频列表的文本文件路径。
[*]outputFile: 归并后视频的输出路径。

是这样用的:
   @Test
    void merge() {
      ffmpegTemplate.merge("D:\\mylist.txt","D:\\videoBig.mp4");
    }
注意,这个mylist.txt文件长这样:
https://i-blog.csdnimg.cn/direct/9d0629c59b8348e3ab551f2573f971a9.png
后续版本思量支持


[*]添加更多丰富的api
[*]区分win和Linux环境(脚本实验条件差异)
[*]支持在系统设置环境变量(用户如果没有设置设置文件的ffmpegPath信息可以自动使用环境变量)
   https://img-blog.csdnimg.cn/img_convert/7e5d6303bac33a439cb406fc76313585.png#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 我写了个ffmpeg-spring-boot-starter 使得Java能剪辑视频!!