在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链式过滤器形成一个过滤器图。ffmpeg区分了两种类型的filtergraphs:简单和复杂。
简单的filtergraphs
简单的filtergraphs是那些只有一个输入和输出,两个都是相同类型的。在上图中,它们可以通过在解码和编码之间插入一个附加步骤来表示:
_________ ______________ | | | | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| | / encoder filtergraph | filtered |/ | frames | |__________|简单的filtergraphs配置了per-stream-filter选项(视频和音频分别使用-vf和-af别名)。视频的简单filtergraph可以如下所示:
_______ _____________ _______ ________ | | | | | | | | | input | ---> | deinterlace | ---> | scale | ---> | output | |_______| |_____________| |_______| |________|请注意,某些过滤器会更改框架属性,但不会更改框架内容。E、 g.上例中的fps过滤器改变帧数,但不接触帧内容。另一个例子是setpts过滤器,它只设置时间戳,否则会原封不动地传递帧。
复杂的filtergraphs
复杂过滤图不能简单地描述为应用于一个流的线性处理链。例如,当图形有多个输入和/或输出时,或者当输出流类型不同于输入时,就是这种情况。它们可用下图表示:
_________ | | | input 0 |\ __________ |_________| \ | | \ _________ /| output 0 | \ | | / |__________| _________ \| complex | / | | | |/ | input 1 |---->| filter |\ |_________| | | \ __________ /| graph | \ | | / | | \| output 1 | _________ / |_________| |__________| | | / | input 2 |/ |_________|