FFmpeg 視訊處理命令列大全

2020-09-29 22:00:16

FFmpeg是視訊處理最常用的開源軟體。
它功能強大,用途廣泛,大量用於視訊網站,也是許多音視訊格式的標準編解碼實現。

FFmpeg的使用格式

ffmpeg的命令列引數非常多,可以分成五個部分。

$ ffmpeg {1} {2} -i {3} {4} {5}
$ ffmpeg [全域性引數]  [輸入檔案引數]  -i [輸入檔案]  [輸出檔案引數]  [輸出檔案]

上面命令中,引數依次為1.全域性引數,2.輸入檔案引數,3.輸入檔案,4.輸出檔案引數,5.輸出檔案。
比如:

$ ffmpeg \
-y \ # 全域性引數
-c:a libfdk_aac -c:v libx264 \ # 輸入檔案引數
-i input.mp4 \ # 輸入檔案
-c:v libvpx-vp9 -c:a libvorbis \ # 輸出檔案引數
output.webm # 輸出檔案

上面的命令將 mp4 檔案轉成 webm 檔案,這兩個都是容器格式。輸入的 mp4 檔案的音訊編碼格式是 aac,視訊編碼格式是 H.264;輸出的 webm 檔案的視訊編碼格式是 VP9,音訊格式是 Vorbis。
如果不指明編碼格式,FFmpeg 會自己判斷輸入檔案的編碼。因此,上面的命令可以簡單寫成下面的樣子。

$ ffmpeg -i input.avi output.mp4

常用命令列引數

-c:指定編碼器
-c copy:直接複製,不經過重新編碼(這樣比較快)  eg: ffmpeg -i input.mp4 -c copy output.webm 將視訊從一種容器轉到另一個容器
-c:v:指定視訊編碼器  	eg:  ffmpeg -i [input.file] -c:v libx265 output.mp4  轉成 H.265 編碼
-c:a:指定音訊編碼器  
-i:指定輸入檔案  		eg: ffmpeg -i input.mp4 檢視檔案資訊
-an:去除音訊流
-vn: 去除視訊流   eg: $ ffmpeg -i input.mp4 -vn -c:a copy output.aac 從視訊中提取音訊;-vn去掉視訊,-c:a copy表示不改變音訊編碼,直接拷貝。
-preset:指定輸出的視訊品質,會影響檔案的生成速度,有以下幾個可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不經過確認,輸出時直接覆蓋同名檔案。
-vf scale=480*360 改變解析度  eg:ffmpeg -i input.mp4 -vf scale=320*240 output.mp4
-s 設定視訊解析度 		eg:ffmpeg -i input,mp4 -s 320x240 output.mp4
-vframes 1 指定只擷取一幀  
-q:v 2表示輸出的圖片品質,一般為1到5(1代表品質最高)
-ss 開始時間
-t 持續時間
-to 結束時間
-loop 1 表示圖片無限迴圈
-shortest 表示音訊檔結束
-r fps 設定影格率 		eg: ffmpeg -i input.mp4 -r 24 output.mp4 設定影格率為24
-b 設定位元速率 		eg: ffmpeg -i input.avi -b 1.5M output.mp4
-b:a 音訊 -b:v 視訊
-fs (file size首字母縮寫)控制輸出檔案大小 		eg: ffmpeg -i input.avi -fs 1024K output.mp4

1、 新增音軌
新增音軌(muxing)指的是,將外部音訊加入視訊,比如新增背景音樂或旁白。

$ ffmpeg  -i input.aac -i input.mp4  output.mp4

上面例子中,有音訊和視訊兩個輸入檔案,FFmpeg 會將它們合成為一個檔案。

2、截圖
下面的例子是從指定時間開始,連續對1秒鐘的視訊進行截圖。

$ ffmpeg  -y  -i input.mp4  -ss 00:01:24 -t 00:00:01  output_%3d.jpg

如果只需要截一張圖,可以指定只擷取一幀。

$ ffmpeg -ss 01:23:45  -i input  -vframes 1 -q:v 2  output.jpg

上面例子中,-vframes 1指定只擷取一幀,-q:v 2表示輸出的圖片品質。
3、裁剪
裁剪(cutting)指的是,擷取原始視訊裡面的一個片段,輸出為一個新視訊。可以指定開始時間(start)和持續時間(duration),也可以指定結束時間(end)。

$ ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
$ ffmpeg -ss [start] -i [input] -to [end] -c copy [output]

下面是實際的例子。

$ ffmpeg -ss 00:01:50 -i [input] -t 10.5 -c copy [output]
$ ffmpeg -ss 2.5 -i [input] -to 10 -c copy [output]

上面例子中,-c copy表示不改變音訊和視訊的編碼格式,直接拷貝,這樣會快很多。
4、為音訊新增封面
有些視訊網站只允許上傳視訊檔。如果要上傳音訊檔,必須為音訊新增封面,將其轉為視訊,然後上傳。
下面命令可以將音訊檔,轉為帶封面的視訊檔。

$ ffmpeg  -loop 1  -i cover.jpg -i input.mp3  -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4

上面命令中,有兩個輸入檔案,一個是封面圖片cover.jpg,另一個是音訊檔input.mp3。-loop 1參數列示圖片無限迴圈,-shortest參數列示音訊檔結束,輸出視訊就結束。
5、調整位元速率
調整位元速率(transrating)指的是,改變編碼的位元率,一般用來將視訊檔的體積變小。下面的例子指定位元速率最小為964K,最大為3856K,緩衝區大小為 2000K。

$ ffmpeg  -i input.mp4  -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4

6、裁剪視訊crop filter
從輸入檔案中選取你想要的矩形區域到輸出檔案中,常見用來去視訊黑邊。
裁剪輸入視訊的左三分之一,中間三分之一,右三分之一:

ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output

裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的預設值是

Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file

裁剪中間一半區域:

ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

比較裁剪後的視訊和源視訊比較

ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w2.4:40

7、自動檢測裁剪區域
cropdetect filter 自動檢測黑邊區域

ffplay input.mp4 -vf cropdetect

然後拿到crop值,用檢測到的值來裁剪視訊

ffplay input.mp4 –vf crop=544:960:0:0