有人可以解释一下这个过滤图吗?

Could someone please explain this filter graph?

https://www.ffmpeg.org/doxygen/trunk/filtering_video_8c-example.html

    filter_graph = avfilter_graph_alloc();
    // ...
    const AVFilter *buffersrc  = avfilter_get_by_name("buffer");
    const AVFilter *buffersink = avfilter_get_by_name("buffersink");
    // ...
    /* buffer video source: the decoded frames from the decoder will be inserted here. */
    snprintf(args, sizeof(args),
            "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
            dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
            time_base.num, time_base.den,
            dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
 
    ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
                                       args, NULL, filter_graph);
    /* buffer video sink: to terminate the filter chain. */
    ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
                                       NULL, NULL, filter_graph);
    // ...
/*
     * Set the endpoints for the filter graph. The filter_graph will
     * be linked to the graph described by filters_descr.
     */
 
    /*
     * The buffer source output must be connected to the input pad of
     * the first filter described by filters_descr; since the first
     * filter input label is not specified, it is set to "in" by
     * default.
     */
    outputs->name       = av_strdup("in");
    outputs->filter_ctx = buffersrc_ctx;
    outputs->pad_idx    = 0;
    outputs->next       = NULL;
 
    /*
     * The buffer sink input must be connected to the output pad of
     * the last filter described by filters_descr; since the last
     * filter output label is not specified, it is set to "out" by
     * default.
     */
    inputs->name       = av_strdup("out");
    inputs->filter_ctx = buffersink_ctx;
    inputs->pad_idx    = 0;
    inputs->next       = NULL;
 
    if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
                                    &inputs, &outputs, NULL)) < 0)

所以我分别看到这些部分是这样的:

但我无法在脑海中组合它们。
这些 inout 过滤器在任何地方都一样吗?
这些 inputsoutputs 是什么过滤器或图表?如果解析图从 in 过滤器获取输入,为什么它(in 过滤器)在 outputs 变量中然后(反之亦然)!?这些变量的作用是什么?
你能解释一下这个代码是如何工作的吗

Are these in and out filters the same everywhere?

它们是 filter_descr 的输入和输出缓冲区,它必须是一个过滤器链(单输入,单输出)。如果你有 MIMO filtergraph,inputsoutputs 将是数组,它们的每个元素都由 avfilter_inout_alloc().

分配

What filter or graph are these inputs and outputs?

它们用于在 filter_descr

中定义的过滤器图

If the parsed graph takes the input from in filter, why is it (in filter) in outputs variable then (and vice versa)!? What is even the role of these variables?

已编辑:他们将(解码器 + buffersrc)视为源系统,其中 outputs 帧到 filter_descr 滤镜的 in 垫,并且(buffersink + 编码器)作为目标系统,它从 filter_descr 过滤器图的 out 垫接收其 inputs。因此本例中的变量命名约定。

显然,它们只是变量命名约定,我同意你将它们倒着命名,但是|:耸耸肩:|。重命名它们,以免以后混淆。我记得几年前也经历过所以我100%理解。

下面是原始答案

Filtergraph 本身应该在 avfilter_graph_parse_ptr() 解析的字符串 filters_descr 中定义。说一个简单的缩放 filters_descr = "[in]scale=iw/2:-1[out]"。这个过滤器图有一个过滤器 scale,它接受 1 个输入(有 1 个输入垫)和 1 个输出(有 1 个输出垫)。 [in][out] 是这些 I/O 打击垫的标签。

现在,在实现此过滤器时,您需要将 [in][out] 焊盘分别连接到解码器和编码器。为此,您使用 buffersrcbuffersink 端点过滤器,以便数据帧可以是图形的 in/out。但是,这些过滤器并未在 filters_descr 中明确指定。因此,在代码片段中,这些端点过滤器是由 avfilter_graph_create_filter() 函数创建的,您可以注意到它们的焊盘相应地命名为 "in""out"

最后,avfilter_graph_parse_ptr 创建一个由 filters_descr 指定的网络并连接 inputsoutputs(它们可以是数组以支持具有多个输入和输出的过滤图。