如何使用ffmpeg為視頻減震去抖

之前自己發(fā)過一些記錄儀拍下來的畫面,你們可能已經(jīng)看過了,例如:
算了,該視頻上傳了不讓發(fā)出來………………
然而,自己這個(gè)騎行記錄儀,僅僅是很低端的一款,防抖功能很差,遠(yuǎn)遠(yuǎn)比不了 GoPro 那些高端的戶外運(yùn)動(dòng)記錄儀,很多時(shí)候,自己騎行沒什么感覺,而看自己錄下來的畫面就會(huì)抖震顛簸到暈車了,為此,我一咬牙,一跺腳,一狠心,買,買不起 GoPro,就上 Goo 歌搜索了一下,軟件去抖減震的方法,還真的有,并且是免費(fèi)開源的工具 ffmpeg,這東西恰好就是我長(zhǎng)期以來一直喜歡用來做視頻處理的工具,那就正合我意了。
先上一個(gè)例子
先用如下命令參數(shù)對(duì)原始視頻文件做一下處理,生成一個(gè)分析記錄抖動(dòng)狀態(tài)的 transforms.trf 的中間文件
然后用下面的命令和參數(shù)再使用該中間數(shù)據(jù)文件對(duì)原始視頻做處理,生成去抖減震的視頻文件:
處理前用 potplayer 生成的視頻信息文件:

處理后用 potplayer 生成的視頻信息文件:

免安裝
看到這里就急著去百毒搜索下載安裝 ffmpeg 的朋友們等等!不要急,ffmpeg 十分可能已經(jīng)躺在你自己電腦里面某個(gè)犄角旮旯的地方了,它經(jīng)常被其它各種視頻編輯器包括在自身的安裝路徑下面了,這些圖形化界面的視頻編輯器都是對(duì) ffmpeg 在圖形化界面上的封裝,但是,封裝就會(huì)只挑選最常用的功能封裝,而去抖減震這種犄角旮旯的需求,很多常見的視頻編輯器并沒有提供界面直接用,我們所需要的僅僅就是深入安裝路徑里面找到 ffmpeg.exe 這個(gè)文件,直接在命令行里面去使用它這些強(qiáng)大的功能。
再來看看這些命令參數(shù)
第一步是 vidstabdetect 分析視頻的抖動(dòng)
shakiness
原始視頻抖動(dòng)的劇烈程度,1 為抖動(dòng)最小,10 為抖動(dòng)最大,默認(rèn)是 5,
accuracy
取值范圍:1 到 15,設(shè)置檢測(cè)過程的準(zhǔn)確性,1 表示低精度,15 表示高精度,默認(rèn) 15
stepsize
設(shè)置搜索過程的間隔值(掃描尺度)。最低是 1 像素分辨率掃描,最高是 32 像素分辨率掃描,默認(rèn)為 6,取值越大,則掃描像素分辨率越粗,生成的 trf 文件體積越小,生成的速度越快,取值越小,則生成 trf 文件體積越大生成的速度越慢。
result
指定所生成的 trf 文件的文件名,可以省略, 默認(rèn)名為transforms.trf
show
把內(nèi)部轉(zhuǎn)換生成的視頻顯示出來,默認(rèn)不顯示,設(shè)為 1 則會(huì)顯示可視化出來。
-f null -
僅僅執(zhí)行該第一步,不生成第二步的最終視頻文件
第二步是 vidstabtransform 對(duì)視頻減震去抖處理
input
使用第一步所生成的 trf 文件,指定文件名,可以省略,默認(rèn)使用transforms.trf
,比如我可以在第一步使用不同的參數(shù)來生成多個(gè)不同的 trf 文件,在第二步使用這多個(gè)不同的 trf 文件來生成不同的去抖減震視頻來對(duì)比不同的效果,尋找對(duì)一個(gè)原始視頻文件的最優(yōu)參數(shù)
smoothing
默認(rèn)值是 10,表示減抖算法根據(jù)當(dāng)前幀的前 10 幀和后 10 幀來處理當(dāng)前幀,也就是前后加起來一共 20 幀來處理當(dāng)前幀的抖動(dòng),該值越小,則減抖的力度越弱,該值越大,則減抖的力度越強(qiáng),當(dāng)然減抖越強(qiáng),也就意味著如果是頭戴式攝像頭跟隨腦袋轉(zhuǎn)動(dòng)目光視線而看向目標(biāo)的加速度越小越弱,尤其是空戰(zhàn)模擬的傳統(tǒng)頭瞄 trackir 的虛擬座艙視景或現(xiàn)代 VR 盔攝的綠幕前真實(shí)座艙真實(shí)桿、舵、手的畫面就可能會(huì)卡暈,這個(gè) smoothing 的值,可以有一個(gè)簡(jiǎn)單的計(jì)算依據(jù),就是videofps/2
,也就是原始視頻幀頻的一半,物理含義就是,減抖減小的是一秒以內(nèi)的抖動(dòng),或者說是頻率 1Hz 以上的抖動(dòng),或者說是人自己的腦袋無論是點(diǎn)頭還是搖頭不會(huì)快到頻率 1Hz 以上,1Hz 以上的高頻抖動(dòng)減去掉,只剩下 1Hz 一下的抖動(dòng)在視頻里面,這樣的視頻給人看應(yīng)該不會(huì)感覺到難受,能那么快轉(zhuǎn)腦袋還不會(huì)暈的大概只有鳥類:

也就是如果你做視頻給鳥看這個(gè)數(shù)值可以很小,反過來如果減抖處理視頻給樹懶看則需要十秒長(zhǎng)度以上的減抖……

zoom
視頻縮放的比例,正數(shù)是放大,負(fù)數(shù)是縮小,默認(rèn)是零。設(shè)定為負(fù)值讓視頻縮小,那么四周全部會(huì)包上黑邊嗎?不,ffmpeg 默認(rèn)的處理是在四邊補(bǔ)足畫面,用畫面的邊緣部分鏡像延伸擴(kuò)展,使得最終看起來好像沒有黑邊,但是更實(shí)用的是設(shè)定為正值,讓視頻畫面放大,這樣就不會(huì)有任何邊緣擴(kuò)展了,但是視頻畫面會(huì)裁剪四邊,比如我上面的減抖處理視頻的畫面,原始視頻使用騎行記錄儀攝的,畫面右下角有一串日期時(shí)間顯示的文字,在用放大減抖處理后,整個(gè)時(shí)間顯示的文字就全都被裁剪沒了,但是對(duì)于我這個(gè)騎行記錄儀來說又是很好的處理,因?yàn)轵T行記錄儀本身的設(shè)計(jì)制造是視場(chǎng)角非常大,遠(yuǎn)大于一般普通的攝錄設(shè)備,因而人們?cè)陔娔X上查看騎行記錄儀的原始視頻的時(shí)候就會(huì)覺得畫面有變形,整體呈現(xiàn)一個(gè)凸面球形的世界,尤其是畫面四周圍變形嚴(yán)重,因此將騎行記錄儀視頻放大截掉四周圍一部分畫面后在來看就會(huì)舒適很多,并且裁剪畫面會(huì)使最終生成的視頻文件比原始文件更小。
用上面的各種參數(shù)來轉(zhuǎn)換:
這個(gè)處理過的視頻在這里:

最簡(jiǎn)化版本
能省略的參數(shù)都給省略掉,都使用 ffmpeg 所默認(rèn)推薦的數(shù)值,懶人減抖命令是:
額外:并列兩視頻
得到減震視頻后,我們往往會(huì)把它和原始視頻左右并列拼接合成為一個(gè)對(duì)比視頻,只需要 vstack 和 hstack 兩個(gè)過濾器參數(shù)即可。
垂直排布:
水平排布:
這兩個(gè) stack 參數(shù)是不是很眼熟?很像上一期我講到的 ONLYOFFICE 表格中的新的矩陣操作函數(shù):
算了,沒有發(fā)在B站上……
友情提示
小抖怡情,中抖健身,強(qiáng)抖灰飛煙滅……
學(xué)會(huì)了軟減抖之后,自己特意擼了一段搓板路,然后用 ffmpeg 減震去抖,效果如下:

減抖后也變不成平滑柔順如飄柔的樣子,而減抖前可把我顛吐了,大家可千萬不要跟我學(xué)!
參考文獻(xiàn):
[1] vid.stab - Features: http://public.hronopik.de/vid.stab/features.php?lang=en