文章目錄
- java+ffmpeg使用記錄
- 一、前言
- 二、正文
-
- 1.指令行運作
- 2.java代碼調用
- 三、其它
-
- 1.常用參數
- 2.視訊參數
- 3.音頻參數
- 4.常用指令
-
- 1)圖檔
- 2)音視訊
java+ffmpeg使用記錄
一、前言
- ffmpeg
完整的跨平台解決方案,用于記錄,轉換和流傳輸音頻和視訊。
FFmpeg是領先的多媒體架構,能夠解碼,編碼, 轉碼,mux,demux,流,過濾和播放人類和機器建立的幾乎所有内容。它支援最模糊的老舊格式,直至最新的格式。無論它們是由某些标準委員會,社群還是公司設計的。它還具有高度的可移植性:FFmpeg可以在各種建構環境,機器體系結構和配置下,跨Linux,Mac OS X,Microsoft Windows,BSD,Solaris等編譯,運作并通過我們的測試基礎架構 FATE。
- 開發環境
- 作業系統:
Windows 7 Ultimate
- Java 環境:
JDK 1.8
- 參考:
- ffmpeg 官網:http://ffmpeg.org/
- ffmpeg 官方文檔:http://ffmpeg.org/documentation.html
- 前輩對 ffmpeg 指令的總結:https://github.com/tonydeng/fmj/blob/master/ffmpeg.md
- ProcessBuilder (java):https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html
二、正文
- 下載下傳并解壓 ffmpeg
資源下載下傳:http://ffmpeg.org/download.html
- 其中 bin 檔案夾包含:
-
用于轉碼ffmpeg.exe
說明文檔:http://ffmpeg.org/ffmpeg.html
-
用于播放ffplay.exe
說明文檔:http://ffmpeg.org/ffplay.html
-
用于檢視檔案格式ffprobe.exe
說明文檔:http://ffmpeg.org/ffprobe.html
1.指令行運作
- 拷貝視訊檔案到
檔案夾,例如:input.mp4bin
- windows 檔案夾内
–Shift + 滑鼠右擊
在此處打開指令視窗(W)
- 運作指令:(格式轉換)
> ffmpeg -i input.mp4 output.avi
2.java代碼調用
- 建立執行指令的任務工具類
CommandTask.java
package com.demo.ffmpeg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
/**
* 執行指令的任務工具
* */
public class CommandTask {
/**
* 執行指令
* @param command 指令
* */
public static void exeute(List<String> command) throws IOException {
// 執行指令
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start(); // 開始執行
InputStream errorStream = process.getErrorStream(); // 位元組流
InputStreamReader inputStreamReader = new InputStreamReader(errorStream); // 位元組流和字元流的中介
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 字元流
String line = "";
while ((line = bufferedReader.readLine()) != null){
System.out.println(line); // 輸出轉換過程
}
// 關閉流
if(bufferedReader != null){ bufferedReader.close(); }
if(inputStreamReader != null){ inputStreamReader.close(); }
if(errorStream != null){ errorStream.close(); }
}
}
- 建立測試類
FFmpegTest.java
package com.demo.ffmpeg;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
public class FFmpegTest {
public static void main(String[] args) {
String ffmpegPath = "C:\\ffmpeg20200809\\bin\\ffmpeg.exe";
String inputVideoPath = "C:\\ffmpeg20200809\\bin\\input.mp4";
String outputVideoPath = "C:\\ffmpeg20200809\\bin\\output.avi";
// 組裝 格式轉換 指令
List<String> command = new LinkedList<>();
command.add(ffmpegPath);
command.add("-i");
command.add(inputVideoPath);
command.add(outputVideoPath);
try {
// 執行指令
CommandTask.exeute(command);
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、其它
1.常用參數
參數 | 說明 |
---|---|
-i | 設定輸入流 |
-f | 設定輸出格式 |
-ss | 開始時間;支援的時間格式:hh:mm:ss[.xxx] |
-t | 持續時間;支援的時間格式:hh:mm:ss[.xxx] |
-title | 設定标題 |
-author | 設定作者 |
-copyright | 設定版權 |
-comment | 設定評論 |
-y | 覆寫輸出檔案 |
-target | 設定目标檔案類型(vcd、svcd、dvd) |
2.視訊參數
參數 | 說明 |
---|---|
-b | 設定視訊流量,預設 200 k/s |
-s | 設定畫面的寬和高 |
-aspect | 設定畫面的比例 |
-vn | 不處理視訊 |
-vcodec | 設定視訊的編碼器,預設使用與輸入流相同的編解碼器 |
3.音頻參數
參數 | 說明 |
---|---|
-ar | 設定采樣率 |
-ac | 設定聲音的通道數 |
-acodec | 使用codec編解碼 |
-an | 不處理音頻 |
4.常用指令
1)圖檔
指令 | 說明 |
---|---|
ffmpeg -i input.mp4 -y -f image2 -t 0.001 -s 500*300 output.jpg | 在視訊 0.001毫秒處,截取一張 500*300 的 jpg 圖檔 |
ffmpeg -i input.mp4 -y -f mjpeg -ss 3 -t 0.001 -s 500*300 output.jpg | 在視訊 3.003 秒處,截取一張 500*300 的 jpg 圖檔 |
ffmpeg -i input.mp4 -f image2 -vf fps=1 output%d.png | 每秒鐘輸出一幀 png 圖檔 |
ffmpeg -i input.mp4 output%d.png | 每幀輸出一張圖檔 |
ffmpeg -i input.mp4 -t 10 -pix_fmt rgb24 output.gif | 将視訊轉換為 gif 圖檔 |
ffmpeg -i input.mp4 -vframes 60 -y -f gif output.gif | 視訊前 60 幀轉換為一張 gif 圖檔 |
ffmpeg -f image2 -i output%d.png -r 25 video.mp4 | 将圖檔轉換為視訊 |
2)音視訊
指令 | 說明 |
---|---|
ffmpeg -i input.mp4 -i input.mp3 -vcodec copy -acodec copy output.mp4 | 将視訊檔案和音頻檔案合并 |
ffmpeg -i rtsp://host/address -vcodec copy output.avi | 錄制網絡視訊 |
ffmpeg -i input.mp4 -i logo.gif -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-overlay_h/2" output.mp4 | 添加居中水印;logo.gif為水印圖檔;overlay 是水印位置 |
ffplay -i input.mp4 -vf hflip | 水準翻轉播放視訊 |
ffplay -i input.mp4 -vf vflip | 垂直翻轉播放視訊 |