寫(xiě)在前面
如果您對(duì)音視頻技術(shù)感興趣,可以訂閱我的專題:
音視頻專輯也可以關(guān)注我的簡(jiǎn)書(shū)賬戶:
張芳濤,我后期會(huì)發(fā)布更多的音視頻以及圖像處理方面的文章。
正文
裁剪視頻意味著從輸入到輸出中選擇想要的矩形區(qū)域而沒(méi)有余數(shù)。 裁剪通常用于調(diào)整大小,填充和其他編輯。
裁剪基礎(chǔ)知識(shí)
較老的FFmpeg版本有cropbottom、cropleft、cropright和croptop選項(xiàng),但現(xiàn)在已棄用,并使用下表中描述的裁剪操作。
視頻過(guò)濾器:裁剪
描述將輸入視頻幀的寬度和高度從x和y值表示的位置裁剪到指定的寬度和高度;x和y是輸出的左上角坐標(biāo),協(xié)調(diào)系統(tǒng)的中心是輸入視頻幀的左上角。如果使用了可選的keep_aspect參數(shù),將會(huì)改變輸出SAR(樣本寬比)以補(bǔ)償新的DAR(顯示長(zhǎng)寬比)
語(yǔ)法crop=ow[:oh[:x[:y[:keep_aspect]]]]
************用于ow和oh參數(shù)的表達(dá)式中的可用變量
x, y對(duì)x的計(jì)算值(從左上角水平方向的像素個(gè)數(shù))和y(垂直像素的數(shù)量),對(duì)每個(gè)幀進(jìn)行評(píng)估,x的默認(rèn)值為(iw - ow)/2, y的默認(rèn)值為(ih - oh)/2
in_w, iw輸入的寬度
in_h, ih輸入的高度
out_w, ow輸出(裁剪)寬度,默認(rèn)值= iw
out_h, oh輸出(裁剪)高度,默認(rèn)值= ih
a縱橫比,與iw/ih相同
sar輸入樣本比例
dar輸入顯示寬比,等于表達(dá)式a*sar
hsub, vsub水平和垂直的色度子樣本值,對(duì)于像素格式y(tǒng)uv422p, hsub的值為2,vsub為1
n輸入框的數(shù)目,從0開(kāi)始
pos位置在輸入框的文件中,如果不知道NAN
t時(shí)間戳以秒表示,如果輸入時(shí)間戳未知
ow的值可以從oh得到,反之亦然,但不能從x和y中得到,因?yàn)檫@些值是在ow和oh之后進(jìn)行的。x的值可以從y的值中得到,反之亦然。例如,在輸入框的左三、中三和右三,我們可以使用命令:
ffmpeg -i input -vf crop=iw/3:ih:0:0 outputffmpeg -i input -vf crop=iw/3:ih:iw/3:0 outputffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
原視頻這樣:(就當(dāng)給人家打廣告了)
經(jīng)過(guò)如下的測(cè)試指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:0:0 /Users/zhangfangtao/Desktop/newTest.mp4
讓我重新編碼之后長(zhǎng)這樣:(驚不驚喜?意不意外)
再用下面的測(cè)試指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:iw/3:0 /Users/zhangfangtao/Desktop/newTest.mp4
生成的視頻如下圖:
這次顯示的中間的三分之一iw/3:ih
使用如下指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:iw/3*2:0 /Users/zhangfangtao/Desktop/newTest.mp4
生成的視頻如下圖:(最右邊的三分之一)
image.png
下圖是相關(guān)參數(shù)的示意圖:
裁剪框中心
當(dāng)我們想要裁剪框架中心的區(qū)域時(shí),作物過(guò)濾器的設(shè)計(jì)可以跳過(guò)x和y參數(shù)的輸入。x和y的默認(rèn)值是。
這意味著默認(rèn)值被設(shè)置為自動(dòng)裁剪輸入中心的區(qū)域。該命令語(yǔ)法對(duì)w寬度和h高度的矩形中心區(qū)域進(jìn)行裁剪。
ffmpeg -i input_file -vf crop=w:h output_file
我做了一個(gè)100*100的裁剪,指令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=100:100 /Users/zhangfangtao/Desktop/newTest.mp4
輸出的視頻長(zhǎng)這樣:
為了裁剪中間的半幀,我們可以使用以下命令:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
我的測(cè)試指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/2:ih/2 /Users/zhangfangtao/Desktop/newTest.mp4
裁剪之后的視頻:
自動(dòng)檢測(cè)裁剪區(qū)域
為了自動(dòng)檢測(cè)出裁剪的非黑色區(qū)域,我們可以使用crop檢測(cè)過(guò)濾器,如下表所示。當(dāng)輸入視頻中包含一些黑條時(shí),這種自動(dòng)裁剪是有用的,通常是在從第4:3到16:9的轉(zhuǎn)換之后,反之亦然。
描述檢測(cè)作物過(guò)濾器的作物大小,結(jié)果是由參數(shù)確定的輸入幀的非黑色區(qū)域
語(yǔ)法cropdetect[=limit[:round[:reset]]]
all parameters are optional
************參數(shù)的描述
limit閾值,從0(無(wú))到255 (all),默認(rèn)值= 24
round-即使是整數(shù),寬度和高度也必須是可分割的
- 4:2 2視頻需要一個(gè)2的值,它只給出了維度
-偏移量自動(dòng)更改為中心幀
-默認(rèn)值為16,它是許多編解碼器的最佳值
reset計(jì)數(shù)器決定了多少幀crop探測(cè)將重置之前檢測(cè)到的最大視頻區(qū)域并重新開(kāi)始檢測(cè)當(dāng)前最優(yōu)的作物區(qū)域。默認(rèn)值為0。當(dāng)通道標(biāo)識(shí)扭曲了視頻區(qū)域時(shí),這是很有用的。0表示永遠(yuǎn)不會(huì)重置和返回在回放期間遇到的最大區(qū)域
limit參數(shù)指定了選擇了多少深顏色的輸出,零值意味著只有完整的黑色被裁剪。例如,要裁剪非黑輸出,我們可以使用以下命令:(我這邊也沒(méi)存在黑色邊框的視頻,測(cè)試了幾個(gè),沒(méi)發(fā)現(xiàn)有啥用)
ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4
時(shí)間的裁剪
媒體播放器通常有一個(gè)進(jìn)度條,顯示經(jīng)過(guò)的秒數(shù),但大多數(shù)只有在鼠標(biāo)指針停止并在特定持續(xù)時(shí)間后隱藏時(shí)才會(huì)顯示。 FFmpeg包含一個(gè)包含定時(shí)器的testsrc視頻源,我們可以使用以下命令顯示它:
這里面大家可能會(huì)遇到一個(gè)問(wèn)題,你編譯出來(lái)的ffmpeg里面可能沒(méi)有ffplay,我是遇到過(guò)這個(gè)問(wèn)題,網(wǎng)上找了很多方案,也沒(méi)啥用,最后來(lái)了一個(gè)簡(jiǎn)單直接的。。。。
編譯FFmpeg之后沒(méi)有ffplay?方法在這兒ffplay -f lavfi -i testsrc
我在自己電腦上測(cè)試的,指令和上面的一樣,顯示的效果如下圖所示:
testsrc的默認(rèn)大小是320x240像素,初始計(jì)時(shí)器的數(shù)字0有29x52像素大小,它在左上角的位置是256個(gè)像素,垂直于94像素。要裁剪一個(gè)數(shù)字的面積,我們可以使用以下命令:
ffmpeg -f lavfi -i testsrc -vf crop=29:52:256:94 -t 10 timer1.mpg
我在自己的電腦上測(cè)試了一下,顯示的效果如下圖(一個(gè)10秒鐘,20K的小視頻):
我們想用這個(gè)命令來(lái)創(chuàng)建一個(gè)有1、2、3和4位數(shù)字的定時(shí)器,每個(gè)數(shù)字的篩選器和時(shí)間期限的規(guī)格都在表中:
數(shù)的位數(shù)數(shù)字過(guò)濾器規(guī)范時(shí)長(zhǎng)圖片
1crop=29:52:256:949 seconds
0 min : 9 sec
00:00:09
2crop=61:52:224:9499 seconds
1 min : 39 sec
00:01:39
3crop=93:52:192:94999 seconds
16 min : 39 sec
00:16:39
4crop=125:52:160:949999 seconds
2 hours : 46 min : 39 sec
02:46:39
給大家示范一下下面的指令:
ffmpeg -f lavfi -i testsrc -vf crop=125:52:160:94 -t 50 timer.mp4
顯示的效果如下:
如果我們想要比52像素高的更大的數(shù)字,我們可以用一個(gè)size參數(shù)指定更大的testsrc輸出(例如:i testsrc=size=vga),然后相應(yīng)地調(diào)整作物區(qū)域。
上面的那個(gè)完整的指令如下:(我自己試了一下,視頻有了,沒(méi)有文字。。。)
ffmpeg -f lavfi -i testsrc=size=vga -vf crop=125:52:160:94 -t 50 timer.mp4
為了改變數(shù)字和背景的顏色,我們可以使用一個(gè)lut過(guò)濾器,這是在
顏色修正的章節(jié)中描述的。創(chuàng)建的計(jì)時(shí)器將用于視頻覆蓋的示例。