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

news2024/9/25 13:21:24

最近工作中在使用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包

<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()启动外部进程,通过线程分别读取标准输出流和错误输出流,确保命令执行过程中的所有输出都被记录并可被进一步分析。
  • 异常:抛出IOExceptionInterruptedException,需在调用处妥善处理。

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文件长这样:
在这里插入图片描述

后续版本考虑支持

  1. 添加更多丰富的api
  2. 区分win和Linux环境(脚本执行条件不同)
  3. 支持在系统配置环境变量(用户如果没有配置配置文件的ffmpegPath信息可以自动使用环境变量)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【redis】redis编译和redis.conf配置

下载源码 reids 解压编译 # 解压 tar -zxvf redis-5.0.14.tar.gz cd redis-5.0.14/ make PREFIX/opt/redis install# requirepass root # 开启远程访问 bind 0.0.0.0 protected-mode no # 修改日志打印路径&#xff0c;修改redis.conf daemonize yes logfile /var/log/redis.…

[深度学习][LLM]:浮点数怎么表示,什么是混合精度训练?

混合精度训练 混合精度训练1. 浮点表示法&#xff1a;[IEEE](https://zh.wikipedia.org/wiki/电气电子工程师协会)二进制浮点数算术标准&#xff08;IEEE 754&#xff09;1.1 浮点数剖析1.2 举例说明例子 1:例子 2: 1.3 浮点数比较1.4 浮点数的舍入 2. 混合精度训练2.1 为什么需…

网络编程day01(IP地址、Socket、端口号)

目录 【1】IP地址 1》基本概念 IP地址 NAT设备&#xff08;网络地址转换&#xff09; DHCP服务器&#xff08;动态主机配置协议&#xff09; 2》网络号/主机号&#xff08;二级划分&#xff09; 3》IP地址分类 特殊地址 4》子网掩码 5》三级划分 【2】socket 1》socke…

浅谈人工智能之基于AutoGen Studio+litellm+ollama构建model

浅谈人工智能之基于AutoGen Studiolitellmollama构建model 摘要 随着自然语言处理技术的飞速发展&#xff0c;基于大型语言模型&#xff08;Large Language Models, LLMs&#xff09;的应用越来越广泛。本指南旨在介绍如何利用AutoGen Studio、litellm和ollama这三大工具&…

【数据结果-二维前缀和】力扣221. 最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

Java毕业设计 基于SpringBoot vue社区养老服务管理系统

Java毕业设计 基于SpringBoot vue社区养老服务管理系统 SpringBoot 社区养老服务管理系统 功能介绍 护工: 登录 主页 老人管理 健康记录管理 管理员: 登录 主页 用户管理 床位类型管理 床位管理 护工管理 老人管理 预约记录管理 来访记录管理 健康记录管理 费用管理…

网络编程套接字(Socket)详解 V✪ω✪V

目录 &#x1f348;一.什么是网络编程 1.1什么是网络编程&#xff1f; 1.2网络通信中的基本概念&#xff1a; &#x1f347;二.Soket&#xff08;套接字&#xff09;→网络编程的基础 2.1概念&#xff1a; 2.2Socket套接字分类: 数据包套接字&#xff1a;使用传输层UDP协…

Leetcode JAVA刷刷站(111)二叉树的最小深度

一、题目概述 二、思路方向 在Java中&#xff0c;要找出二叉树的最小深度&#xff0c;我们可以使用递归的方法。基本思路是&#xff0c;对于给定的根节点&#xff0c;如果它是空的&#xff0c;那么最小深度为0&#xff08;但实际上&#xff0c;空树没有深度&#xff0c;但在…

ARM 工业计算机搭载 FUXA 组态软件:开启智能制造新时代

工业自动化已经成为提高生产效率、保证产品质量以及提升企业竞争力的关键因素。而在工业自动化的舞台上&#xff0c;FUXA 组态软件与 ARM 工业计算机的组合正发挥着越来越重要的作用&#xff0c;以其高效稳定、数据可视化、实时监控等优势&#xff0c;在复杂场景应用中展现出卓…

MySQL——基础操作(1)

一、数据库的创建 1.1 库的创建 在使用数据库时&#xff0c;最先操作的是创建一个数据库。使用语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name]; 对上述语句进行简单说明&#xf…

最佳视频编辑软件,适合专业人士和初学者

如果你想利用视频编辑软件&#xff0c;即使你没有很多专业知识。一段精彩的视频可能有助于你公司的成功。然而&#xff0c;出色的视频镜头只能在编辑工具的帮助下创建。有许多免费程序可供选择&#xff0c;有许多不同的需求和理由需要编辑。在编辑方面&#xff0c;无论你是专业…

【接入指南】快手API

快手小店自2018年上线以来&#xff0c;业务发展迅速&#xff0c;2年时间GMV增长1000倍&#xff0c;活跃商家达到100万&#xff0c;已经成为主流的电商平台&#xff0c;为支撑广大商家的业务处理需求&#xff0c;快手API成为快手平台业务处理软件高效、便捷的开发工具&#xff0…

C++学习笔记----6、内存管理(一)---- 使用动态内存(4)

3.6、多维自由内存空间上的数组 如果需要在运行时决定多维数组的维度&#xff0c;可以使用在自由内存空间上的数组。与一维动态分配的数组通过指针访问一样&#xff0c;多维动态分配的数组也可以通过指针访问。不同的地方在于在二维数组中&#xff0c;需要用一个指向指针的指针…

『功能项目』项目优化【21】

我们打开上一篇20主角身旁召唤/隐藏坐骑的项目&#xff0c; 本章要做的事情如以下几点&#xff1a; 1.优化资源包Resources下的层级分类 2.优化脚本包Scripts下的脚本分类 3.地形Terrain的优化&#xff08;只让主角点击地面移动跳过其他石头山树等其他物体&#xff09; 首…

笔记整理—uboot番外(3)环境变量的作用

环境变量的最大一个作用就是&#xff0c;能够在不修改代码的情况下去影响应用的运行情况。 环境变量的优先级问题&#xff1a;有环境变量的情况下优先使用环境变量&#xff0c;没有环境变量则使用代码中的值&#xff08;全局变量一类的变量&#xff09;。 例如&#xff0c;mach…

随身WiFi实测,真相让你大跌眼镜!随身携带的随身wifi哪个比较好?什么品牌的随身wifi好用?

都说随身wifi坑多&#xff0c;谁买谁是冤大头&#xff01;我还真不信这个邪&#xff01;本次我们对格行、京东云、迅优三款热门随身WiFi进行了开箱测试&#xff0c;实测周期为2个月。今天从外观、网速、续航、售后、适合人群及整体评价等方面进行全面剖析。 一、京东云随身WiFi…

Qt 杨帆起航

这里写自定义目录标题 引入1、Qt安装1.1 OSX1.1.1 HomeBrew 方式安装1.1.2 自己编译 1.2 Windows x、IDEx.1 Clionx.1.1 ui 文件到Qt设计师x.1.2 ui文件更新&#xff0c;为及时调用uiCompile生成或更新cpp文件x.1.3 qt资源文件创建x.1.4 帮助文档的配置 引入 机缘巧合&#xf…

图像缩放操作

图像缩放操作 微信公众号&#xff1a;幼儿园的学霸 在图像处理过程中&#xff0c;有时需要把图像调整到同样大小&#xff0c;便于处理&#xff0c;这时需要用到图像resize()&#xff0c;该函数比较简单&#xff0c;此处对函数中涉及的各种插值方法进行分析。 目录 文章目录 图…

利用Python解析json生成PPT、xmind思维导图教程

文章目录 背景部分json样例PPT生成思维导图生成 背景 通过调用阿里通义听悟接口&#xff0c;对视频进行了语音转写、智能总结等&#xff0c;现在需要解析返回的PPT和思维导图json文件&#xff0c;以可视化的形式进行呈现。关键点在于&#xff1a; PPT生成时&#xff0c;注意用…