FFmpeg Basics學習筆記(2)


幀率 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

對比下圖即可。
transpose類型3的效果

附加說明

本部分內容主要涉及《Ffmpeg Basic》的第3章到第7章(包含第7章),介紹了比較多的視頻編碼參數和處理,比如幀率、碼率、縮放、裁剪、填充和旋轉。
概念性內容比較多,建議可以簡單了解下有關內容,實際需要用到的時候再深入研究下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM