SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视频压缩,并介绍相关参数的设置。

一、FFmpeg简介
FFmpeg是一个可以用来录制、转换和流传输音视频的开源工具。它支持几乎所有的音视频格式,并提供了非常强大的编码、解码、转码、复用、解复用、流传输等功能。因此,FFmpeg成为许多视频处理应用程序的首选工具。
本教程将使用FFmpeg来对视频进行压缩处理。压缩过程中,我们会使用Java的 ProcessBuilder 来调用FFmpeg命令行工具,并设置合适的编码参数来减少CPU的使用负载。

二、Linux和Windows系统安装FFmpeg
1. 在Linux系统中安装FFmpeg
在Linux系统中,您可以使用包管理工具来安装FFmpeg。以CentOS 7为例:
sudo yum install epel-release -y
sudo yum install ffmpeg ffmpeg-devel -y

安装完成后,您可以通过以下命令查看FFmpeg的版本,以确认安装成功:
ffmpeg -version
2. 在Windows系统中安装FFmpeg
在Windows系统中,安装FFmpeg的步骤稍有不同。以下是详细步骤:
- 访问FFmpeg的官方网站,下载适用于Windows的FFmpeg压缩包。

- 解压下载的压缩包,并将解压后的文件夹放置到您希望的位置(例如
C:\ffmpeg)。 - 将FFmpeg添加到系统的环境变量中:
- 右键点击 “此电脑”,选择 “属性” -> “高级系统设置” -> “环境变量”。
- 在 “系统变量” 中找到 “Path”,点击 “编辑”,然后添加FFmpeg的
bin目录路径,例如C:\ffmpeg\bin。
- 打开命令提示符(CMD),输入以下命令以确认安装成功:
ffmpeg -version

如果显示FFmpeg的版本信息,则说明安装成功。
三、Java代码实现FFmpeg视频压缩
代码示例:
以下代码片段展示了如何使用Java调用FFmpeg对视频进行压缩。压缩过程中,我们会设置多种参数来控制压缩后的质量、速度和CPU使用率。
// 获取文件名和扩展名
String fileName = file.getOriginalFilename();
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();// 原始文件保存到临时目录
String tempPath = "/data2/tempVideo";
File originalFile = new File(tempPath, fileName);
file.transferTo(originalFile);// 设置压缩后的视频文件路径
String compressedFileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
File compressedFile = new File(tempPath, compressedFileName);// 调用ffmpeg命令行进行压缩
ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg","-i", originalFile.getAbsolutePath(),"-vcodec", "libx264", "-crf", "23", // 提高CRF值,降低画质来减少CPU使用"-preset", "ultrafast", // 更快的编码速度,减少CPU负载"-maxrate", "2000k", // 降低最大比特率"-bufsize", "4000k", // 减小缓冲区大小"-acodec", "aac", // 音频编码"-b:a", "128k", // 降低音频比特率"-movflags", "+faststart", // 提前索引以支持快速播放"-threads", "2", // 使用双线程,视系统资源增加compressedFile.getAbsolutePath() // 输出文件路径
);processBuilder.inheritIO();
Process process = processBuilder.start();
process.waitFor();
参数解释:
-i:指定输入文件路径。
-vcodec libx264:指定使用H.264编码器来进行视频压缩。
-crf 23:设置视频的质量,CRF值越大,压缩率越高,画质越低(通常值范围为0-51,推荐值为23)。
-preset ultrafast:设置编码的速度,ultrafast会减少CPU负载,但压缩率相对较低。
-maxrate 2000k:设置视频的最大比特率,用来控制视频的大小和质量。
-bufsize 4000k:缓冲区大小,用来平衡编码质量和速度。
-acodec aac和-b:a 128k:指定音频编码器和音频的比特率,压缩过程中也对音频进行处理。
-movflags +faststart:让视频在网络上能够尽快开始播放(通常用于流媒体)。
-threads 2:使用多线程进行处理,以减少处理时间。
四、提高压缩效率的技巧
在进行视频压缩时,CPU的使用率和压缩时间是两个需要关注的点。为了减少压缩带来的CPU压力,我们可以采取以下措施:
| 优化方法 | 描述 |
|---|---|
| 使用CRF值控制画质 | CRF值越大,视频压缩率越高,文件大小越小,但画质会降低。适当提高CRF值可以有效降低CPU使用率。 |
| 使用编码速度预设(Preset) | FFmpeg提供多种编码速度预设,ultrafast 是最快的编码方式,可以显著减少CPU的使用,但会影响压缩比。 |
| 限制比特率(Maxrate) | 通过限制视频的最大比特率,可以有效减少视频的大小和编码过程中对CPU的压力。 |
| 减少线程数 | 如果服务器的CPU资源有限,可以减少使用的线程数,以避免对系统资源造成过大负担。 |
五、总结
本文介绍了如何使用Java代码结合FFmpeg工具来对视频进行压缩,详细说明了每一个参数的作用及其对压缩效果的影响。通过合理设置FFmpeg的压缩参数,我们可以在压缩视频的同时,尽可能地减少对系统资源的占用,提高视频处理效率。
FFmpeg是一个非常强大且灵活的工具,适用于各类音视频处理需求。通过将其集成到您的Java项目中,您可以实现高效的音视频处理功能,为您的用户提供更优质的体验。
希望本篇教程对您有帮助,如果您在实际使用过程中遇到任何问题,欢迎留言讨论。

相关文章:
SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…...
shell bash---类似数组类型
0 Preface/Foreword C/C,Python,Java等编程语言,都含有数组类型,那么shell脚本是不是也有类似的语法呢? 1 类似数组类型 1.1 ()类似数组类型 #! /bin/bashecho "Welcome to bash world!" anim…...
IIoT(Industrial Internet of Things,工业物联网)
IIoT(Industrial Internet of Things,工业物联网) 是指物联网技术在工业领域的应用。它将工业设备、传感器、控制系统、数据采集设备等通过互联网或局域网连接起来,实现设备的互联互通和智能化管理。IIoT的目标是提高工业生产效率…...
【C++】引用(reference)
引用是对一个变量或者对象取的别名 定义:真名的数据类型& 别名 真名; 既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。 对引用的操作和对引用对应的变量的操作是完全等价的引用…...
学习日记_20241115_聚类方法(层次聚类)
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...
安卓开发怎么获取返回上一级activity事件
在Android开发中,要获取返回上一级Activity的事件,通常是通过点击设备上的返回按钮或者在代码中调用finish()方法时触发的。为了处理这个事件,你可以在当前Activity中重写onBackPressed()方法。 以下是一个简单的例子: Override…...
神经网络与Transformer详解
一、模型就是一个数学公式 模型可以描述为:给定一组输入数据,经过一系列数学公式计算后,输出n个概率,分别代表该用户对话属于某分类的概率。 图中 a, b 就是模型的参数,a决定斜率,b决定截距。 二、神经网络的公式结构 举例:MNIST包含了70,000张手写数字的图像,其中…...
C语言之MakeFile
Makefile 的引入是为解决多文件项目中手动编译繁琐易错、缺乏自动化构建、项目管理维护困难以及跨平台构建不便等问题,实现自动化、规范化的项目构建与管理 MakeFile 简单的来说,MakeFile就是编写编译命令的文件 文件编写格式 目标:依赖文件列表 <Tab>命令列表…...
vue项目PC端和移动端实现在线预览docx、excel、pdf文件
可以参考vue-office官方github:GitHub - loonghe/vue-office: 支持word(.docx)、excel(.xlsx,.xls)、pdf等各类型office文件预览的vue组件集合,提供一站式office文件预览方案,支持vue2和3,也支持React等非Vue框架。…...
FlinkSql读取kafka数据流的方法(scala)
我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖: <dependency><groupId>org.apache.flink&…...
.NET 9 中 IFormFile 的详细使用讲解
在.NET应用程序中,处理文件上传是一个常见的需求。.NET 9 提供了 IFormFile 接口,它可以帮助我们轻松地处理来自客户端的文件上传。以下是 IFormFile 的详细使用讲解。 IFormFile 接口简介 IFormFile 是一个表示上传文件的接口,它提供了以下…...
使用阿里云远程访问 Synology Web Station 的指南
使用阿里云远程访问 Synology Web Station 的指南 本文将指导如何通过阿里云服务器配置 Nginx 和 FRP,远程访问部署在 Synology NAS 上的 Web Station 服务,同时支持 HTTPS 安全访问。 背景 通过 Synology NAS 的 Web Station,可以部署 Wor…...
LlamaFactory介绍
目录 一、什么是LlamaFactory 1. 安装 LlamaFactory 2. 下载 LLaMA 模型 3. 运行 LLaMA 模型 4. 微调 LLaMA 模型 5. 优化本地运行 6. 推理加速 7. 硬件要求 二、总结 一、什么是LlamaFactory LlamaFactory 是一个用于训练和运行 LLaMA(Meta 的开源大型语言模型)模型…...
vue 项目使用 nginx 部署
前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…...
<项目代码>YOLOv8 玉米地杂草识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
Wxml2Canvas小程序将dom转为图片,bug总结
1.显示文字 标签上面使用 data-type"text" 加上class名 <view data-type"text" class"my_draw_canvas"><text data-type"text" class"center my_draw_canvas" data-text"企业出游证明">企业出游证明…...
[ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
SpringMVC学习笔记(二)
五、Rest风格编程 (一)Rest风格URL规范介绍 1、什么是restful RESTful架构,就是目前最流行的一种互联网软件架构风格。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。REST这个词,是Roy T…...
51c嵌入式~单片机合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&…...
JavaScript:浏览器对象模型BOM
BOM介绍 浏览器对象模型(Brower Object Model,BOM)提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window BOM由一系列相关的对象构成,并且每个对象都提供了很多方法和属性。 BOM与DOM区别 DOM是文档对…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
