Я пытаюсь выяснить, как вызвать FFmpeg
фильтр ( freezedetect
) из исходного кода FFmpeg. Я вижу, что файл фильтра находится под libavfilter/vf_freezedetect.c
, но я не знаю, как использовать этот фильтр в исходном коде. Как мне это сделать? А что мне нужно передать в функцию?
API высокого уровня моей команды FFmpeg таков:
ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2" -map 0:v:0 -f null -
И что мне нужно, чтобы получить результирующие результаты непосредственно после вызова функции с учетом ее входных аргументов:
lavfi.freezedetect.freeze_start: 5.005
lavfi.freezedetect.freeze_duration: 2.03537
lavfi.freezedetect.freeze_end: 7.04037
lavfi.freezedetect.freeze_start: 13.0464
lavfi.freezedetect.freeze_duration: 3.03637
lavfi.freezedetect.freeze_end: 16.0827
Вы не можете просто вызвать фильтр, вы должны создать экземпляр графа фильтра.
Сначала вам нужно создать buffer
и buffersink
через:
AVFilterContext* source = 0;
AVFilterContext* sink = 0;
AVFilterGraph *graph = avfilter_graph_alloc()
avfilter_graph_create_filter(&source, avfilter_get_by_name("buffer"), nullptr, args, nullptr, graph);
AVBufferSinkParams* buffersink_params = av_buffersink_params_alloc();
buffersink_params->pixel_fmts = /*Your pixel format HERE*/;
avfilter_graph_create_filter(&sink, avfilter_get_by_name("buffersink"), nullptr, nullptr, buffersink_params, graph);
Затем вы можете создать свой фильтр с помощью чего-то вроде этого
snprintf(args, sizeof(args), "n=-60dB:d=2");
avfilter_graph_create_filter(&freezedetect, avfilter_get_by_name("freezedetect"), nullptr, args, nullptr, graph);
Затем соедините все вместе:
avfilter_link(source, 0, freezedetect, 0);
avfilter_link(freezedetect, 0, sink, 0);
avfilter_graph_config(graph, 0);
Наконец, вы можете отправлять кадры в фильтр через
av_buffersrc_write_frame(source, frame);
И получить результат с
av_buffersink_get_frame(sink, frame);
Не забудьте освободить все это в конце
SlimSCSI
Тина Дж
Логан
doc/examples
. исходный код FFmpeg, напримерfiltering_video.c
.Тина Дж
Тина Дж
Логан
ffmpeg -filters
чтобы увидеть, какие фильтры поддерживают многопоточность слайсов.