1. 参考

  • [1] ffmpeg.org/libavfilter documentation
  • [2] ffmpeg.org/Filters Documentation
  • [3] 北雨南萍/FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理

2. FFmpeg filter简介

FFmpeg filter提供了很多音视频特效处理的功能,比如视频缩放、截取、翻转、叠加等。

其中定义了很多的filter,例如以下常用的一些filter。

  • scale:视频/图像的缩放
  • overlay:视频/图像的叠加
  • crop:视频/图像的裁剪
  • trim:截取视频的片段
  • rotate:以任意角度旋转视频

支持的filter的列表可以通过以下命令获得。

ffmpeg -filters

也可以查看文档[2],具体某个版本的支持情况以命令行获取到的结果为准。

以下是filter的一个简单的应用示例,对视频的宽和高减半。

ffmpeg -i input -vf scale=iw/2:ih/2 output

3. filter的使用方法

学习filter的使用,先需要了解一下filter的语法。
FFmpeg中filter包含三个层次,filter->filterchain->filtergraph。
具体参考下图:

说明:

  • 第一层是 filter 的语法。
  • 第二层是 filterchain的语法。
  • 第三层是 filtergraph的语法。

filtergraph可以用文本形式表示,可以作为ffmpeg中的-filter/-vf/-af和-filter_complex选项以及ffplay中的-vf/-af和libavfilter/avfilter.h中定义的avfilter_graph_parse_ptr()函数的参数。

为了说明可能的情况,我们考虑下面的例子“把视频的上部分镜像到下半部分”。
处理流程如下:

  1. 使用split filter将输入流分割为两个流[main]和[temp]。
  2. 其中一个流[temp]通过crop filter把下半部分裁剪掉。
  3. 步骤2中的输出再经过vflip filter对视频进行和垂直翻转,输出[flip]。
  4. 把步骤3中输出[flip]叠加到[main]的下半部分。

CSDN文末扫码进君羊, 【免费分享】资料包括《Andoird音视频开发必备手册+音视频学习视频+学习文档资料包+大厂面试真题+2022最新学习路线图》等等

以下整个处理过程的一个图示,也就是对filtergraph的一个描述[2]。

[main]
input --> split ---------------------> overlay --> output|                             ^|[tmp]                  [flip]|+-----> crop --> vflip -------+

可以用以下的命令来实现这个流程。

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

处理结果如下图所示。

下面具体了解每一层的语法,从而理解上面这个命令的含义。

3.1 filter的语法

用一个字符串描述filter的组成,形式如下

[in_link_1]…[in_link_N]filter_name=parameters[out_link_1]…[out_link_M]

参数说明:

  1. [in_link_N]、[out_link_N]:用来标识输入和输出的标签。in_link_N是标签名,标签名可以任意命名,需使用方括号括起来。在filter_name的前面的标签用于标识输入,在filter_name后面的用于标识输出。一个filter可以有多个输入和多个输出,没有输入的filter称为source filter,没有输出的filter称为sink filter。对输入或输出打标签是可选的,打上标签是为了连接其他filter时使用。
  2. filter_name:filter的名称。
  3. “=parameters”:包含初始化filter的参数,是可选的。

“=parameters”有以下几种形式

  1. 使用':'字符分隔的一个“键=值”对列表。如下所示。
ffmpeg -i input -vf scale=w=iw/2:h=ih/2 output
  1. 使用':'字符分割的“值”的列表。在这种情况下,键按照声明的顺序被假定为选项名。例如,scale filter的前两个选项分别是w和h,当参数列表为“iw/2:ih/2”时,iw/2的值赋给w,ih/2的值赋给h。如下所示。
ffmpeg -i input -vf scale=iw/2:ih/2 output
  1. 使用':' 字符分隔混合“值”和“键=值”对的列表。“值”必须位于“键=值”对之前,并遵循与前一点相同的约束顺序。之后的“键=值”对的顺序不受约束。如下所示。
ffmpeg -i input -vf scale=iw/2:h=ih/2 output

filter类定义了filter的特性以及输入和输出的数量,某个filter的使用方式可以通过以下命令获知。

ffmpeg -h filter=filter_name

也可以查看文档[2],但具体某个版本的参数形式以命令行获取到的结果为准。

以下是rotate filter的使用方式

  • 可以看出它支持slice threading。
  • Inputs下面定义的是输入。可以看出rotate filter有一个输入,格式为Video。
  • Outputs下面定义的是输出。可以看出rotate filter有有一个输出,格式为video。
  • AVOptions下面定义了支持的参数,后面有默认值描述。为了简化输入参数,对长的参数名提供一个简化的名称。比如rotate filter中,“angle”的简化名称是“a”。

以下是使用到fiter的标签名的一个示例:抽取视频Y、U、V分量到不同的文件

ffmpeg -i jack.mp4 -filter_complex "extractplanes=y+u+v[y][u][v]" -map "[y]" jack_y.mp4 -map "[u]" jack_u.mp4 -map "[v]" jack_v.mp4    

extractplanes filter指定了三个输出,分别是 [y][u][v],抽取后,将不同的输出保存到不同的文件中。

3.2 filterchain的语法

用一个字符串描述filterchain的组成,形式如下

"filter1, filter2, ... filterN-1, filterN"

说明:

  1. 由一个或多个filter的连接而成,filter之间以逗号“,”分隔。
  2. 每个filter都连接到序列中的前一个filter,即前一个filter的输出是后一个filter的输入。

比如示例

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

示例说明:

  1. crop、vflip在同一个filterchain中,

3.3 filtergraph的语法

用一个字符串描述filtergraph的组成,形式如下
"filterchain1;filterchain2;...filterchainN-1;fiterchainN"
说明:

  1. 由一个或多个filter的组合而成,filterchain之间用分号";"分隔。
  2. filtergraph是连接filter的有向图。它可以包含循环,一对filter之间可以有多个连接。
  3. 当在filtergraph中找到两个相同名称的标签时,将创建相应输入和输出之间的连接。
  4. 如果输出没有被打标签,则默认将其连接到filterchain中下一个filter的第一个未打标签的输入。例如以下filterchain中。
nullsrc, split[L1], [L2]overlay, nullsink

说明:split filter有两个输出,overlay filter有两个输入。split的第一个输出标记为“L1”,overlay的第一个输入pad标记为“L2”。split的第二个输出将连接到overlay的第二个输入。

  1. 在一个filter描述中,如果没有指定第一个filter的输入标签,则假定为“In”。如果没有指定最后一个filter的输出标签,则假定为“out”。
  2. 在一个完整的filterchain中,所有没有打标签的filter输入和输出必须是连接的。如果所有filterchain的所有filter输入和输出pad都是连接的,则认为filtergraph是有效的[2]。

比如示例

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

其中有三个filterchain, 分别是:

  1. "split [main][tmp]"。它只有一个filter,即 split,它有一个默认的输入,即INPUT解码后的frame。有两个输出, 以 [main], [tmp] 标识。
  2. "[tmp] crop=iw:ih/2:0:0, vflip [flip]"。它由两个filter组成,crop和vflip,crop的输入 为[tmp],vflip的输出标识为[flip]。
  3. "[main][flip] overlay=0:H/2"。它由一个filter组成,即overlay。有两个输入,[main]和[flip]。有一个默认的输出。

FFmpeg filter的使用介绍相关推荐

  1. FFmpeg filter语法使用介绍

    目录 参考 FFmpeg filter简介 filter的使用方法 1. 参考 [1] ffmpeg.org/libavfilter documentation [2] ffmpeg.org/Filt ...

  2. FFmpeg filter

    一.FFmpeg filter简介 FFmpeg中的libavfilter提供了一整套的基于filter的机制.filter本身是一个插件的形式,可以快速的组装需要的效果. 比如下面的filter,可 ...

  3. FFmpeg Filter基本使用

    FFmpeg Filter基本使用 目录 FFmpeg filter简介 filter的使⽤⽅法 filter的语法 filterchain的语法 filtergraph的语法 基本结构 创建简单的滤 ...

  4. java过滤器应用实例_Servlet过滤器Filter的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Servlet过滤器Filter的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 特点 1)Filter是依赖于Servlet容器,属 ...

  5. FFMPEG filter使用实例(实现视频缩放,裁剪,水印等)

    本文转载自http://blog.csdn.net/li_wen01/article/details/62442162 FFMPEG官网给出了FFMPEG 滤镜使用的实例,它是将视频中的像素点替换成字 ...

  6. FFmpeg的scale滤镜介绍

    FFmpeg 的 scale 滤镜可以将图像的宽高进行调整,缩小或者放大. FFmpeg 的滤镜是一个非常强大的功能,强大跟庞大是一个意思.从另一个角度解释,FFmpeg 的滤镜其实是一个大杂烩,什么 ...

  7. FFmpeg Filter过滤器

    ffmpeg中有很多已经实现好的滤波器,这些滤波器的实现位于libavfilter⽬录之下,⽤户需要进⾏滤 波时,就是是调⽤这些滤波器来实现的.ffmpeg对于调⽤滤波器有⼀整套的调⽤机制. FFmp ...

  8. Filter 过滤器的介绍及使用

    Filter过滤器 MySql的语法看这篇就够了,传送地址:MySql必知必会 JSP的使用看这篇就够了,传送地址:JSP必知必会 文章目录 Filter过滤器 一.Filter过滤器的介绍 二.Fi ...

  9. FFmpeg filter过滤器使用详解

    1.FFmpeg过滤器简介 FFmpeg filter 提供了很多音视频特效处理功能,比如视频缩放.截取.翻转.叠加等. FFmpeg有很多已经实现好的滤波器,这些滤波器的实现位于libavfilte ...

最新文章

  1. 三极管的耐压与hFE之间是什么关系?
  2. spring26-2: bean的作用域
  3. csdn在markdown笔记中复制代码格式混乱的解决办法
  4. ROC曲线和 AUC值的计算
  5. Java -- 注解 annotation
  6. 改成中文版的_lol手游怎么改成中文版?英雄联盟手游中文版更改教程
  7. 用c语言写代码_如何避免用动态语言的思维写Go代码
  8. [deviceone开发]-do_Album的简单示例
  9. C++程序设计:原理与实践(进阶篇)15.4 链表
  10. 利用Markdown编写数学公式
  11. 来,我们一起学Hibernate
  12. mobaxterm为什么无法连接_为什么 TCP 建立连接需要三次握手
  13. 云服务器真假辨别奥秘
  14. 图像语义分割(20) 通过图像合成方法检测训练中未出现的类别未知的物体
  15. 正阅读微信小说分销系统-视频教程-4.数据统计 包含图文教程
  16. SIFT特征匹配及其实现
  17. vbm 分析_vbm处理流程--VBM学习汇总
  18. 计算机电源烧保险,ATX电脑电源保险换了就烧怎么维修?
  19. 【模块学习】关于磁力计HMC5883L型号探索
  20. HDU5442 Favorite Donut(KMP+最大表示法)

热门文章

  1. 软件开发代码防泄密管理
  2. 什么叫压力测试(Stress Testing)
  3. 兴业证券:资产注入 资本市场的“盛宴”
  4. Photoshop CS6,Dreamweaver CS6 破解文件
  5. iOS全栈式开发工程师
  6. centos查看访问ip和屏蔽某些ip
  7. 《高标准农田建设项目耕地质量等级评价》
  8. ecognition 易康 ESP插件的使用
  9. 艺赛旗rpa项目分享
  10. linux人脸识别sdk,人脸识别裁剪API linux版下载