输入参数const char *filters_descr
以字符串形式提供滤镜选项,例如参数为transpose=cclock,pad=iw+80:ih:40时,表示将视频帧逆时针旋转90度,然后在视频左右各填充40像素的黑边。
输入参数input_vfmt_t *vfmt
用于描述提供给滤镜图的视频帧和格式,在配置滤镜图中的第一个滤镜buffer时需要为滤镜提供参数,就是从vfmt参数转换得到。
input_vfmt_t为自定义数据结构,定义如下:
typedef struct {
int width;
int height;
enum AVPixelFormat pix_fmt;
AVRational time_base;
AVRational sar;
AVRational frame_rate;
} input_vfmt_t;
输出参数filter_ctx_t *fctx
用于返回生成滤镜图的信息,供调用者使用。
filter_ctx_t为自定义数据结构,定义如下:
typedef struct {
AVFilterContext *bufsink_ctx;
AVFilterContext *bufsrc_ctx;
AVFilterGraph *filter_graph;
} filter_ctx_t;
此结构中三个成员:bufsrc_ctx用于滤镜图的输入,bufsink_ctx用于滤镜图的输出,filter_graph用于销毁滤镜图。
TODO: 一个滤镜图可能含多个滤镜链,即可能有多个输入节点(bufsrc_ctx)或多个输出节点(bufsink_ctx),此数据结构应改进为支持多输入和多输出
init_filters()函数实现的几个步骤如下:
3.1.1 配置滤镜图输入端和输出端
buffer滤镜和buffersink滤镜是两个特殊的视频滤镜,分别用于视频滤镜链的输入端和输出端。与之相似,abuffer滤镜和abuffersink滤镜是两个特殊的音频滤镜,分别用于音频滤镜链的输入端和输出端。
一个滤镜图可能由多个滤镜链构成,每个滤镜链的输入节点就是buffer滤镜,输出节点是buffersink滤镜,因此一个滤镜图可能有多个buffer滤镜,也可能有多个buffersink滤镜。应用程序通过访问buffer滤镜和buffersink滤镜实现和滤镜图的数据交互。
buffer滤镜
在命令行中输入ffmpeg -h filter=buffer查看buffer滤镜的帮助信息,如下:
$ ffmpeg -h filter=buffer
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
Filter buffer
Buffer video frames, and make them accessible to the filterchain.
Inputs:
none (source filter)
Outputs:
#0: default (video)
buffer AVOptions:
width
<int>
..FV..... (from 0 to INT_MAX) (default 0)
video_size
<image_size> ..FV.....
height
<int>
..FV..... (from 0 to INT_MAX) (default 0)
pix_fmt
<pix_fmt> ..FV..... (default none)
sar
<rational> ..FV..... sample aspect ratio (from 0 to DBL_MAX) (default 0/1)
pixel_aspect
<rational> ..FV..... sample aspect ratio (from 0 to DBL_MAX) (default 0/1)
time_base
<rational> ..FV..... (from 0 to DBL_MAX) (default 0/1)
frame_rate
<rational> ..FV..... (from 0 to DBL_MAX) (default 0/1)
sws_param
<string>
..FV.....