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:
- Tiltsa le az adatfolyamot az A rögzítésből.
- Csatlakoztassa újra az A tűt a D rögzítéséhez, esetleg egy új köztes szűrőn keresztül.
- 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:
- 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.
- 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.)
- 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.
Kapcsolódó témakörök