Добавление одного и того же фильтра несколько раз в график DirectShow - PullRequest
1 голос
/ 28 апреля 2011

проблему, которую я имею, немного трудно объяснить без предварительного объяснения того, что я пытаюсь сделать, поэтому я начну с этого.Я пытаюсь получить сэмплы из нескольких видеопотоков, используя комбинацию фильтров Sample Grabber + Null Renderer в Directshow.Источники ввода могут быть любыми: от веб-камеры до видеофайла и URL-адреса.Я знаю, как сделать это для одного источника ввода, получить IBaseFilter источника ввода и затем использовать CoCreateInstance (), чтобы получить указатели IBaseFilter для выборочного граббера и нулевого средства визуализации:используйте функцию FilterGraph :: AddFilter (), чтобы добавить все 3 фильтра, и используйте другой интерфейс, например CaptureGraphBuilder2, для рендеринга потока.Но что происходит, когда я хочу рендерить из нескольких источников одновременно?Я могу добавить все исходные фильтры к графику, но как насчет фильтров Sample Grabber и Null Renderer, чтобы заполнить график для каждого видеопотока?Могу ли я сделать что-то вроде:

IGraphBuilder *graph_builder;
ICaptureGraphBuilder2 *cap_graph;
IMediaControl *media_control;
// ... set up graph_builder and cap_graph and media_control
cap_graph->AddFilterGraph(graph_builder);

IBaseFilter *new_source;
wchar_t *source_name; // Allocate some memory

while(ScanForSource(&new_source, &source_name)) {    
    graph_builder->AddFilter(new_source, source_name);
    graph_builder->AddFilter(sample_grabber_filter, new_sg_name);
    graph_builder->AddFilter(null_renderer, new_nr_name);
    cap_graph->RenderStream(&PIN_CATEGORY_PREVIEW, 
    &MEDIATYPE_Video, new_source, sample_grabber_filter, null_renderer);
}

Будет ли работать что-то подобное вышеописанной реализации?Если нет, то есть ли другой способ сделать это?Буду признателен за любую оказанную помощь.Спасибо!

1 Ответ

1 голос
/ 28 апреля 2011

Да, вы можете создавать и вставлять в свой график множество примеров грабберов и рендеров.Только не забудьте создать их отдельно (вызывайте CoCreateInstance для каждого), не пытайтесь вставить один и тот же экземпляр много раз.

...