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;}}}