当前位置: 首页 > news >正文

ffmpeg filter的理解

ffmpeg filter的理解


filter的简介

从整体看,filte rgraph包含filter chain,而filter chain又包含了filter,所以可以分为是三个层次去理解。

  • filter
  • filter chain
  • filter graph

filter graph是链接多个filter的有向图。它可以包含循环,各个Filter之间也可以有多个链接。每个链接有一个input pad连接到一个filter并从那里获取输入,有一个output pad连接到另一个filter提供输出。所有的Filter都是已经注册在程序中的。没有输入的filter叫source,没有输出的filter叫sink。

每个Filtergraph都有对应的结构化的文本表示:

  • 对于命令ffmpeg来说有-filter, -vf, -affilter_complex这些选项
  • 对于命令ffplay来说有-vf, -af这些选项

filter chain:是由一个或多个filter线性连接而成,filter之间使用逗号,来分隔

filter graph:是由一个或多个filter chain组成,filter chain之间使用分号;来分隔


filter的语法

filter的语法格式为:

[in_link_1]...[in_link_N]filter_name@id=arguments[out_link_1]...[out_link_M]
  • filter_name就是你所要使用的filter的名称
  • 后面的@id是可选的(基本没用到)
  • Filter的名称和参数前后是允许放置一个或多个链接标签(link label: 别名
    • 放在前面的链接标签in_link_1in_link_N被关联到Filter的input pad
    • 后面的out_link_1out_link_M被关联到Filter的output pad
    • 如果一个filter的output pad没被标记链接标签,则它会被默认链接到后续的filter中第一个未标记链接标签的input pad
  • =arguments也是可选填的(有些filter并不需要参数)
    • arguments通常有如下格式:
      • :来分隔一系列值
      • :来分隔一系列的key=value的键值对
      • :来分隔一系列值,之后跟着一系列的key=value的键值对,值必须在键值对前面
      • 有时候value本身就是要填一系列参数值的,那么需要用|来拼接
  • 对于一个完整可用的filter chain来说,所有匿名的链接标签必须有被链接。
  • 在处理filter graph过程中当遇到有格式转换的时候会自动插入scale这个filter,所以在filter graph描述中的可能会隐式包含scale的地方前面,需要加上要指定的缩放参数:sws_flags=flags

如:

nullsrc, split[L1], [L2]overlay, nullsink

从所有filter里面找到nullsink:

ffmpeg -filters | grep nullsink

列出split的说明:

$ ffmpeg -h filter=split
Filter splitPass on the input to N video outputs.Inputs:#0: default (video)Outputs:dynamic (depending on the options)
split AVOptions:outputs           <int>        ..FVA...... set number of outputs (from 1 to INT_MAX) (default 2)

ffmpeg的命令行输出比较有限,了解filter怎么用,还是得从官网的文档里面学习:
比如,split的用法:

  • Create two separate outputs from the same input:
[in] split [out0][out1]
  • To create 3 or more outputs, you need to specify the number of outputs, like in:
[in] asplit=3 [out0][out1][out2]

视频合并淡入淡出效果


ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]" \
-map [v] result.mp4

加上audio,并且使用acrossfade:

ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]; \
[1][2]acrossfade=d=1[a12];
[a12][3]acrossfade=d=1[a123];
[a123][4]acrossfade=d=1[a]" \
-map [v] -map [a] result.mp4

这里的audio直接用[1],[2],[3],[4]表示,为了更直观点,应该写成:

ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]; \
[1:a][2:a]acrossfade=d=1[a12];
[a12][3:a]acrossfade=d=1[a123];
[a123][4:a]acrossfade=d=1[a]" \
-map [v] -map [a] result.mp4

前面的命令[0][1]直接写意思是input 0, input 1

[0:v] input 0 video stream
[0:a] input 0 audio stream

注意,在前面的filter_complex的最后一个标签后不能跟分号,跟了分号就报错,因为分号以为这后面还有filter chain,但是后面却是空的:

[AVFilterGraph @ 0x55a826aa5a60] No such filter: ''
Error initializing complex filters.
Invalid argument

FFmpeg Filters翻译文档
FFmpeg filter简介

相关文章:

ffmpeg filter的理解

ffmpeg filter的理解 filter的简介 从整体看&#xff0c;filte rgraph包含filter chain&#xff0c;而filter chain又包含了filter&#xff0c;所以可以分为是三个层次去理解。 filterfilter chainfilter graph filter graph是链接多个filter的有向图。它可以包含循环&#…...

炔活化的生物素化试剂773888-45-2,Alkyne-Biotin,炔基生物素

【产品描述】炔活化的生物素化试剂&#xff0c;可通过铜催化的点击反应与叠氮化物反应&#xff0c;产生稳定的三唑键&#xff0c;生物素炔烃在结构上与生物素炔烃相同。用于通过点击化学制备各种生物素化共轭物的生物素炔烃。Alkyne activated biotinylation reagents can prod…...

了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?

进行系统安全安排的专业人员非常了解“僵尸网络”一词。通常用于被劫持的计算机/系统链&#xff0c;如果指示恢复性和健壮的系统&#xff0c;则应很好地理解“僵尸网络”一词&#xff0c;因为它们的错误使用会导致巨大的混乱。 文章目录前言一、僵尸网络定义僵尸网络如何工作&a…...

大学生博主-14天学习挑战赛活动-CSDN

还在为写文没有流量发愁吗&#xff1f;还沉浸在假期中无法恢复状态吗&#xff1f;赶快来参与面向CSDN的大学生博主而举办的活动吧&#xff01;本次活动为了避免刷量行为&#xff0c;也为了保持公平性&#xff0c;能够选出最优秀的文章&#xff0c;特意邀请了五位在C站具有一定影…...

如何自学芯片设计?

众所周知&#xff0c;芯片设计自学还是比较困难的&#xff0c;更不存在速成的。这里简单说一下学习的规划。 学会相应的知识 无论是科班毕业&#xff0c;还是理工科专业&#xff0c;想要入行IC&#xff0c;那就一定要具备相关的基础知识。尤其是在学校里&#xff0c;学习的很…...

通过中断控制KUKA机器人暂停与再启动的具体方法示例

通过中断控制KUKA机器人暂停与再启动的具体方法示例 中断程序的基本介绍:  当出现例如输入信号变化等事先定义的事件时,机器人控制器中断当前程序,并处理一个已定义好的子程序  由中断而调用的子程序称为中断程序  最多允许同时声明32个中断  同一时间最多允许有16个…...

pandas基本操作

df.head()/tail() 查看头/尾5条数据&#xff1b;df.info 查看表格简明概要&#xff1b;df.dtypes 查看字段数据类型&#xff1b;df.index 查看表格索引&#xff1b;df.columns 查看表格列名&#xff1b;df.values 以array形式返回指定数据的取值&#xff1b;list(dt.groupby(&q…...

论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

NeRF使用神经网络来表示场景。给定一个场景&#xff0c;输入该场景稀疏的视角图片&#xff0c;NeRF可以合成该场景新的视角的图片。 神经辐射场 神经辐射场&#xff08;neural radiance field&#xff0c;NeRF&#xff09;使用5D的向量值函数表示一个场景。 输入是连续的5D坐…...

花3个月面过京东测开岗,拿个20K不过分吧?

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在…...

Leetcode DAY 35:柠檬水找零and根据身高重建队列 and用最少数量的箭引爆气球

860.柠檬水找零 class Solution { public:bool lemonadeChange(vector<int>& bills) {int five 0;int ten 0;for(int i 0; i < bills.size(); i) {if(bills[i] 5) {five;} else if(bills[i] 10) {ten;five--;if(five < 0){return false;}} else {if(ten …...

java-spring_bean实例化

bean是如何创建的实例化bean的三种方式构造方法静态工厂&#xff08;了解&#xff09;实例工厂与FactoryBean实例工厂FactoryBeanbean是如何创建的实例化bean的三种方式 构造方法 bean本质上就是对象&#xff0c;创建bean使用构造方法完成 提供可访问的构造方法 public clas…...

微信中如何接入机器人才比较安全(不会收到警告或者f号)之第三步正式接入

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 前面两篇文章分别介绍了下chatgpt接入方式: 微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第一步登录微信 微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第二步注入dll文件…...

高通平台开发系列讲解(Sensor篇)IAM20680驱动程序的使用

文章目录 一、相关编译宏二、设备树配置三、打开iio自动挂载脚本四、模块加载验证沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 IAM20680 驱动程序。 一、相关编译宏 目录:arch/arm/configs CONFIG_IIO_BUFFER=y CONFIG_IIO_KFIFO_BUF=y CONFIG_II…...

【VictoriaMetrics】VictoriaMetrics集群伪分布式部署(二进制版)

VictoriaMetrics支持单机版以及集群版部署,通常情况下,官方建议使用单节点版本,而不是集群版本,如果摄取速率低于每秒一百万个数据点,单节点版本可以完美地扩展CPU内核、RAM和可用存储空间的数量。与集群版本相比,单节点版本更容易配置和操作,因此在选择集群版本之前要三…...

华为手表开发:WATCH 3 Pro(7)获取电量信息

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;7&#xff09;获取电量信息初环境与设备文件夹&#xff1a;文件新增第二页面showBatteryInfo.hmlshowBatteryInfo.js修改首页 -> 新建按钮 “ 跳转 ”index.hmlindex.js 引用包&#xff1a;system.router首页效果点击结果初…...

【数据结构】动态顺序表的接口实现(附图解和源码)

动态顺序表的接口实现&#xff08;附图解和源码&#xff09; 文章目录动态顺序表的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、每一个接口的实现原理&#xff08;附图解&#xff09;1.初始化顺序表2.增容顺序表3.尾插数据4.删除顺序表信息&#xff08…...

L2-003 月饼

月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的情形是这样的&#…...

volatile不等于原子操作

volatile作用 确保数据每次都从源头读取&#xff0c;即每次都从内存中读取&#xff0c;不从缓存中读取。 这样做的目的是确保不会被优化 int i 0;int main(int argc, char **argv) {const char *str;if (i 0) {str "hello";} else {str "world";}ret…...

每天10个前端小知识 【Day 15】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…...

异构数据库同步方案

目录 1 概述 2 原理 3 参数 1 概述 将企业生产系统产生的业务数据实时同步到大数据平台&#xff0c;通过对业务数据的联机实时分析&#xff0c;快速制定或调整商业计划&#xff0c;提升企业的核心竞争力。 依据同步数据是否需要加工处理&#xff0c;采用不同的技术方案&am…...

MySQL-系统信息函数

获取 MySQL 版本号的函数VERSION()例&#xff1a;返回当前mysql版本信息mysql> select version(); ----------- | version() | ----------- | 5.7.40 | ----------- 1 row in set (0.01 sec)查看当前用户的连接数的ID函数CONNECTION_ID()例1&#xff1a;查看当前用户连接…...

Windows环境下使用Pycharm运行sh文件

博主在调试一些程序时&#xff0c;时常遇到 .sh文件&#xff0c;这是Linux中的shell脚本文件&#xff0c;那么这种文件在windows下如何运行呢&#xff0c;其实我们可以通过git来实现&#xff0c;接下来看我操作。 首先我们需要安装Git&#xff0c;关于其安装过程可以参考博主这…...

Flutter启动流程浅析

一&#xff0c;Mixins1&#xff0c;定义&#xff1a;Mixins 是一种在多个类层次结构中重用类代码的方法。个人理解&#xff1a;就是一个类&#xff0c;这个类有一些方法&#xff0c;其他类可以在不继承这个类的情况下使用这个类的方法。2&#xff0c;几个关键词&#xff08;1&a…...

004:NumPy的应⽤-2

数组的运算 使⽤NumPy 最为⽅便的是当需要对数组元素进⾏运算时&#xff0c;不⽤编写循环代码遍历每个元素&#xff0c;所有的运算都会⾃动的⽮量化&#xff08;使⽤⾼效的、提前编译的底层代码来对数据序列进⾏数学操作&#xff09;。简单的说就是&#xff0c;NumPy 中的数学运…...

一文了解JAVA中同步、异步、阻塞和非阻塞

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;JAVA中同步、异步、阻塞和非阻塞 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加…...

查询股票交易日接口可以用C++实现查询当日成交吗?

用查询股票交易日接口可以自行查询各大交易网站或交易所的股票历史数据及行情数据&#xff0c;也可以用它 查询当日成交数据&#xff01; 接下来小编就来分享一下用C实现查询当日成交代码&#xff1a; std::cout << " 查询当日成交: category 3 \n"; categ…...

java中常见的json库以及对应的用法

一、常见的json库 1、Jackson: Jackson是一个高性能、灵活性强的JSON库&#xff0c;提供了丰富的API&#xff0c;支持JSON和XML的数据解析和生成。它支持对Java对象进行序列化和反序列化&#xff0c;可以处理复杂的JSON格式数据。 导入的依赖 https://mvnrepository.com/ &…...

德赛西威NAV75*-SV731*导航升级(凯立德J30)实战

一、前言&#xff1a;升级导航德赛西威&#xff08;2015年买的&#xff09;地图几年没升级过了&#xff08;之前自己折腾了一个&#xff09;之前的启动是DSA2013&#xff08;电子G已经无法升级数据文件了&#xff0c;本次只升级地图J30图资-凯立德&#xff09;主程序版本&#…...

[USACO2023-JAN-Bronze] T1 LEADERS 题解

一、题目描述Farmer John 有 N 头牛 (2≤N≤10^5)。 每头牛有对应的品种&#xff1a;Guernsey or Holstein. 按照惯例&#xff0c;这些牛站成一排&#xff0c;编号从1到N。在某一天&#xff0c;每头牛写了一个数字, 第i头牛写的数字Ei明确地表示了一个范围&#xff0c;表示范围…...

第二章:unity性能优化之drawcall优化-1

目录 前言&#xff1a; 一、什么是drawcall 二、如何合批 1、什么是合批&#xff1f; 2、静态批处理 1、什么是静态批处理&#xff1a; 2、静态合批的规则 3、动态批处理 4、GPU Instancing 1、GPU instancing的定义 2、编写支持GPU instancing Shader步骤 5、…...

wordpress竖着的分割线/seo值怎么提高

这里主要是整理些常用系统表的知识点,有时候面试数据分析的时候会问到的。先给大家出一道面试题目&#xff1a; 已知道一个用户表的名字是 brands,如何查找出表中的所有列名字呢&#xff1f; 看完下面的内容&#xff0c;你肯定会明白的 一&#xff1a;Sysobjects表 Sysobjec…...

先买空间再写网站/设计网络营销方案

历史文章&#xff1a;【javac命令不能使用&#xff0c;提示不是内部命令或外部命令&#xff0c;请查看历史文章】需求说明之前的文章中&#xff0c;仅说明了单个的java文件&#xff0c;没有多的外部依赖的单个java文件编译成class文件。1.现在有个需求&#xff1a;在使用一个my…...

广西高端网站建设/怎么做网站推广多少钱

myeclipse 遇到的一些问题及解决方案参考文章&#xff1a; &#xff08;1&#xff09;myeclipse 遇到的一些问题及解决方案 &#xff08;2&#xff09;https://www.cnblogs.com/losesea/p/3417291.html &#xff08;3&#xff09;https://www.javazxz.com/thread-4655-1-1.h…...

wordpress wrapper/百度一下你就知道官网首页

图像算法中会经常用到摄像机的畸变校正&#xff0c;有必要总结分析OpenCV中畸变校正方法&#xff0c;其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法。 普通相机模型畸变校正函数针对OpenCV中的cv::initUndistortRectifyMap()&#xff0c;鱼眼相机模型畸变校正…...

负责加强局网站建设/seo技术是什么

使用spring声明式事务&#xff0c;spring使用AOP来支持声明式事务&#xff0c;会根据事务属性&#xff0c;自动在方法调用之前决定是否开启一个事务&#xff0c;并在方法执行之后决定事务提交或回滚事务。转载于:https://www.cnblogs.com/panxuejun/p/7865002.html...

兰州市做网站建设的公司/大搜推广

1、先按照cocos2d-x的环境配置要求(ant等)安装好&#xff0c;然后在安卓目录下proj.android新建build.bat&#xff0c;脚本如下&#xff1a;echooffecho准备开始echo设置路径setROOT_PATH"F:\test"setPROJECT_PATH"%ROOT_PATH%\proj.android"setRESOURCES_…...