幀率 fps的概念
幀率,單位FPS(frame per second), 用於衡量視頻每秒的處理幀數,對於編碼器而言說明編碼器在1s的編碼的速度,通常可以使用一幀的編碼時間倒數簡單計算;對於解碼器而言,幀率表示1秒內解碼幀數。
電視節目中比較常用的幀率制式有NTSC、PAL。另外,幀率可能會因為視頻是否是交織(interlaved,i)或逐行(progressive,p)的,描述上有所不同。對於交織的視頻,一幀數據包含兩場:頂場和底場。
NTSC標准使用60i fps,意思是每秒60場,亦即30幀。(60 fields),30幀
PAL標准使用50i fps,意思是每秒50場,亦即25幀。
如何設置轉碼幀率
ffmpeg提供了-r用於設置轉碼之后的幀率,命令行如下:
ffmpeg -i input.avi -r 30 output.mp4
使用fps filter
這里介紹第一個filter,名字是fps,可用於設置輸出視頻的幀率,語法如下:
fps=fps=number_of_frames
比如下面命令行將input.avi的幀率處理成25幀,輸出到output.mp4中
ffmpeg -i input.avi -vf fps=fps=25 output.mp4
預定義的幀率
ffmpeg提供了幾種常用的幀率:
縮寫 幀率 准確值
ntsc-film 23.97fps 24000/1001
film 24fps 24/1
pal、qpal、spal 25fps 25/1
ntsc、qntsc、sntsc 29.97fps 30000/1001
在使用-r參數是可以用上面的縮寫指代特定幀率。
碼率 bitrate
碼率是指單位時間內處理的音視頻數據的比特數,單位bps。在同樣的編碼條件下,碼率決定音視頻數據的質量。
比較常用的碼率控制策略有下面三種:
- ABR:平均碼率,固定編碼大小的情況下較常用
- CBR:固定碼率,多數用於流媒體串流或直播,用於保存不實用。
- VBR:自適應碼率,簡單場景使用低碼率編碼,復雜場景使用高碼率編碼。同等大小情況下,編碼質量比VBR和CBR要好。
ffmpeg中設置碼率的參數在FFmpeg Basics學習筆記(1)ffmpeg基礎已經介紹了,有興趣可以看看。
CBR設置
設置為CBR碼率輸出時,需要指定minrate和maxrate參數,並保證-b和二者的參數相同即可。
ffmpeg -i in.avi -b 500K -minrate 500K -maxrate 500K -bufsize 1M out.mkv
限制輸出文件的大小
可以使用-fs命令
ffmpeg -i in.avi -fs 10MB out.mp4
視頻縮放
視頻縮放可分為兩種,保持寬高比的縮放(Scale)、任意比例縮放(Resize)。前者通常不破壞原始圖像的顯示比例,視覺效果通常比較好,類似數學中的等比例變換;后者比較靈活,可以任意變換。
比如下面的縮放處理,將源視頻縮放為320x240大小
ffmpeg -i in.mp4 -s 320x240 out.mp4
ffmpeg中預先定義了一些分辨率,比如:(注意描述視頻時通常是寬x高)
- qcif、cif、4cif、16cif,寬高都是2倍遞增的關系。只需要記住cif:352x288
- vga 表示640x480分辨率
- hd720 表示1280x720分辨率,通常說的720p
- hd1080 表示1920x1080分辨率,通常說的1080p
scale video filter
scale視頻filter支持視頻的縮放。其基礎語法如下:
scale=width:height[inter1={1|-1}]
其中width和height表示縮放之后的視頻寬高,inter表示是否是自動啟用去交織的功能。在實際命令函中還可以出現以下參數:
- iw、ih 輸入源的視頻寬高
- ow、oh 輸出的視頻寬高
- a、sar、dar(a 寬高比=iw/ih; sar 輸入源的寬高比; dar 輸入源的顯示寬高比=a*sar)
- hsub、vsub 水平和垂直方向上色度分量的采樣步長,比如對YUV422p的格式,hsub=2、vsub=1
具體使用可以參考下面命令行:
ffmpeg -i in.mp4 -vf sacle=320:240 out.mp4
下面兩條語句分別實現等比例縮放、指定寬高的等比縮放
ffmpeg -i in.mp4 -vf scale=iw0.6:ih0.6 out.mp4
ffmpeg -i in.mp4 -vf scale=200:200/a out.mp4
視頻裁剪 Crop
視頻裁剪指的是從指定視頻的某個區域(通常是矩形)取出部分畫面。
crop video filter
crop filter的語法如下:
crop=ow[:oh[❌[y:[:keep_aspect]]]]
除了能使用scale filter提供的參數外,還可以使用用x、y、n、pos、t等參數,具體含義如下:
- x,y 裁剪區域起始點坐標,默認為((iw-ow)/2, (ih-oh)/2)
- n、pos、t分別用於標識當前幀數、位置及時間戳
只截取源視頻的中心區域(長寬取一半)
ffmpeg -i in.avi -vf crop=iw/2:ih/2 out.mp4
cropdetect video filter
自動截取非黑色的區域。在4:3和16:9視頻顯示時通常填充黑邊,cropdetect filter會比較有用。其語法如下:
cropdetect[=limit[:round[:reset]]]
各字段含義:
- limit: 黑色判定門限,取值范圍[0,255],默認為24
- round,向上取整參數,整數對齊,比如必須要求輸出寬高是16的倍數、偶數。
- reset,重新計算裁剪區域的間隔
ffmpeg命令行格式,
ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4
pad video filter
區域填充特殊顏色,通常色彩填充多用於視頻分辨率和屏幕分辨率不一致的情況下,為了保證視頻的效果,保持拉伸的寬高比,在左右填充或者上下填充。pad filter語法如下:
pad=width[:height[:x[:y[:color]]]]
除了可以使用crop filer中參數,這里提供了color,用於指定填充顏色;width和height為輸出視頻的分辨率;x和y表示輸入源的左上角在輸出畫面上的偏移。
下面語句的功能是在800x640的圖片外圍填充30個像素的粉紅色邊框。
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
視頻的鏡像
hflip video filter
hflip實現對視頻的水平翻轉。語法如下:
-vf hflip
翻轉效果類似下面的示例:(翻轉之后圖像互為水平鏡像)
ABC | CBA
DEF | FED
vflip video filter
vflip實現對視頻的垂直翻轉。語法如下:
-vf vflip
翻轉效果類似下面(垂直鏡像)
000 | 888
111 | 111
888 | 000
transpose video filter
transpose filter用於實現特定角度旋轉和翻轉配合的效果。其語法如下:
-vf transpose={0,1,2,3}
0 逆時針旋轉90°+垂直翻轉
1 順時針旋轉90°
2 逆時針旋轉90°
3 順時針旋轉90°+垂直翻轉
類型0和3是旋轉和垂直翻轉配合的處理。下面兩個輸出是一樣的:
ffplay -f lavfi -i smptebars -vf transpose=0
ffplay -f lavfi -i smptebars -vf transpose=2,vflip
順時針旋轉90°的效果是這樣的(左邊是原圖,右邊是transpose之后的圖)
AB CA
CD DB
順時針旋轉90°+垂直翻轉的效果如下:
AB DB
CD CA
對比下圖即可。
附加說明
本部分內容主要涉及《Ffmpeg Basic》的第3章到第7章(包含第7章),介紹了比較多的視頻編碼參數和處理,比如幀率、碼率、縮放、裁剪、填充和旋轉。
概念性內容比較多,建議可以簡單了解下有關內容,實際需要用到的時候再深入研究下。