ffmpeg的Filtering
ffmpeger 发布于 2021-03-06

在编码之前,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 |/
|_________|

使用-filter_Complex选项配置复杂filtergraphs。注意,这个选项是全局的,因为一个复杂的filtergraph,就其性质而言,不能明确地与一个流或文件相关联。

-lavfi选项相当于-filter_complex。

复杂filtergraph的一个小例子是叠加滤波器,它有两个视频输入和一个视频输出,其中一个视频叠加在另一个视频上。它的音频对应物是amix滤波器。
ffmpeger
关注 私信
文章
63
关注
0
粉丝
0