FFmpeg开发教程(2) --- 过滤器中涉及的主要结构说明

       本系列文章居于FFMpeg源码4.1版本,因此,有些流程和老版本会有稍微差别(源码我做了详细注释,有需要请在下方评论留言,写明邮箱,我会统一发给你们)。       

       在FFmepg中,在对AVPacket包进行解码后获取的帧AVFrame,可以通过一系列的过滤器进行处理后,最终获取到处理完的帧AVFrame进行显示或播放,虽然我们应用开发中可以自己在解码后自行完成这些转换操作,不过在FFmepg中,已经把这个流程给我们模块化了,这就是FFmpeg中的过滤器,这在FFmpeg中是一个模块化比较高的功能,因此,在讲解FFmpeg过滤器之前,我们先把其涉及到的主要结构先搞清楚。

       在FFmepg开发中,涉及到过滤器的主要结构如下:

       上图是FFMpeg中过滤器实现涉及到的几个主要数据结构,图中虚线框内的表示组合关系。

     AVFilterPad

       这个结构定义了过滤器怎么样对上一个过滤器的输入(AVFrame)进行处理,以及处理后的数据怎么样传给下一个过滤器,其实AVFilterPad定义了一系列的处理函数,这些处理函数由具体过滤器实现。

       下面对几个比较重要的成员进行说明:

       type:AVMediaType类型,表示过滤器处理的媒体类型(比如一个过滤器链表上要么都是处理视频,要么都是处理音频)。

       filter_frame:这个是很重要的函数,主要用来对传入的AVFrame进行处理,然后输出处理完后的数据,所以这个函数处理的是输入的数据,因此在AVFilter只对输入有效,输出时不调这个函数。

       request_frame:此函数主要是过滤器输出使用,当我们需要告诉下一个过滤器处理AVFrame时之前需要做的一些处理,比如设置下一个过滤器的ready优先级,为下一个过滤器激活处理做准备。

     AVFilter

       AVFilter定义了一个过滤器所需要的信息,比如过滤器名称、描述、输入、输出以及过滤器的初始化的函数定义等,此结构在FFMpeg源码里有比较详细的注释,这里我们说下比较重要的几个成员变量。

       inputs:AVFitlerPad类型,其表示怎么样来处理上一个过滤器处理后的数据(AVFrame),这个成员表示的AVFilterPad在封装到AVFilterContext时候,会把其赋值给AVFilterContext的input_pads。

       outputs:AVFitlerPad类型,其表示怎么样来为下一个过滤器的执行所做的处理,比如上面对AVFilterPad介绍的那样,设置下一个过滤器的ready优先级,为其激活做准备。这个成员表示的AVFilterPad在封装到AVFilterContext时候,会把其赋值给AVFilterContext的output_pads。

     AVFilterContext

       这个结构封装AVFilter的上下文,其包含的信息比较多,比如AVFilter,AVFilter的输入、输出以及连接两个AVFilter(连接的事实上是AVFilterContext)的AVFilterLink等。

       filter:具体的过滤器对象(我们自己实现的过滤器);

       input_pads:过滤器filter的inputs的信息;

       output_pads:过滤器filter的outputs的信息;

       inputs:和上一个过滤器连接的结构对象AVFilterLink(和上一个过滤器的outputs相同);

       outputs:和下一个过滤器连接的结构对象AVFilterLink(和下一个过滤器的inputs相同);

       priv:过滤器自己的私有数据;

       graph:所有过滤器的管理对象;

     AVFilterLink

       此结构用来连接两个AVFilterContext,相当于把AVFilterGraph管理的AVFilterContext给串联起来,使得我们可以向前、向后遍历过滤器的信息,下面我们看看其定义的主要的几个成员就明白了。

       src:源过滤器,其实就是相对于dst来说的,它在dst过滤器之前,src的输入就是dst的输入;

       dst:目标过滤器,这也是相对src来说的,表示dst之前的过滤器是src,dst过滤器需要接收src的输入;

       srcpad:源过滤器的AVFilterPad,不明白的可以看看上面AVFilterPad的说明,其实就是src过滤器的处理逻辑的封装信息;

       dstpad:目标过滤器的AVFilterPad,就是dst里面的outputs;

       type:这个type初始化为src的type,所以dst过滤器的type要和源src的type一样。这个type上面有介绍,就是媒体类型,表示是视频类型还是音频类型。

       fifo:存储等待被过滤器处理的帧AVFrame,过滤器处理时会从这个队列取出需要处理的AVFrame。

     AVFilterGraph

       这是过滤总的结构,管理加入的所有过滤器(AVFilterContext)。

       filters:保存所有加入的过滤器信息,这里就是一个数组。

       nb_filters:AVFilterGraph中保存的过滤器的个数,就是数组filters中包含的过滤器的个数。

       在FFMpeg中过滤器主要的结构大体就说这么多,这是比较重要的结构和属性变量,其它的细节在后面具体讲解过滤的整体流程时会详细介绍。

       本系列文章均为原创,主要总结作者多年在软件行业的一些经验,和大家共同学习、进步,转载请注明出处,谢谢!

猜你喜欢

转载自blog.csdn.net/china0851/article/details/88361985