private AVFilterGraph* init_filter_graph(AVFormatContext* format, AVCodecContext* codec, int audio_stream_index, AVFilterContext** buffersrc_ctx, AVFilterContext** buffersink_ctx) { // create graph var filter_graph = ffmpeg.avfilter_graph_alloc(); // add input filter var abuffersrc = ffmpeg.avfilter_get_by_name("abuffer"); var args = string.Format("sample_fmt={0}:channel_layout={1}:sample_rate={2}:time_base={3}/{4}", (int)codec->sample_fmt, codec->channel_layout, codec->sample_rate, format->streams[audio_stream_index]->time_base.num, format->streams[audio_stream_index]->time_base.den); ffmpeg.avfilter_graph_create_filter(buffersrc_ctx, abuffersrc, "IN", args, null, filter_graph); // add output filter var abuffersink = ffmpeg.avfilter_get_by_name("abuffersink"); ffmpeg.avfilter_graph_create_filter(buffersink_ctx, abuffersink, "OUT", "", null, filter_graph); AVFilterContext* _filter_ctx = null; for (var i = 0; i < filtersAudio.Count; i++) { var filter = ffmpeg.avfilter_get_by_name(filtersAudio[i].name); AVFilterContext* filter_ctx; ffmpeg.avfilter_graph_create_filter(&filter_ctx, filter, (filtersAudio[i].name + filtersAudio[i].key).ToUpper(), filtersAudio[i].args, null, filter_graph); if (i == 0) { ffmpeg.avfilter_link(*buffersrc_ctx, 0, filter_ctx, 0); } if (_filter_ctx != null) { ffmpeg.avfilter_link(_filter_ctx, 0, filter_ctx, 0); } if (i == filtersAudio.Count - 1) { ffmpeg.avfilter_link(filter_ctx, 0, *buffersink_ctx, 0); } _filter_ctx = filter_ctx; } ffmpeg.avfilter_graph_config(filter_graph, null); return filter_graph; }
public static extern int avfilter_open(AVFilterContext ** @filter_ctx, AVFilter * @filter, [MarshalAs(UnmanagedType.LPStr)] string @inst_name);
public static extern int avfilter_graph_create_filter(AVFilterContext ** @filt_ctx, AVFilter * @filt, [MarshalAs(UnmanagedType.LPStr)] string @name, [MarshalAs(UnmanagedType.LPStr)] string @args, void * @opaque, AVFilterGraph * @graph_ctx);
public extern static int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, [MarshalAs(UnmanagedType.LPStr)] string name, [MarshalAs(UnmanagedType.LPStr)] string args, void *opaque, AVFilterGraph *graph_ctx);