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

news2024/9/21 1:43:22

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

最适合骑行的罐装饮料

然而,自己这个骑行记录仪,仅仅是很低端的一款,防抖功能很差,远远比不了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用PCL滤波器实现点云裁剪

主要目的就是根据已知的ROI区域,对点云进行裁剪。要么留下点云ROI区域,要么去除。 ROI区域一般都是一个矩形,即(x,y,width,height)。 那么封装的函数形式一般如下: pcl:…

《死锁》与《CAS ABA》问题

文章目录 什么是死锁常见死锁情况❗️死锁的必要条件❗️如何避免死锁呢?CASCAS中ABA问题解决ABA问题 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 。 常见死锁情况❗️ 1.一个线程一把…

Java-static那些事儿

static作为java中基础常用的关键字,通常用于修饰内部类,方法和变量和代码段,且具有以下特性: static修饰内部类时,该类属于静态内部类,其只能访问外部的静态变量和方法static修饰方法时,该方法…

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros…

【mapbox+turf.js】WebGIS空间分析系列(1)

最近在想,自己一直使用webgis做的都是可视化的内容,缺少空间分析的功能。 所以吧,最近理一下使用mapbox turf来做一些基础的空间分析功能。 大概的思路是,获取目标图层(多个图层),然后选择空…

servlet(2)—javaEE

1.获取请求数据 1.1开发前端发请求 ajax封装代码 // 参数 args 是一个 JS 对象, 里面包含了以下属性 // method: 请求方法 // url: 请求路径 // body: 请求的正文数据 // contentType: 请求正文的格式 // callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件,点击转到槽 6、根据实际需要选择对应的信号,我这里方便演示选择 clicked&a…

linux 信号量semget/semop/semctl

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 原理机制 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用:管理公司内所有员工的信息 分类:要显示每位员工的编号、姓名、岗位与职责 具体实现的功能: 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…

【Web3.0大势所趋】我看到了互联网未来的模样

前言 Web3.0 是一个越来越受到关注的话题,它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势,并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么Web3.0的技术Web3.0的优势总结 Web3.0是什么 Web3.0: 是下…

尚硅谷Kafka

Kafka 1.Kafka概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 kafka基础架构 2.快速入门2.1 kafka环境安装2.2 kafka命令行操作参数2.2.1 主题命令行操作 2.2.2 生产者命令行操作2.2.3 消费者命令行操作 3.Kafka 生产者3.1 生产者消息发送…

Vue3+Vite神器:按需引入自定义组件unplugin-vue-components

前言 我们做项目时,会封装大量的公共组件,如果我们每一个都去在maints里面引入,非常麻烦不说,代码也不优雅。所以更好的方法就是自动注册全局组件,在组件中直接使用就好。 一种方法是自己在components文件夹下新建in…

QML控件--MenuBar

文章目录 一、控件基本信息二、控件使用三、属性成员四、成员函数 一、控件基本信息 Import Statement:import QtQuick.Controls 1.4 Since:Qt 5.1 二、控件使用 MenuBar:是菜单栏,通常,菜单静态声明为菜单栏的子项&…

redis入门必会知识

Redis基础知识目录 5、sortedSet 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 一、redis是什么? Redis(Remote Dictionary Server ),即远程字典服务 ! 是一个开源的使用ANSI C语言编写…

【C++】——- 模板初阶介绍

前言: 在之前的学习中,我们已经把 C前期所需要用到的知识都给大家介绍了一遍。接下来,我们要学习的就是关于在C 中模板的基本知识,今天我带给大家的内容便是关于 模板初阶的介绍。 目录 (一) 泛型编程 &…

【Python_Opencv图像处理框架】图像形态学操作

写在前面 本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️ 写在中间 读完这篇文章后,相信您便能信手拈来下面图…

给照片换底色(python+opencv)

给照片换底色(pythonopencv) 本篇目录: 🦄 一、分析照片基本信息 🦄 二、方法一(遍历图像,将像素值点替换修改为指定颜色) 🦄 三、修改图片颜色方法二(先转…

MySQL数据库索引

目录 0.知识回顾 1.数据库约束 一.索引 1.什么是索引 2.为什么要使用索引(作用) 3.索引的使用场景 4.如何使用索引 1.查看索引 2.创建索引 3.修改索引 4.删除索引 5.索引的分类 1.使用场景不同 2.按列区分 3.按数据组织方式 二.索引的数据结构 1.HASH 2.二叉搜…

如何设计自动化测试框架?阿里P7工程师耗时一个月总结而成

目录 一、什么是自动化测试框架 二、自动化测试框架的架构设计 三、自动化测试框架的最佳实践 四、自动化测试框架的组成部分 五、自动化测试框架的设计原则 六、如何选择自动化测试框架 七、自动化测试框架实例 八、结论 一、什么是自动化测试框架 自动化测试框架是一…

UE4/5多人游戏详解(八、游戏模式和游戏状态里的函数重写,插件内地图的地址做变量,做变量让按钮出现不同状态,插件内的所有代码)

目录 这里不写在插件里面,而是在游戏模式: 头文件: Cpp文件: 更改ini文件 进入地图设置模式: 写插件里面,做一个变量: 写变量 然后更改函数MenuSet: 在子系统中做变量&…