代碼地址:https://gitee.com/panmingshuai/ffmpeg-demo.gitjava
代碼蕩下來後,resource目錄下有一個ffmpeg.zip的壓縮包,解壓放到E:\ffmpeg下:git
而後咱們利用java調用ffmpeg的命令執行視頻的相關操做:ui
將視頻轉爲flv格式編碼
public static void processFLV() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); commend.add("-ab"); commend.add("56"); commend.add("-ar"); commend.add("22050"); commend.add("-qscale"); commend.add("8"); commend.add("-r"); commend.add("15"); commend.add("-s"); commend.add("600x500"); commend.add("E:\\qwenew.flv"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
這裏的-i表示須要操做的文件的路徑,命令最後的路徑表示處理好的文件存放的路徑和文件名,記得寫上.flv。code
指定格式的轉換視頻
// 指定格式轉換 可是這裏沒有設置其餘參數,因此生成的文件以ffmpeg內置的生成 // MP4轉avi c:\ffmpeg\ffmpeg -i c:\ffmpeg\input\c.mp4 -f avi // c:\ffmpeg\output\a.avi public static void process() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); // 指定要處理的文件 commend.add("E:\\qwe.mp4"); commend.add("-f"); // 指定轉換格式 commend.add("avi"); commend.add("E:\\qwe2.avi"); // 最後指定文件輸出的路徑 ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
這裏的-f表示指定什麼格式進行強制轉換,這裏選了人見人愛的avi格式。ip
視頻截圖:ci
// 截圖 // ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg public static void cutScreen() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); commend.add("-y");// 輸出覆蓋路徑,即若是已存在下面指定路徑的文件,則覆蓋掉 commend.add("-f"); commend.add("image2"); commend.add("-ss"); // 指定在哪截圖 commend.add("5"); commend.add("-t"); // 指定要記錄的時間,由於是截圖因此是0.001s commend.add("0.001"); commend.add("-s"); commend.add("1920x1080"); commend.add("E:\\qwe3.jpg"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
這裏的-ss表示在視頻的哪裏截圖,他的單位是秒,即也能夠用HH:mm:ss的形式。還有一種按多少幀截圖的,可是感受不實用,通常人都是說在多少時間截圖,沒聽過誰要求在多少幀截圖的。-t表示視頻截得時間持續多久,單位也是秒,由於是截圖因此設定爲0.001秒。-s表示截圖的長寬多少。get
截取視頻段:input
// 截取視頻 public static void cutVedio() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); commend.add("-vcodec");//視頻使用原來同樣的視頻編解碼器。 commend.add("copy"); commend.add("-acodec");//音頻使用原來同樣的音頻編解碼器。 commend.add("copy"); commend.add("-ss"); commend.add("00:00:25"); commend.add("-t"); commend.add("10"); commend.add("E:\\qwe563.mp4"); commend.add("-y"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
這段出現的都是以前介紹過的,就很少說了
下面列出一些經常使用的ffmpeg的命令,能夠像上面同樣調用
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協議的。。。
-f fmt 強迫採用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置做者
-copyright string 設置版權
-comment string 設置評論
-target type 設置目標文件類型(vcd,svcd,dvd)
視頻選項:
-b bitrate 設置比特率,缺省200kb/s
-r fps 設置幀頻 缺省25
-s size 設置幀大小 格式爲WXH 缺省160X128.下面的簡寫也能夠直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-vn 不作視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-vcodec codec 強制使用codec編解碼方式。若是用copy表示原始編解碼數據必須被拷貝。
-pass n 選擇處理遍數(1或者2)。兩遍編碼很是有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
音頻選項:
-ac channels 設置通道 缺省爲1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼