.net - Tilføjelse af det samme filter flere gange til en DirectShow-graf

Indlæg af Hanne Mølgaard Plasc

Problem



det problem, jeg har, er lidt svært at forklare uden først at forklare, hvad jeg forsøger at gøre, det begynder jeg med. Jeg forsøger at gribe prøver fra flere videostrømme ved hjælp af Sample Grabber + Null Renderer-filterkombinationen i Directshow. Indgangskilderne kan være alt fra et webcam til en videofil til en webadresse. Jeg ved, hvordan man gør dette for en enkelt inputkilde, hent IBaseFilter fra inputkilden, og brug derefter CoCreateInstance () for at få IBaseFilter-pointerne til en sample grabber og null renderer:


HRESULT hr = CoCreateInstance(CLSID\_SampleGrabber,
    NULL,
    CLSCTX\_INPROC,
    IID\_IBaseFilter,
    (void **)&sample\_grabber\_filter);

if(FAILED(hr)) {
    printf("(Fatal) Error setting up Sample Grabber.
");
    return hr;
}

hr = CoCreateInstance(CLSID\_NullRenderer,
    NULL,
    CLSCTX\_INPROC,
    IID\_IBaseFilter,
    (void **)&null\_renderer);

if(FAILED(hr)) {
    printf("(Fatal) Error seeting up Null Renderer.
");
    return hr;
}


Jeg kan derefter bruge funktionen FilterGraph :: AddFilter () til at tilføje alle 3 filtre og bruge en anden grænseflade som CaptureGraphBuilder2 til at gøre strømmen. Men hvad sker der, når jeg vil gøre fra flere kilder samtidigt? Jeg kan tilføje alle kildefiltre til grafen, men hvad med filtre for stikprøve og nulrenderer for at fuldføre grafen for hver video stream? Kan jeg gøre noget som:


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);
}


Ville noget som ovenstående implementeringsarbejde? Hvis ikke, så er der en anden måde at gøre dette på? Enhver hjælp er meget værdsat. Tak!

Bedste reference


Ja, du kan oprette og indsætte i din graf mange forekomster af sample grabber og renderers. Du må bare glemme at oprette dem separat (kald CoCreateInstance for hver enkelt), prøv ikke at indsætte samme instans mange gange.