SpringBoot使用ffmpeg实现视频压缩

ffmpeg简介

FFmpeg 是一个开源的跨平台多媒体处理工具集,用于录制、转换、编辑和流式传输音频和视频。它功能强大,支持几乎所有常见的音视频格式,是多媒体处理领域的核心工具之一。
官方文档:https://ffmpeg.org/documentation.html

核心功能

格式转换

支持几乎所有音视频格式(如 MP4、AVI、MOV、MKV、MP3、AAC 等)的互相转换。
示例:

ffmpeg -i input.mp4 output.avi

编解码

支持 H.264、H.265(HEVC)、VP9、AAC、Opus 等编解码器。
可指定编码参数(如码率、帧率、分辨率等)。
示例:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

音视频处理

剪切、合并、提取音视频流。
调整分辨率、帧率、音量等。
示例:

# 剪切视频(从第10秒开始,截取5秒)
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 output.mp4

流媒体支持

支持 RTMP、HLS、DASH 等流媒体协议,可用于直播推流或拉流。
示例:

# 推流到RTMP服务器
ffmpeg -i input.mp4 -c:v libx264 -f flv rtmp://server/live/stream_key

滤镜(Filter)

添加水印、缩放、旋转、降噪、字幕嵌入等。
示例:

# 添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='Hello':x=10:y=10:fontsize=24:fontcolor=white" output.mp4

安装配置

linux安装

sudo yum install epel-release
sudo yum install ffmpeg
# 验证
ffmpeg -version

windows安装

官网地址:https://ffmpeg.org/download.html#build-windows
下载地址:https://www.gyan.dev/ffmpeg/builds/
在这里插入图片描述
下载上面两个都可以,一个是全量包,一个是必要包,下载后解压到你的目录

环境变量配置:在 系统变量 中找到 Path,点击 编辑,添加FFmpeg的 bin 目录路径,保存后使用 ffmpeg -version 验证

代码实现

package net.lab1024.sa.base.module.support.file.service;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 视频压缩工具类
 */
@Slf4j
public class FFmpegVideoCompressionUtil {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        compressVideo("E:\\Desktop\\video\\old.mp4", "E:\\Desktop\\video\\new.mp4");
        System.out.println("压缩完成,耗时: " + (System.currentTimeMillis() - startTime) + "ms");
    }

    /**
     * 压缩视频
     * @param inputPath 输入视频路径
     * @param outputPath 输出视频路径
     * @return 是否压缩成功
     */
    public static boolean compressVideo(String inputPath, String outputPath) {
        // 检查输入文件是否存在
        File inputFile = new File(inputPath);
        if (!inputFile.exists()) {
            log.error("输入文件不存在: {}", inputPath);
            return false;
        }

        try {
            // FFmpeg命令
            // -c:v libx264 视频编码器使用libx264,兼容性好
            // -profile:v high 更高的压缩率和视频质量
            // -level 4.0 最大分辨率4k
            // -pix_fmt yuv420p 像素格式为yuv420p,兼容性好且文件体积比yuv444p(无损)更小
            // -crf 28 控制质量(0-51,值越小质量越高,默认23,建议18-28)
            // -preset fast 调整编码速度与压缩率(可选:ultrafast, superfast, veryfast, fast, medium, slow, slower)
            // -c:a copy 直接复制原始音频
            // -r 24 设置输出视频为24帧/秒
            String command = String.format("ffmpeg -i %s -c:v libx264 -profile:v high -level 4.0 -pix_fmt yuv420p -preset fast -crf 28 -c:a copy -r 24 %s", inputPath, outputPath);
            Process process = Runtime.getRuntime().exec(command);

            // 读取错误流(FFmpeg的输出通常通过错误流)
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line;
            while ((line = errorReader.readLine()) != null) {
                log.info(line);
            }

            int exitCode = process.waitFor();
            if (exitCode == 0) {
                log.info("视频压缩成功: {}", outputPath);
                return true;
            } else {
                log.error("视频压缩失败,退出码: {}", exitCode);
                return false;
            }
        } catch (IOException | InterruptedException e) {
            log.error("执行FFmpeg命令出错", e);
            return false;
        }
    }

}

在这里插入图片描述

### 使用 Spring Boot 实现视频文件压缩 在构建基于Spring Boot的应用程序时,处理视频文件的压缩对于减少存储空间和提高传输效率至关重要。虽然直接利用Java标准库完成复杂的视频编码并不现实,因为这通常涉及到专门的编解码器和大量的计算资源,但是可以通过集成外部工具和服务来达成目标。 #### 外部依赖的选择 为了有效地执行视频压缩操作,在应用程序内部调用FFmpeg这样的第三方命令行工具是一种常见做法[^1]。 FFmpeg是一款开源软件,能够用来记录、转换并播放音频与视频。它提供了广泛的格式支持以及多种滤镜效果用于调整画质参数如分辨率、帧率等,非常适合于视频处理任务。 #### 集成方式 为了让Spring Boot项目具备视频压缩能力,可以采用如下方案: - **引入必要的Maven依赖** 确保pom.xml中包含了运行系统命令所需的支持类库,比如`commons-exec`: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> </dependency> ``` - **编写服务层逻辑** 定义一个Service组件负责封装对FFmpeg的操作细节,包括但不限于设置输入输出路径、指定压缩选项等。下面给出了一段简单的伪代码示例说明如何调用ffmpeg进行基本的视频压缩工作: ```java import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; @Service public class VideoCompressServiceImpl implements VideoCompressService { @Override public void compressVideo(String inputFilePath, String outputFilePath) throws Exception { CommandLine cmdLine = new CommandLine("/usr/local/bin/ffmpeg"); // 添加必要参数以控制压缩行为 cmdLine.addArgument("-i", false); cmdLine.addArgument(inputFilePath, false); // 设置输出质量或其他高级设定可根据具体需求定制化修改此处配置 cmdLine.addArgument("-b:v 500k"); // 控制比特率 cmdLine.addArgument(outputFilePath, false); DefaultExecutor executor = new DefaultExecutor(); int exitValue = executor.execute(cmdLine); if (exitValue != 0){ throw new RuntimeException("Failed to execute ffmpeg command."); } } } ``` 这段代码展示了怎样通过Apache Commons Exec库间接地执行操作系统级别的指令,从而达到调用FFmpeg的目的。需要注意的是实际部署环境中应当根据服务器的具体情况进行适当调整,例如更改可执行文件的位置或者优化压缩参数以便更好地适应业务场景的要求。 #### RESTful API 设计 最后一步就是暴露HTTP接口供前端或者其他微服务调用了。这里假设已经有一个Controller接收上传来的原始视频,并将其传递给上述提到的服务实例来进行后续加工处理;完成后返回新的URL指向被压缩后的版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Meteor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值