FFmpeg滤镜API用法与实例解析 (4)

输入参数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.....

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzpdg.html