1、創建一個濾鏡圖 | AVFilterGraph *filter_graph = avfilter_graph_alloc(); |
2、創建濾鏡的輸入和輸出 | AVFilterInOut *inputs = avfilter_inout_alloc(); AVFilterInOut *outputs = avfilter_inout_alloc(); |
3、每個濾鏡創建上下文 | AVFilterContext *filter1_ctx = avfilter_graph_alloc_filter(filter_graph, filter1, "filter1"); AVFilterContext *filter2_ctx = avfilter_graph_alloc_filter(filter_graph, filter2, "filter2"); |
4、設置濾鏡參數 | snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", codecContext->width, codecContext->height, codecContext->pix_fmt, codecContext->time_base.num, codecContext->time_base.den, codecContext->sample_aspect_ratio.num, codecContext->sample_aspect_ratio.den); |
5、添加輸入濾鏡 | avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "input", args, nullptr, filter_graph); |
6、添加輸出濾鏡 | avfilter_graph_create_filter(&buffersink_ctx, buffersink, "output", nullptr, nullptr, filter_graph); |
7、將濾鏡的輸入和輸出與對應的濾鏡上下文關聯起來 | inputs->name = av_strdup("input"); inputs->filter_ctx = filter1_ctx; inputs->pad_idx = 0; inputs->next = NULL; outputs->name = av_strdup("output"); outputs->filter_ctx = filter2_ctx; outputs->pad_idx = 0; outputs->next = NULL; |
8、解析濾鏡描述 | avfilter_graph_parse_ptr(filter_graph, filter_descr, &inputs, &outputs, nullptr); |
9、連接濾鏡鏈接 | avfilter_graph_config(filter_graph, nullptr); |
10、清理資源 | avfilter_inout_free(&inputs); avfilter_inout_free(&outputs); avfilter_graph_free(&filter_graph); |