Megosztás a következőn keresztül:


Dinamikus újracsatlakozás

[A laphoz társított funkció, DirectShowegy régi funkció. MediaPlayer, IMFMediaEngineés Audio/Video Capture a Media Foundation. Ezek a funkciók Windows 10-hez és Windows 11-hez lettek optimalizálva. A Microsoft határozottan javasolja, hogy az új kód MediaPlayer, IMFMediaEngine és Audio/Video Capture eszközt használja a Media FoundationDirectShowhelyett, ha lehetséges. A Microsoft javasolja, hogy az örökölt API-kat használó meglévő kódot át kell írni az új API-k használatára, ha lehetséges.]

A legtöbb DirectShow-szűrőben a tűk nem csatlakoztathatók újra, amíg a gráf aktívan streameli az adatokat. Az alkalmazásnak le kell állítania a gráfot a tűk újbóli csatlakoztatása előtt. Egyes szűrők azonban támogatják a gráf futása közben történő újracsatlakozást, amely egy dinamikus újracsatlakozásnak nevezett folyamat. Ezt az alkalmazás vagy a gráf szűrője hajthatja végre.

Példaként tekintse meg a gráfot az alábbi ábrán.

dinamikus gráfépítési diagram

A dinamikus újracsatlakozás egyik forgatókönyve lehet, hogy eltávolítja a 2. szűrőt a gráfból, miközben a gráf fut, és lecseréli egy másik szűrőre. Ahhoz, hogy ez a forgatókönyv működjön, a következőnek kell teljesülnie:

  • A 3. szűrő (D tű) bemeneti tűjének támogatnia kell az IPinConnection felületet. Ez az interfész lehetővé teszi, hogy a tű újracsatlakozjon a szűrő leállítása nélkül.
  • Az 1. szűrő kimeneti pin-kódjának (A tűnek) képesnek kell lennie blokkolni a médiaadatok áramlását az újracsatlakozás során. Az újracsatlakozás során nincs adat az A és a D rögzítés között. Ez általában azt jelenti, hogy a kimeneti pin-kódnak támogatnia kell az IPinFlowControl interfészt. Ha azonban az 1. szűrő az újracsatlakozást kezdeményező szűrő, előfordulhat, hogy belső mechanizmusa blokkolja a saját adatfolyamát.

A dinamikus újracsatlakozás a következő lépéseket foglalja magában:

  1. Tiltsa le az adatfolyamot az A rögzítésből.
  2. Csatlakoztassa újra az A tűt a D rögzítéséhez, esetleg egy új köztes szűrőn keresztül.
  3. Oldja fel az A rögzítés letiltását, hogy az adatok újra folyjanak.

1. lépés. Az adatfolyam letiltása

Az adatfolyam letiltásához hívja meg az IPinFlowControl::Tiltsa le az A tűn. Ez a metódus aszinkron vagy szinkron módon hívható meg. A metódus aszinkron meghívásához hozzon létre egy Win32-eseményobjektumot, és adja át az eseményfogópontot a Blokk metódusnak. A metódus azonnal visszatér. Várjon, amíg az esemény jelzése meg nem történik egy olyan függvénnyel, mint a WaitForSingleObject. A pin-kód jelzi az eseményt, ha az blokkolta az adatfolyamot. Például:

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

A metódus szinkron meghívásához egyszerűen adja át a null értéket az eseménykezelő helyett. Most a metódus blokkolva lesz, amíg a művelet befejeződik. Ez csak akkor fordulhat elő, ha a tű készen áll egy új minta átadására. Ha a szűrő szüneteltetve van, ez tetszőleges ideig tarthat. Ezért ne kezdeményezz szinkron hívást a fő alkalmazásszálból. Használjon feldolgozószálat, vagy más néven aszinkron módon hívja meg a metódust.

2. lépés. A tűk újracsatlakoztatása

A tűk újracsatlakoztatásához kérdezze le a Filter Graph Managert az IGraphConfig felülethez, és hívja meg az IGraphConfig::Reconnect vagy IGraphConfig::Reconfigure. A Újracsatlakozás metódus használata egyszerűbb; a következőket teszi:

  • Leállítja a köztes szűrőket (a példában a 2. szűrőt), és eltávolítja őket a gráfból.
  • Szükség esetén új köztes szűrőket ad hozzá.
  • Csatlakoztatja az összes tűt.
  • Szünetelteti vagy futtatja az új szűrőket a gráf állapotának megfelelően.

A Újracsatlakozás metódus több választható paramétert is használ, amelyekkel megadhatja a pin-kód kapcsolat adathordozótípusát és a használandó köztes szűrőt. Például:

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

A részletekért tekintse meg a referenciaoldalt. Ha a Újracsatlakozás metódus nem elég rugalmas, használhatja a Újrakonfigurálás metódust, amely egy alkalmazás által definiált visszahívási metódust hív meg a tűk újracsatlakoztatásához. A módszer használatához implementálja az IGraphConfigCallback felületet az alkalmazásban.

Mielőtt meghívja újrakonfigurálja, tiltsa le az adatfolyamot a kimeneti pin-kódból a korábban leírtak szerint. Ezután küldjön le minden olyan adatot, amely még függőben van az újrakapcsolódó gráf szakaszában, az alábbiak szerint:

  1. Hívja meg IPinConnection::NotifyEndOfStream az újracsatlakozási lánc legtávolabbi bemeneti tűjén (a példában D tű). Adjon át egy fogópontot egy Win32-eseménynek.
  2. Hívja meg IPin::EndOfStream a bemeneti pinen, amely közvetlenül a kimeneti pin-hez tartozik, ahol letiltotta az adatfolyamot. (Ebben a példában az adatfolyam le lett tiltva az A pin-kódnál, ezért EndOfStream hívhatja meg a B pin-kódon.)
  3. Várja meg az esemény jelzését. A bemeneti pin (pin D) jelzi az eseményt, amikor megkapja a stream végét jelző értesítést. Ez azt jelzi, hogy nincs adat a csapok között, és hogy a hívó biztonságosan újracsatlakoztathatja a csapokat.

Vegye figyelembe, hogy az IGraphConfig::Reconnect metódus automatikusan kezeli az előző lépéseket. Ezeket a lépéseket csak akkor kell végrehajtania, ha a Újrakonfigurálás metódust használja.

Miután leküldte az adatokat a gráfon, hívja meg Újrakonfigurálja, és mutasson a IGraphConfigCallback visszahívási felületére. A Filter Graph Manager meghívja a IGraphConfigCallback::Reconfigure metódust, amelyet megadott.

3. lépés. Az adatfolyam blokkolásának feloldása

Miután újra csatlakoztatta a tűket, oldja fel az adatfolyam blokkolását az IPinFlowControl::Block meghívásával, amelynek értéke nulla az első paraméterhez.

Jegyzet

Ha egy szűrő dinamikus újracsatlakozást hajt végre, néhány szálkezeléssel kapcsolatos problémát figyelembe kell vennie. Ha a Szűrődiagram-kezelő megpróbálja leállítani a szűrőt, az holtpontra kerülhet, mert a gráf megvárja, amíg a szűrő leáll, ugyanakkor a szűrő is arra vár, hogy az adatok a gráfon keresztül legyenek leküldve. A lehetséges holtpont elkerülése érdekében az ebben a szakaszban ismertetett módszerek némelyike egy Win32-es eseményhez használ egy leírót. A szűrőnek jeleznie kell az eseményt, ha a Filter Graph Manager megpróbálja leállítani a szűrőt. További információ: IGraphConfig és IPinConnection.

 

Dynamic Graph Building