Dynamische herverbinding
[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
In de meeste DirectShow-filters kunnen pinnen niet opnieuw worden verbonden terwijl de grafiek actief gegevens streamt. De toepassing moet de grafiek stoppen voordat de pinnen opnieuw worden verbonden. Sommige filters bieden echter wel ondersteuning voor het opnieuw verbinden van pincodes terwijl de grafiek wordt uitgevoerd, een proces dat dynamisch opnieuw verbinding wordt genoemd. Dit kan worden gedaan door de toepassing of door een filter in de grafiek.
Bekijk bijvoorbeeld de grafiek in de volgende afbeelding.
Een scenario voor dynamische herverbinding kan zijn om Filter 2 uit de grafiek te verwijderen, terwijl de grafiek wordt uitgevoerd en vervangen door een ander filter. Voordat dit scenario werkt, moet het volgende waar zijn:
- De invoerpin op Filter 3 (pin D) moet de IPinConnection interface ondersteunen. Met deze interface kan de pin opnieuw worden verbonden zonder het filter te stoppen.
- De uitvoerpin op Filter 1 (pin A) moet de stroom van mediagegevens kunnen blokkeren terwijl de verbinding opnieuw tot stand is gebracht. Er kunnen geen gegevens tussen pin A en pin D worden verplaatst tijdens het opnieuw verbinden. Over het algemeen betekent dit dat de uitvoerpin de IPinFlowControl-interface moet ondersteunen. Als Filter 1 echter het filter is waarmee de herverbinding wordt gestart, kan het een intern mechanisme hebben om een eigen gegevensstroom te blokkeren.
De dynamische herverbinding omvat de volgende stappen:
- Blokkeer de gegevensstroom van pin A.
- Maak opnieuw verbinding met pin A om D vast te maken, mogelijk via een nieuw tussenliggend filter.
- Deblokkeren pin A zodat de gegevens weer stromen.
Stap 1. De gegevensstroom blokkeren
Als u de gegevensstroom wilt blokkeren, roept u IPinFlowControl:: op pin A blokkeren. Deze methode kan asynchroon of synchroon worden aangeroepen. Als u de methode asynchroonwilt aanroepen, maakt u een Win32-gebeurtenisobject en geeft u de gebeurtenisgreep door aan de methode Block. De methode wordt onmiddellijk geretourneerd. Wacht tot de gebeurtenis wordt gesignaleerd met behulp van een functie zoals WaitForSingleObject. De pin geeft de gebeurtenis aan wanneer deze de gegevensstroom heeft geblokkeerd. Bijvoorbeeld:
// Create an event
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent != NULL)
{
// Block the data flow.
hr = pFlowControl->Block(AM_PIN_FLOW_CONTROL_BLOCK, hEvent);
if (SUCCEEDED(hr))
{
// Wait for the pin to finish.
DWORD dwRes = WaitForSingleObject(hEvent, dwMilliseconds);
}
}
Als u de methode wilt aanroepen synchroon, geeft u de waarde door NULL- in plaats van de gebeurtenis-handle. De methode wordt nu geblokkeerd totdat de bewerking is voltooid. Dit kan pas gebeuren als de pin gereed is om een nieuw voorbeeld te leveren. Als het filter is onderbroken, kan dit een willekeurige tijd duren. Maak daarom niet de synchrone aanroep vanuit uw hoofdtoepassingsthread. Gebruik een werkrolthread of roep de methode asynchroon aan.
Stap 2. De pinnen opnieuw verbinden
Als u de pinnen opnieuw wilt verbinden, voert u een query uit op Filter Graph Manager voor de IGraphConfig interface en roept u IGraphConfig::Reconnect of IGraphConfig::Reconfigureaan. De methode Opnieuw verbinden is eenvoudiger te gebruiken; dit doet het volgende:
- Hiermee stopt u de tussenliggende filters (filter 2 in het voorbeeld) en verwijdert u ze uit de grafiek.
- Voegt indien nodig nieuwe tussenliggende filters toe.
- Verbindt alle pinnen.
- Onderbreekt of voert nieuwe filters uit, zodat deze overeenkomen met de status van de grafiek.
De methode Opnieuw verbinden bevat verschillende optionele parameters die kunnen worden gebruikt om het mediatype voor de pinverbinding en het tussenliggende filter op te geven dat moet worden gebruikt. Bijvoorbeeld:
pGraph->AddFilter(pNewFilter, L"New Filter for the Graph");
pConfig->Reconnect(
pPinA, // Reconnect this output pin...
pPinD, // ... to this input pin.
pMediaType, // Use this media type.
pNewFilter, // Connect them through this filter.
NULL,
0);
Raadpleeg de referentiepagina voor meer informatie. Als de methode Opnieuw verbinden niet flexibel genoeg is, kunt u de methode opnieuw configureren, waarmee een door de toepassing gedefinieerde callbackmethode wordt aangeroepen om de pinnen opnieuw te verbinden. Als u deze methode wilt gebruiken, implementeert u de IGraphConfigCallback--interface in uw toepassing.
Voordat u opnieuw configureert, blokkeert u de gegevensstroom van de uitvoerpin, zoals eerder beschreven. Push vervolgens gegevens die nog in behandeling zijn in de sectie van de grafiek die u opnieuw verbindt, als volgt:
- Roep IPinConnection::NotifyEndOfStream aan op de invoerpin die het meest downstream is in de keten voor opnieuw verbinden (pin D in het voorbeeld). Geef een ingang door aan een Win32-gebeurtenis.
- Roep IPin::EndOfStream aan op de invoerpin die direct downstream is vanaf de uitvoerpin waar u de gegevensstroom hebt geblokkeerd. (In dit voorbeeld is de gegevensstroom geblokkeerd bij pin A, zodat u EndOfStream- op pin B aanroept.)
- Wacht totdat de gebeurtenis wordt gesignaleerd. De invoerpin (pin D) geeft de gebeurtenis aan wanneer deze de melding aan het einde van de stroom ontvangt. Dit geeft aan dat er geen gegevens tussen de spelden reizen en dat de beller de pinnen veilig opnieuw kan verbinden.
Houd er rekening mee dat de methode IGraphConfig::Opnieuw verbinden de vorige stappen automatisch verwerkt. U hoeft deze stappen alleen uit te voeren als u de methode opnieuw configureert.
Nadat de gegevens door de grafiek zijn gepusht, roept u opnieuw configureren aan en geeft u een aanwijzer door aan uw IGraphConfigCallback callback-interface. In Filter Graph Manager wordt de IGraphConfigCallback::Reconfigure methode aangeroepen die u hebt opgegeven.
Stap 3. De blokkering van de gegevensstroom opheffen
Nadat u de pinnen opnieuw hebt verbonden, deblokkert u de gegevensstroom door IPinFlowControl::Blokkeren met een waarde van nul voor de eerste parameter.
Notitie
Als een dynamische herverbinding wordt uitgevoerd door een filter, zijn er enkele threadingproblemen waar u rekening mee moet houden. Als filtergrafiekbeheer het filter probeert te stoppen, kan het een impasse zijn, omdat de grafiek wacht tot het filter is gestopt, terwijl tegelijkertijd kan worden gewacht tot de gegevens door de grafiek worden gepusht. Om de mogelijke impasse te voorkomen, nemen sommige methoden die in deze sectie worden beschreven, een ingang naar een Win32-gebeurtenis. Het filter moet de gebeurtenis aangeven als filtergrafiekbeheer het filter probeert te stoppen. Zie IGraphConfig en IPinConnectionvoor meer informatie.
Verwante onderwerpen