ffmpeg文档32-滤镜链图介绍

滤镜链图介绍

一个滤镜链图(filtergraph)是连接滤镜的有向图。它可以包含循环动作,也可以在多个滤镜间形成链路,每个链接都有一个连接到滤镜的输入和一个连接到滤镜的输出。

滤镜链图中的每个滤镜都是一个滤镜注册类应用程序的实例,它定义了滤镜的功能、输入接口和输出接口。

如果滤镜没有输入端(接口),则被称作“源”,如果滤镜没有输出端则被称作“槽”(这样的滤镜用于描述/测试等场景,而不用于实际处理)

滤镜链图语法

滤镜链图采用文本表示,其有由一些ffmpeg和ffplay通用的选项-filter/-vf/-af-filter_complex(ffmpeg)以及-vf/-af(ffplay)外加定义与libavfilter/avfilter.havfilter_graph_parse_ptr()等来描述。

一个滤镜链包含序列链接起来的滤镜,这个序列由“,”分隔各个滤镜描述

一个滤镜链图包含序列滤镜链,这个序列有“;”分隔各个滤镜链描述

一个滤镜由一个字符串表单表示:[in_link_1]...[in_link_N]filter_name=arguments[out_link_1]...[out_link_M]

这里filter_name是滤镜类名字,用于指定滤镜实例(它注册于程序中)。其后的=arguments用于指定滤镜选项。arguments是用于初始化滤镜的参数,它可能有下面两类表单中的一个:

  • 一个“:”分隔的key=value列表
  • 一个“:”分隔的列表value值,在这种情况下,键(key)假定为选项名声明顺序,如fade滤镜按顺序声明了3个选项typestart_framenb_frames,则参数in:0:30意味着typeinstart_frame0nb_frames30
  • 前面二者的混合。这种情况下,键值对必须在前,然后接遵循相同约束的若干值。在键值对中可以按任意顺序设置优先顺序。(后接值按最后一个键值对顺序延续设置)。

如果选项的值本身就是一个列表(例如format滤镜有一个像素格式列表选项),则这种列表通常用“|”分隔。

列表参数可以被(单引号)包含起来。字符\作为转义字符用于引号包含的文本。否则参数字符串在遇到特殊字符(例如‘[]=;,‘)处被看作终止。

在滤镜名和参数前 和 后 有一个连接标签列表。一个连接标签允许命名1个名字的连接,其作为滤镜的输入或者输出端口。以下预订标签in_link_1 ... in_link_N作为滤镜的输入端,out_link_1 ... out_link_M作为滤镜的输出端。

当中一个滤镜链图中找到相同名字的连接标签时,一个在相应输入端和输出端之间的连接被创建(即认为它们是连接在一起的,如果用做一个滤镜的输出,又用着一个滤镜的输入,则表示从前一个滤镜输出到后一个滤镜)

如果一个输出端没有命名标签,它默认连接到滤镜链上后面滤镜中第一个没有命名标签的输入端。例如:

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

这里split有两路输出,overlay有两路输入,split的第一路输出被命名为标签"L1",overlay的第一路输入被命名为标签"L2"。则split的第二路输出链接到overlay的第二路输入(它们都没有用标签命名)。

在一个滤镜描述中,如果第一个滤镜的输入没有指定,则假定为"in",如果最后一个滤镜输出没有指定,则假定为"out"

在一个完整的滤镜链上,所有未标签命名的输入和输出必须被连接(匹配)。滤镜链图中如果所有滤镜的输入和输出都被连接则被认为是有效的。

如果格式要求,则Libavfilter会自动插入scale滤镜。对于滤镜链图描述,可以通过sws_flags=flags来指定swscale标志实现自动插入放缩。

这里有一个BNF描述的滤镜链图语法:

NAME ::= sequence of alphanumeric characters and ‘_‘
LINKLABEL::= "[" NAME "]"
LINKLABELS   ::= LINKLABEL [LINKLABELS]
FILTER_ARGUMENTS ::= sequence of chars (possibly quoted)
FILTER   ::= [LINKLABELS] NAME ["=" FILTER_ARGUMENTS] [LINKLABELS]
FILTERCHAIN  ::= FILTER [,FILTERCHAIN]
FILTERGRAPH  ::= [sws_flags=flags;] FILTERCHAIN [;FILTERGRAPH]

注意滤镜链图中的转义

滤镜链图成分需要包含多层的转义。参考ffmpeg-utils(1) 手册中的“引用与转义”章节("Quoting and escaping" )了解更多关于转义过程的信息。

第一层的转义效果在每个滤镜选项值中,其可能包含特殊字符":"来分隔值,或者一个转义符""

第二层的转义在整个滤镜描述,其可能包含转义符""或者特殊字符"[],;" ,它们被用于滤镜链图的描述

实际上,当你在shell命令行上描述滤镜链图时还可能遇见第三层的转义(处理shell中需要转义的字符)

例如下面的字符需要嵌入drawtext滤镜描述的text

this is a ‘string‘: may contain one, or more, special characters

这个字符串包含字符需要被转义,还有:这里也需要被转义,方法是:

text=this is a \‘string\‘\: may contain one, or more, special characters

当嵌入滤镜描述时发生第二层的转义,为了转义所有的滤镜链图特殊字符,需要按下例处理:

drawtext=text=this is a \\\‘string\\\‘\\: may contain one\, or more\, special characters

注意对于‘转义中的每个特殊字符都需要再次转义,就成了\‘)

最终当在shell命令行中写这个滤镜链图时再次转义。例如需要对每个特殊字符和转义处理的\等进行转义,最终为:

-vf "drawtext=text=this is a \\\\\\‘string\\\\\\‘\\\\: may contain one\\, or more\\, special characters"
时间: 2024-10-27 14:20:36

ffmpeg文档32-滤镜链图介绍的相关文章

ffmpeg文档40-多媒体滤镜

40 多媒体滤镜 下面介绍当前有效的多媒体滤镜 avectorscope 转换输入音频到视频输出以代表音频矢量范围(一种图形化音频处理) 这个滤镜用来测量立体声音频中两路音频间的区别.如果是单声道信号做成的2个声道(左右耳声道),因为两路完全相同(其实只有1路),所以输出是一个垂直的直线(表示二者无差别).如果是立体声信号(两路肯定或多或少有差别),则创建一个利萨如(Lissajous)图形,其水平看,线长度与相位等表征了两个声道差异情况. 滤镜接受如下选项: mode, m 设置矢量显示模式,

ffmpeg文档26-输入设备

26 输入设备 FFmpeg中的输入设备配置元素用来启用对附加到您的系统一个多媒体设备访问数据. 当编译时,默认会支持所有的输入设备.你可以通过在配置脚本执行时附加–list-indevs了解到支持的设备. 可以通过–disable-indevs在编译时禁用所有输入设备,也可以在此基础上通过–enable-indev=INDEV允许个别设备,或者在默认支持基础上通过–disable-indev=INDEV禁用个别设备支持达到类似的目的. 在ff*工具集中,使用-devices可以获取当前支持的设

ffmpeg文档05-选项

5 选项 所有的数值选项,如果没有特殊定义,则需要一个接受一个字符串代表一个数作为输入,这可能跟着一个单位量词首字母,例如"k","m"或"G" 如果i是附加到SI单位的首字母,完整的字母将被解释为一个2的幂数单位,这是基于1024而不是1000的,添加B的SI单位则是再将此值乘以8.例如KB,MiB,G和B 对于选项中不带参数的布尔选项,即把相应的值设置为true,它们可以添加no设置为false,例如nofoo就相当于foo false .

ffmpeg文档38-视频源

38 视频源 下面是当前有效的视频源 buffer 缓冲视频帧,其可以作为滤镜链图的环节 它通常用于编程,特别是通过libavfilter/vsrc_buffer.h的接口. 接受如下参数: video_size 指定视频尺寸,(同时指定width 和 height).语法同于ffmpeg-utils手册中的视频尺寸章节. width 输入视频宽 height 输入视频高 pix_fmt 像素格式描述,可以是一个表征像素格式的号码或者名称 time_base 指定时间戳时基 frame_rate

ffmpeg文档35-音频源

35 音频源 下面介绍当前可用的音频源 abuffer 缓冲音频帧,作为滤镜链图中有效的组成(起点) 它主要编程使用,特别是通过libavfilter/asrc_abuffer.h中的接口进行调用. 接受如下参数: time_base 用于提交帧的时间戳时基.是浮点数或者分数形式. sample_rate 进入音频缓冲的采样率. sample_fmt 进入音频缓冲的采样格式.libavutil/samplefmt.h下AVSampleFormat枚举值中的一个格式名称或者对应的整数 channe

ffmpeg文档30-滤镜入门

30 滤镜入门 FFmpeg通过libavfilter库实现滤镜功能. 在libavfilter中,一个滤镜可以有多个输入和多个输出.为了尽可能介绍清楚,我们假定有下面的滤镜链图. [main] input --> split ---------------------> overlay --> output | ^ |[tmp] [flip]| +-----> crop --> vflip -------+ 在这个滤镜链图中,利用split滤镜把输入流分离成了两路流,其中一

ffmpeg文档33-时间线编辑

33 时间线编辑 一些滤镜支持常规的enable选项.对于支持时间线编辑的滤镜,这个选项可以被设置为一个表达式,其通过评估之前的情况来决定是否把帧画面发送给滤镜.如果表达式计算结果为非0值,则表明滤镜被使用,否则滤镜将被跳过(即把帧画面直接送到滤镜链图的下一个滤镜中) 表达式中可以出现下面的值: ‘t’ 时间戳,单位秒.如果输入时间戳未知则为NAN ‘n’ 输入帧的序数,从0开始计数 ‘pos’ 输入帧在文件中的偏移位置,如果未知则为NAN ‘w’ ‘h’ 视频输入帧的宽和高 此外,这些滤镜en

ffmpeg文档43-开发者

43 开发者 是FFmpeg的开发者 关于作者的详细信息,可以观看项目(git://source.ffmpeg.org/ffmpeg)的Git历史,或者项目中目录中使用命令git log了解,或者浏览在线的源码(http://source.ffmpeg.org) 源代码树中维护者文件(MAINTAINERS)列出了特定组件的维护人员 另本文档英文版本由makeinfo于2015年6月16日生成 汉化翻译补充说明 由xdsnet(xdsnet at gmail dot com)在2015年6月16

ffmpeg文档16-音频编码器

16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC).要使用这个编码器,必须选择 ‘experimental’或者'lower' 因为当前还处于实验期,所以很多意外可能发生.如果需要一个更稳定的AAC编码器,参考libvo-aacenc,然而它也有一些负面报告. aac选项 b 设置码率,单位是bits/s,是自动恒定比特率(CBR)模式的码率 q 设置为