前言
? ? ? ? 最近在開發過程中,發現當我們上傳除了mp4以外的其他少見的格式,如 .flv .rmvb 格式的視頻時,在前端在線播放的時候會播放不出來畫面,所以? 接下來,將要進行一個非常完美的工程,將視頻格式轉為.mp4
1.安裝 ffmpeg
ffmpeg有很多強大的功能,如進行視頻切邊? 分隔? ?轉碼 等功能 。大家可以理解為是一個.exe文件 只要安裝好? 找到執行路徑? 就可以進行視頻的操作。 話不多說? 直接開始
2.下載ffmpeg包
OK? 已經給大家準備好了? ffmpeg-5.1.1-amd64-static.tar.xz
鏈接: https://pan.baidu.com/s/1CmL0NNXtB2GQc8JwjE5IBg?pwd=1234 提取碼: 1234
3.安裝啟動 ffmpeg
來 將下載好的放入 linux中 隨便放到一個文件夾下? 我一般喜歡放在 opt下
??
3.1 解壓文件
# 解壓.xz
xz -d ffmpeg-5.1.1-amd64-static.tar.xz# 解壓 tar
tar -xvf ffmpeg-5.1.1-amd64-static.tar.xz
3.2 啟動 ffmpeg
進入 解壓好的文件夾下
?紅框框 的 這兩個 執行命令 很重要? ?使用java執行的時候 都是找到 ffmpeg 執行文件
# 進入解壓好的文件夾
cd ffmpeg-5.1.1-amd64-static/# 執行命令
./ffmpeg
? ?出現以下執行成功
?3.3 設置全局命令
# 進入 /usr/bin下
cd /usr/bin# ln -s 自己的目錄所在 別名
ln -s /opt/ffmpeg-5.1.1-amd64-static/ffmpeg ffmpeg# ln -s 自己的目錄所在 別名
ln -s /opt/ffmpeg-5.1.1-amd64-static/ffprobe ffprobe
?4.測試
?首先準備好一個隨便格式的視頻文件? 我準備了一個 MP4的因為其他的也找不到 哈哈哈? ?
執行命令
# ffmpeg -i 文件名 轉好后的文件路徑
ffmpeg -i input.mp4 -c:v libx264 -crf 19 -strict experimental /opt/out.mp4
ok 測試通過 就可以? 使用java代碼 進行 執行拉
5.java執行ffmpeg
?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;public class FFmpegVideoConverter {private final String ffmpegPath;/*** 構造函數,指定 FFmpeg 可執行文件路徑*/public FFmpegVideoConverter(String ffmpegPath) {this.ffmpegPath = ffmpegPath;}/*** 將視頻轉換為 MP4 格式* @param inputFilePath 輸入視頻文件路徑* @param outputFilePath 輸出 MP4 文件路徑* @return 轉換成功返回 true,失敗返回 false*/public boolean convertToMP4(String inputFilePath, String outputFilePath) {try {// 構建 FFmpeg 命令List<String> command = new ArrayList<>();// ffmpegPath 為在linux安裝好的執行命令 我所在的位置為 /opt/ffmpeg-5.1.1-amd64-static/ffmpegcommand.add(ffmpegPath);command.add("-i");// 源視頻所在位置command.add(inputFilePath);command.add("-c:v");command.add("libx264"); // 使用 H.264 視頻編碼command.add("-preset");command.add("medium"); // 編碼速度與壓縮比平衡command.add("-crf");command.add("23"); // 視頻質量,數值越小質量越高 (0-51)command.add("-c:a");command.add("aac"); // 使用 AAC 音頻編碼command.add("-strict");command.add("experimental"); // 允許使用實驗性編解碼器command.add("-b:a");command.add("128k"); // 音頻比特率command.add("-movflags");command.add("faststart"); // 優化 MP4 文件以便網絡播放command.add("-y"); // 覆蓋已存在的文件// 新文件所在位置command.add(outputFilePath);// 執行命令ProcessBuilder processBuilder = new ProcessBuilder(command);processBuilder.redirectErrorStream(true); // 合并標準輸出和錯誤輸出Process process = processBuilder.start();// 讀取命令輸出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String line;while ((line = reader.readLine()) != null) {System.out.println(line); // 可替換為日志記錄}// 等待命令執行完成int exitCode = process.waitFor();return exitCode == 0;} catch (IOException | InterruptedException e) {e.printStackTrace();return false;}}public static void main(String[] args) {// 設置 FFmpeg 路徑(根據實際情況修改)String ffmpegPath = "/usr/bin/ffmpeg"; // Linux/Mac// String ffmpegPath = "C:\\ffmpeg\\bin\\ffmpeg.exe"; // Windows// 創建轉換器實例FFmpegVideoConverter converter = new FFmpegVideoConverter(ffmpegPath);// 輸入和輸出文件路徑String inputFile = "input.avi"; // 替換為實際輸入文件String outputFile = "output.mp4"; // 替換為實際輸出文件// 執行轉換boolean success = converter.convertToMP4(inputFile, outputFile);// 輸出結果if (success) {System.out.println("視頻轉換成功!");} else {System.out.println("視頻轉換失敗!");}}
}