天天看点

(原)ffmpeg过滤器开发和理解

最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下:

AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串连接起来的filter们.

AVFilter:代表一个filter.

AVFilterPad:代表一个filter的输入或输出口,等同于DShow中的Pin.只有输出pad的filter叫source,只有输入pad的tilter叫sink.

AVFilterLink:代表两个连接的fitler之间的粘合物.

然后分别看下各自的结构定义

1,过滤器结构体定义:

2,过滤器输入输出pad结构体AVFilterPad介绍

3,过滤器实例上下文结构体AVFilterContext介绍

对于他们的关系,我们借用一下别人画的这个图:

(原)ffmpeg过滤器开发和理解

结合这个图,我们来分析一下,过滤器直接的数据传递是怎么样的,什么样的过滤器需要在AVFilterPad结构体里面定义filter_frame函数来做过滤器应该做的事情,什么时候更加适合考虑把过滤器处理数据的事情放到AVFilter的activate函数里面。

先说一下我个人的理解:针对只有一个输入流的过滤器,直接对过滤器中的唯一的一个帧原始数据进行处理的,例如scale这种的过滤器,我们更加合适把过滤器的事情放到pad里面的filter_frame函数中来处理,而对于将多个输入流的数据进行处理的过滤器,例如overlay(它必须有两个输入数据,main,overlay两层),他更加适合将数据放到处理过程放入到avfilter的activate函数里面,通过它来调用ff_framesync_activate函数,从而调用FFFrameSync中的on_event处理。