Filter滤镜剖析—format

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

关于 format 滤镜的用法请阅读一下前文《FFmpeg的视频format滤镜介绍》。

format 滤镜的实现是在 libavfilter/vf_format.c 里面的,但是 format 是没有实现自己的 filter_frame() 函数的,所以他调的是 default_filter_frame(),如下:

1-1

你可以把 default_filter_frame() 看成是一个空函数,他里面实际上什么都不做的,只是把 AVFrame 传递给下一个 fifo 队列。

这里读者可能会有一个疑问,format 滤镜不是转化像素格式的吗,如果什么都不做,怎么得到指定的像素格式?

这个是这样的,format 滤镜转化像素格式是依赖 graph_config_formats() 来实现的,在前面创建滤镜链的时候,有一个协商格式的过程,如果两个相邻的 滤镜,他们支持的 格式不一样,就会在中间自动插入一个 scale 滤镜来进行格式转化。如下图:

1-2

上图中 overlay 输出的格式是 yuv420p,但是我们设置了 format 滤镜的像素格式为 rgb48be,这时候两个相邻滤镜的格式是不一致的。所以在 graph_config_formats() 的时候,就会自动插入一个 scale 滤镜来帮我们实现格式转化,代码如下:

//自动插入 scale 滤镜的部分代码
filter = avfilter_get_by_name("scale")
...省略...
snprintf(inst_name, sizeof(inst_name), "auto_scaler_%d", scaler_count++);

FFmpeg书籍版权所属@罗上文 2025 all right reserved,powered by Gitbook该文件修订时间: 2026-08-14 15:25:19

results matching ""

    No results matching ""