跳到主要内容

FFmpeg滤镜API

阅读量

0

阅读人次

0

FFmpeg 的 libavfilter 滤镜子系统当初是 Michael Niedermayer 引入的。据说 FFmpeg 的 Filter 是借鉴的 mplayer,而 mplayer 的 FIlter 又跟 Windows Media 的 Filter 有异曲同工之妙。

FFmpeg 采用了 Filter Graph 的模型来管理整个数据流的处理,参与数据处理的各个功能模块叫做 Filter(滤镜)。

普通的用户在使用音视频剪辑软件的时候,会把滤镜这个词理解为 app 上提供的一些特效,例如 变场,镜像,加水印 等等。

但是在 FFmpeg 音视频开发领域,Filter(滤镜)是指对音视频数据的处理,包括 裁剪,转换采样率格式,转换封装格式 等等,这些很简单的功能,在 FFmpeg 里面也是 一个 Filter。

所以,你可以把 Filter(滤镜)看成是一个大杂烩,有很多功能,这些功能都是用来对音频或者视频的数据进行处理。

各个 Filter 会在 Filter Graph 中 按照一定的顺序连接起来,流水线式 地 协同工作,如下:

Filter 大致可以分为 3 类,如下:

  1. buffer Filter,输入源 Filter,负责接受 AVFrame 的输入。可以调 av_buffersrc_add_frame_flags() 函数 往 这个 FIlter 输入 AVFrame。

    在复杂滤镜场景下,输入源 FIlter 可以有多个,同时接受多个输入流的数据输入。

  2. 功能性 Filter,功能性 Filter 负责处理音视频数据。例如 scale Filter 就是一个功能性的 Filter,还有 overlay,colorkey,drawtext 等等,这些都属于功能性 Filter。

  3. buffersink Filter,输出 Filter,可以调 av_buffersink_get_frame_flags() 函数,从这个 buffersink FIlter 里面读取出来已经处理好的 AVFrame。

在复杂滤镜场景下,输出 Filter 也是可以有多个的,同时输出多个流。