JAVA:Spring Boot 集成 FFmpeg 完成多媒体处理

news/2025/11/7 17:08:37/文章来源:https://www.cnblogs.com/yangykaifa/p/19200297

JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理

一、简述

在现代 Web 应用中,音视频处理需求越来越常见,例如:视频转码、截图、音频提取、格式转换等。FFmpeg 是一个功能极其强大的开源音视频处理工具,可以帮助我们高效完成这些任务。本文将介绍如何在 Spring Boot 项目中集成 FFmpeg,并实现一些常见的应用场景。

二、为什么选择 FFmpeg

Spring Boot + FFmpeg,可以快速构建出一个支持多媒体处理的服务。

1、准备工作

在开发/部署机器上需要安装 FFmpeg,并配置环境变量。

Linux/macOS:

# macOS (Homebrew)
brew install ffmpeg
# Ubuntu
sudo apt-get install ffmpeg

Windows:前往 FFmpeg 官网 下载编译好的版本,解压后将 bin 路径加入系统环境变量。

测试是否成功:

ffmpeg -version

2、集成方案

在 Java 中调用 FFmpeg 主要有两种方式:

  • 直接调用命令行(通过 ProcessBuilderRuntime.exec
  • 使用 Java 封装库(如 JAVE、FFmpeg CLI Wrapper)

下面重点演示 命令行调用方式,因为它灵活、依赖少,适合快速上手。

三、实践样例

1、定义工具类调用 FFmpeg

package com.example.ffmpeg.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class FFmpegUtil {
/**
* 执行 FFmpeg 命令
*
* @param command FFmpeg 命令字符串
* @throws Exception
*/
public static void executeCommand(String command) throws Exception {
ProcessBuilder builder = new ProcessBuilder(command.split(" "));
builder.redirectErrorStream(true);
Process process = builder.start();
// 输出日志
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("[FFmpeg] " + line);
}
}
int exitCode = process.waitFor();
if (exitCode != 0) {
throw new RuntimeException("FFmpeg 执行失败,退出码:" + exitCode);
}
}
}

2、常见应用场景

视频转码

String cmd =  "ffmpeg -i input.mp4 output.avi";
FFmpegUtil.executeCommand(cmd);

视频截图

String cmd = "ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output.jpg";
FFmpegUtil.executeCommand(cmd);

提取音频

String cmd = "ffmpeg -i input.mp4 -q:a 0 -map a output.mp3";
FFmpegUtil.executeCommand(cmd);

3、提供 REST 接口

package com.example.ffmpeg.controller;
import com.example.ffmpeg.util.FFmpegUtil;
import org.springframework.web.bind.annotation .*;
@RestController
@RequestMapping("/ffmpeg")
public class FFmpegController {
@GetMapping("/screenshot")
public String screenshot(@RequestParam String input, @RequestParam String output) {
try {
String cmd = String.format("ffmpeg -i %s -ss 00:00:02 -vframes 1 %s", input, output);
FFmpegUtil.executeCommand(cmd);
return "截图成功,输出文件:" + output;
} catch (Exception e) {
return "截图失败:" + e.getMessage();
}
}
}

这样,我们就可以通过 HTTP 调用来触发 FFmpeg 的多媒体处理任务。

四、进阶优化

  • 异步执行:视频转码可能耗时较长,可以结合 @Async 或消息队列(如 RabbitMQ)异步处理。
  • 任务管理:引入数据库保存转码任务状态,便于查询和监控。
  • 分布式扩展:结合 Kubernetes / Docker,将 FFmpeg 处理服务水平扩展。
  • 日志收集:把 FFmpeg 输出日志统一收集,方便排错。
  • FFmpeg 封装库:如果不想写命令,可以考虑使用 ffmpeg-cli-wrapper,以面向对象的方式构建命令。

五、总结

本文介绍了如何在 Spring Boot 项目中集成 FFmpeg,通过命令行调用实现视频转码、截图、音频提取等功能,并提供了 REST 接口示例。

FFmpeg 功能非常丰富,结合 Spring Boot 可以快速构建一个 多媒体处理平台,在实际业务中应用场景广泛,比如短视频应用、直播平台、智能监控等。

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

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

相关文章

Windows如何解决远程连接提示内部错误的问题?

在 Windows 系统中,远程桌面连接提示 “内部错误” 是一个常见问题,可能由网络、配置、服务或系统更新引起。以下是详细的排查与解决方法:1. 常见原因分析网络问题网络不稳定或目标计算机与本地计算机之间的连接中断…

DS(4):从离线与在线角度开始的一些杂谈

CDQ 分治 CDQ 分治的原主旨教义是解决高维数点问题,但是我们发现似乎我们并不总是只用它来解决这种问题,有的时候我们会利用分治做动态问题转静态问题。 一般我们认为这种通过分治来保证一个顺序就是 cdq 分治。通常…

buildroot下的can问题

buildroot下的can问题 问题:参考:https://www.cnblogs.com/yangjinghui/p/17695223.html使能 can-utils 和 iproute2,支持 ip 指令设置 can 波特率、启动以及停止> Target packages> Networking applications…

高一讲课

栈 又叫后进先出表 给出一个栈常用功能的实现 struct sta{int tp,a[(int)1e7];void push(int x){a[++t]=x;}int top(int x){if(t==0)return -1;return a[t];}int size(){return t;}void pop(){if(t==0)return ;else t-…

Windows 10 本地部署本地知识库 RAGFlow + Qwen3 1.7B

参考豆包 https://www.bilibili.com/video/BV1WiP2ezE5a/ (视频教程) https://blog.csdn.net/zengmingen/article/details/143687404 https://zhuanlan.zhihu.com/p/49335520708 https://github.com/infiniflow/ragf…

2025 最新儿童早发育产品口碑推荐榜:药食同源调节性腺轴 + 权威测评认证,十大优选品牌最新推荐

引言 儿童早发育问题已成为家长群体关注的核心健康议题,相关产品市场需求持续攀升,但品质参差的现状让选购决策愈发困难。为提供权威参考,本次榜单联合儿童健康协会、营养监测中心及儿科研究机构,基于《儿童保健杂…

Ubuntu通过命令行安装REALVNC

复制本地安装包文件到其他服务器 scp /home/jzrobot/VNC-Server-6.11.0-Linux-x64.deb jzrobot@192.168.10.149:/home/jzrobot 安装程序 sudo dpkg -i VNC-Server-6.11.0-Linux-x64.deb 激活许可 sudo vnclicense -add…

气氛

即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。反之亦然同理,推论自然成立。略去过程 $\rm QED$,由上可知证毕。

2025年室内展厅LED显示屏厂家权威推荐榜单:室内沙盘显示屏/室内显示屏/酒店LED显示屏源头厂家精选

在数字化展示时代,室内展厅LED显示屏已成为信息传递与体验升级的核心载体。一份权威的厂家推荐榜单能为您的选择提供可靠参考。 室内展厅LED显示屏作为企业形象展示、产品呈现与信息交互的重要窗口,其技术水准与显示…

2025 年最新推荐集装箱拖车公司榜单:全方位解析优质厂家实力,助力企业精准选合作商

本次榜单由行业权威协会联合专业测评机构共同打造,测评过程严格遵循 “多维度、重数据、强实操” 原则,涵盖资质认证、技术实力、资源配置、服务质量、客户口碑五大核心维度,共设置 28 项细分指标。测评机构抽取近 …

MATLAB实现自适应卡尔曼滤波(AKF)

一、理论基础与算法原理 自适应卡尔曼滤波(AKF)通过动态调整过程噪声协方差矩阵Q和观测噪声协方差矩阵R,解决传统卡尔曼滤波在噪声统计特性未知或时变场景下的性能退化问题。其核心改进体现在:噪声自适应机制:根据…

2025年制作遮阳棚厂家权威推荐榜单:室外遮阳棚/自动伸缩遮阳棚/伸缩遮阳篷源头厂家精选

在户外生活空间备受重视的今天,一款优质的遮阳棚已成为连接室内外生活的重要桥梁,不仅能有效拓展活动空间,更能提升建筑的整体美感与实用性。 随着户外生活理念的普及和建筑空间利用率的提升,遮阳棚市场正迎来稳定…

下载Google Play 的APK,这样可以不用XAPK

https://apkmody.com/-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------(蓝奏云官网如果有地址失效了,可以私信我,后续看到会补充)…

单点登录相关

单点登录相关 @Controller public class HelloController {/*** 无需登录就可访问** @return*/@ResponseBody@GetMapping(value = "/hello")public String hello() {return "hello";}@GetMapping(…

在Ubuntu上配置Nginx实现开机自启功能

要在Ubuntu系统中配置Nginx以实现开机自启,我们可以通过系统的服务管理工具 systemd去实现。systemd是大多数当前Linux分发版使用的初始化系统和服务管理器,它允许你管理服务的启动行为。 安装Nginx 首先,确保你已经…

详细介绍:从零开始的C++学习生活 5:内存管理和模板初阶

详细介绍:从零开始的C++学习生活 5:内存管理和模板初阶pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

阿里云的边缘加速ESA

阿里云的边缘加速产品ESA,即是CDN又是安全防护产品。 最近还搞活动,每月可领免费基础版。 免费领取链接:http://s.tb.cn/e6.0Fu67m测速速度不错:

2025年广场喷泉订做厂家权威推荐榜单:喷泉/假山喷泉/音乐喷泉源头厂家精选

在城市景观升级与文旅融合发展的浪潮下,广场喷泉已从单一观赏设施演变为集艺术、科技与生态于一体的复合型景观,而定制厂家的专业能力直接决定了项目的最终价值。 广场喷泉作为现代城市公共空间的核心景观元素,其市…

Java映射操作:深入Map.getOrDefault与MapUtils方法

在Java中,Map接口是一种非常基础与广泛使用的数据结构,它存储键值对(key-value pairs)的集合,并且允许按照键(key)快速检索相应的值(value)。对于 Map的操作中,getOrDefault方法和Apache Commons Collection…

扫描线算法 矩形面积并 线段树与扫描线结合

关键是理解这里点对应的是一个区间,用来表示一段线段长度。要解决矩形面积并问题,高效的方法是扫描线算法结合线段树离散化,能处理高达 105 个矩形的规模。 核心结论 扫描线算法通过 “竖线扫描 + 区间更新” 计算面…