> 文章列表 > 如何使用ffmpeg给视频减震去抖

如何使用ffmpeg给视频减震去抖

如何使用ffmpeg给视频减震去抖

之前自己发过一些记录仪拍下来的画面,你们可能已经看过了,例如:

最适合骑行的罐装饮料

然而,自己这个骑行记录仪,仅仅是很低端的一款,防抖功能很差,远远比不了GoPro那些高端的户外运动记录仪,很多时候,自己骑行没什么感觉,而看自己录下来的画面就会抖震颠簸到晕车了,为此,我一咬牙,一跺脚,一狠心,买,买不起GoPro,就上Goo歌搜索了一下,软件去抖减震的方法,还真的有,并且是免费开源的工具ffmpeg,这东西恰好就是我长期以来一直喜欢用来做视频处理的工具,那就正合我意了。

先上一个例子

先用如下命令参数对原始视频文件做一下处理,生成一个分析记录抖动状态的transforms.trf的中间文件

ffmpeg -i 20230410_183306_USTB减震防抖.MOV -vf vidstabdetect=shakiness=7 -f null -

然后用下面的命令和参数再使用该中间数据文件对原始视频做处理,生成去抖减震的视频文件:

ffmpeg -i 20230410_183306_USTB减震防抖.MOV -vf vidstabtransform=smoothing=30:zoom=5:input="transforms.trf" 20230410_183306_USTB减震防抖版.MOV

处理前用potplayer生成的视频信息文件:

处理后用potplayer生成的视频信息文件:

免安装

看到这里就急着去百毒搜索下载安装ffmpeg的朋友们等等!不要急,ffmpeg十分可能已经躺在你自己电脑里面某个犄角旮旯的地方了,它经常被其它各种视频编辑器包括在自身的安装路径下面了,这些图形化界面的视频编辑器都是对ffmpeg在图形化界面上的封装,但是,封装就会只挑选最常用的功能封装,而去抖减震这种犄角旮旯的需求,很多常见的视频编辑器并没有提供界面直接用,我们所需要的仅仅就是深入安装路径里面找到ffmpeg.exe这个文件,直接在命令行里面去使用它这些强大的功能。

再来看看这些命令参数

第一步是vidstabdetect分析视频的抖动

shakiness 原始视频抖动的剧烈程度,1为抖动最小,10为抖动最大,默认是5,

accuracy 取值范围:1到15,设置检测过程的准确性,1表示低精度,15表示高精度,默认15

stepsize 设置搜索过程的间隔值(扫描尺度)。最低是1像素分辨率扫描,最高是32像素分辨率扫描,默认为6,取值越大,则扫描像素分辨率越粗,生成的trf文件体积越小,生成的速度越快,取值越小,则生成trf文件体积越大生成的速度越慢。

result 指定所生成的trf文件的文件名,可以省略, 默认名为transforms.trf

show 把内部转换生成的视频显示出来,默认不显示,设为1则会显示可视化出来。

-f null - 仅仅执行该第一步,不生成第二步的最终视频文件

第二步是vidstabtransform对视频减震去抖处理

input 使用第一步所生成的trf文件,指定文件名,可以省略,默认使用transforms.trf,比如我可以在第一步使用不同的参数来生成多个不同的trf文件,在第二步使用这多个不同的trf文件来生成不同的去抖减震视频来对比不同的效果,寻找对一个原始视频文件的最优参数

smoothing 默认值是10,表示减抖算法根据当前帧的前10帧和后10帧来处理当前帧,也就是前后加起来一共20帧来处理当前帧的抖动,该值越小,则减抖的力度越弱,该值越大,则减抖的力度越强,当然减抖越强,也就意味着如果是头戴式摄像头跟随脑袋转动目光视线而看向目标的加速度越小越弱,尤其是空战模拟的传统头瞄trackir的虚拟座舱视景或现代VR盔摄的绿幕前真实座舱真实杆、舵、手的画面就可能会卡晕,这个smoothing的值,可以有一个简单的计算依据,就是videofps/2,也就是原始视频帧频的一半,物理含义就是,减抖减小的是一秒以内的抖动,或者说是频率1Hz以上的抖动,或者说是人自己的脑袋无论是点头还是摇头不会快到频率1Hz以上,1Hz以上的高频抖动减去掉,只剩下1Hz一下的抖动在视频里面,这样的视频给人看应该不会感觉到难受,能那么快转脑袋还不会晕的大概只有鸟类:

也就是如果你做视频给鸟看这个数值可以很小,反过来如果减抖处理视频给树懒看则需要十秒长度以上的减抖……

zoom 视频缩放的比例,正数是放大,负数是缩小,默认是零。设定为负值让视频缩小,那么四周全部会包上黑边吗?不,ffmpeg默认的处理是在四边补足画面,用画面的边缘部分镜像延伸扩展,使得最终看起来好像没有黑边,但是更实用的是设定为正值,让视频画面放大,这样就不会有任何边缘扩展了,但是视频画面会裁剪四边,比如我上面的减抖处理视频的画面,原始视频使用骑行记录仪摄的,画面右下角有一串日期时间显示的文字,在用放大减抖处理后,整个时间显示的文字就全都被裁剪没了,但是对于我这个骑行记录仪来说又是很好的处理,因为骑行记录仪本身的设计制造是视场角非常大,远大于一般普通的摄录设备,因而人们在电脑上查看骑行记录仪的原始视频的时候就会觉得画面有变形,整体呈现一个凸面球形的世界,尤其是画面四周围变形严重,因此将骑行记录仪视频放大截掉四周围一部分画面后在来看就会舒适很多,并且裁剪画面会使最终生成的视频文件比原始文件更小。

用上面的各种参数来转换:

ffmpeg -i 三山五园绿道.MOV -vf vidstabdetect=stepsize=32:shakiness=10:accuracy=10:result=transform_vectors.trf -f null -
ffmpeg -i 三山五园绿道.MOV -y -vf vidstabtransform=input=transform_vectors.trf:zoom=0:smoothing=10 三山五园绿道稳定版.MOV

这个处理过的视频在这里:

软件减震去抖处理过的视频一则

最简化版本

能省略的参数都给省略掉,都使用ffmpeg所默认推荐的数值,懒人减抖命令是:

ffmpeg -i 骑车看飞机场.MOV -vf vidstabdetect -f null -ffmpeg -i 骑车看飞机场.MOV -vf vidstabtransform 骑车看飞机场stabilized.MOV

额外:并列两视频

得到减震视频后,我们往往会把它和原始视频左右并列拼接合成为一个对比视频,只需要vstack和hstack两个过滤器参数即可。

垂直排布:

ffmpeg -i 原视频.mkv -i 减震视频.mkv  -filter_complex vstack 合并视频.mkv

水平排布:

ffmpeg -i 原视频.mkv -i 减震视频.mkv  -filter_complex hstack 合并视频.mkv

这两个stack参数是不是很眼熟?很像上一期我讲到的ONLYOFFICE表格中的新的矩阵操作函数:

如何在表格里面使用VSTACK、HSTACK等函数

友情提示

小抖怡情,中抖健身,强抖灰飞烟灭……

学会了软减抖之后,自己特意撸了一段搓板路,然后用ffmpeg减震去抖,效果如下:

搓板路颠簸的软减震效果

减抖后也变不成平滑柔顺如飘柔的样子,而减抖前可把我颠吐了,大家可千万不要跟我学!

参考文献:

vid.stab - Features