JAVA:Spring Boot 集成 FFmpeg 實現多媒體處理

文章目錄

  • JAVA:Spring Boot 集成 FFmpeg 實現多媒體處理
  • 一、簡述
  • 二、為什麼選擇 FFmpeg
  • 1、準備工作
  • 2、集成方案
  • 三、實踐樣例
  • 1、定義工具類調用 FFmpeg
  • 2、常見應用場景
  • 3、提供 REST 接口
  • 四、進階優化
  • 五、總結

一、簡述

在現代 Web 應用中,音視頻處理需求越來越常見,例如:視頻轉碼、截圖、音頻提取、格式轉換等。FFmpeg 是一個功能極其強大的開源音視頻處理工具,可以幫助我們高效完成這些任務。本文將介紹如何在 Spring Boot 項目中集成 FFmpeg,並實現一些常見的應用場景。

二、為什麼選擇 FFmpeg

  • 跨平台:支持 Windows、Linux、macOS。
  • 強大功能:轉碼、剪輯、截圖、推流、合併分割等應有盡有。
  • 社區活躍:資料豐富、持續更新。

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 可以快速構建一個 多媒體處理平台,在實際業務中應用場景廣泛,比如短視頻應用、直播平台、智能監控等。