FFmpeg 的滤镜是一个非常强大的功能,强大跟庞大是一个意思。从另一个角度解释,FFmpeg 的滤镜其实是一个大杂烩,什么功能都有。
不要被滤镜这个词欺骗,FFmpeg 的滤镜不止可以做一些特效,加水印之类的,还可以裁剪视频时长,转换采样率,或者转换像素格式等等。
本文有代码提供给大家学习
代码压缩包里有 3个项目,分别演示了 3 种使用 滤镜函数的方法
FFmpeg 的滤镜函数,其实是比较复杂的。
跟滤镜有关的数据结构有以下:
AVFilterGraph
,滤镜容器,里面可以有多个 滤镜上下文AVFilterInOut
,滤镜链表,avfilter_graph_parse2
函数有时候会设置这个结构体,开放输入跟输出给其他的滤镜上下文来链接。AVFilterContext
,滤镜上下文,可以看成是滤镜的实例AVFilter
,滤镜信息。
跟滤镜有关的API函数有以下:
avfilter_graph_alloc
,创建滤镜容器。avfilter_get_by_name
,根据字符串名字找出AVFilter
avfilter_graph_create_filter
,根据AVFilter
来创建创建滤镜上下文。同时会把新创建的滤镜上下文放进去滤镜容器。avfilter_link
,连接两个滤镜上下文。avfilter_graph_parse2
,根据 传递的字符串语法 来创建 一个 或者 多个 滤镜上下文,多个滤镜会根据语法自动连接。同时会把新创建的滤镜上下文放进去滤镜容器。avfilter_graph_config
,正式打开滤镜容器。avfilter_graph_get_filter
,根据名称获取 滤镜容器内部的某个 滤镜上下文。av_buffersrc_add_frame_flags
,往 滤镜上下文 发送一个AVFrame
,让滤镜进行处理。av_buffersink_get_frame_flags
,从滤镜上下文读取已经处理好的AVFrame
。
FFmpeg 里面有两个特殊滤镜,buffer
输入滤镜 跟 buffersink
输出滤镜。
一个滤镜容器