Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, MMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
Ve většině filtrů DirectShow není možné připnutí znovu připojit, zatímco graf aktivně streamuje data. Aplikace musí graf před opětovnou připojením špendlíků zastavit. Některé filtry ale podporují opětovné připojení připnutí, zatímco je graf spuštěný, proces označovaný jako dynamické opětovné připojení. Můžete to provést buď aplikací, nebo filtrem v grafu.
Jako příklad si představte graf na následujícím obrázku.
diagramu vytváření grafů
Jedním ze scénářů dynamického opětovného připojení může být odebrání filtru 2 z grafu, zatímco graf běží, a nahradit ho jiným filtrem. Aby tento scénář fungoval, musí být splněné následující podmínky:
- Vstupní špendlík na filtru 3 (pin D) musí podporovat IPinConnection rozhraní. Toto rozhraní umožňuje opětovné připojení špendlíku bez zastavení filtru.
- Výstupní špendlík na filtru 1 (připnutí A) musí být schopen zablokovat tok mediálních dat, když dojde k opětovnému připojení. Během opětovného připojení se mezi připnutím A a připnutím D nedají cestovat žádná data. Obecně to znamená, že výstupní kolík musí podporovat IPinFlowControl rozhraní. Pokud je však filtr 1 filtrem, který zahájí opětovné připojení, může mít nějaký interní mechanismus, který blokuje vlastní tok dat.
Dynamické opětovné připojení bude zahrnovat následující kroky:
- Zablokujte datový proud z připnutí A.
- Znovu připojte špendlík A pro připnutí D, případně prostřednictvím nového přechodného filtru.
- Odblokujte připnutí A, aby se data znovu spouštěla.
Krok 1. Blokování datového streamu
Pokud chcete datový proud blokovat, zavolejte IPinFlowControl::Block připnutí A. Tuto metodu lze volat asynchronně nebo synchronně. Chcete-li volat metodu asynchronně, vytvořte objekt události Win32 a předejte popisovač události Block metoda. Metoda se okamžitě vrátí. Pomocí funkce, jako je například WaitForSingleObject, počkejte, než bude událost signalována. Připnutí signalizuje událost, když zablokovala tok dat. Například:
// 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);
}
}
Chcete-li volat metodu synchronně, jednoduše předejte hodnotu NULL místo popisovače událostí. Teď bude metoda blokovat, dokud se operace dokončí. K tomu nemusí dojít, dokud není špendlík připravený k doručení nové ukázky. Pokud je filtr pozastavený, může to trvat libovolnou dobu. Proto nevolejte synchronní volání z hlavního vlákna aplikace. Použijte pracovní vlákno nebo jinak metodu volejte asynchronně.
Krok 2. Opětovné připojení špendlíků
Pokud chcete pin kódy znovu připojit, zadejte dotaz na Správce grafů filtru pro rozhraní IGraphConfig a volejte IGraphConfig::Reconnect nebo IGraphConfig::Reconfigure. Metoda Reconnect je jednodušší použít; provede následující:
- Zastaví zprostředkující filtry (v příkladu filtr 2) a odebere je z grafu.
- V případě potřeby přidá nové zprostředkující filtry.
- Připojí všechny špendlíky.
- Pozastaví nebo spustí všechny nové filtry, aby odpovídaly stavu grafu.
Metoda Reconnect má několik volitelných parametrů, které lze použít k určení typu média pro připojení připnutí a mezilehlých filtrů, které se mají použít. Například:
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);
Podrobnosti najdete na referenční stránce. Pokud metoda Znovu připojit není dostatečně flexibilní, můžete použít metodu Reconfigure, která volá metodu zpětného volání definovanou aplikací k opětovnému připojení špendlíků. Chcete-li použít tuto metodu, implementujte IGraphConfigCallback rozhraní ve vaší aplikaci.
Před voláním Překonfigurovatzablokujte tok dat z připínáčku výstupu, jak je popsáno výše. Pak nasdílejte všechna data, která ještě čekají v části grafu, kterou znovu připojujete, následujícím způsobem:
- Volání IPinConnection::NotifyEndOfStream na vstupním špendlíku nejblíže podřízené v řetězci opětovného připojení (v příkladu je pin D). Předejte popisovač události Win32.
- Volání IPin::EndOfStream na vstupním kolíku, který je okamžitě podřízený z výstupního kolíku, kde jste zablokovali tok dat. (V tomto příkladu se tok dat zablokoval při připnutí A, takže byste volali EndOfStream připnutí B.)
- Počkejte, než se událost signalizují. Vstupní pin (pin D) signalizuje událost, když obdrží oznámení o ukončení streamu. To znamená, že mezi kolíky nepřechází žádná data a že volající může piny bezpečně znovu připojit.
Všimněte si, že metoda IGraphConfig::Reconnect automaticky zpracovává předchozí kroky. Tyto kroky je potřeba provést pouze v případě, že používáte metodu Reconfigure.
Po nasdílení dat přes graf zavolejte Překonfigurovat a předejte ukazatel na IGraphConfigCallback rozhraní zpětného volání. Správce grafů filtru zavolá metodu IGraphConfigCallback::Reconfigure, kterou jste zadali.
Krok 3. Odblokování toku dat
Po opětovném připojení špendlíků odblokujte tok dat voláním IPinFlowControl::Block s hodnotou nuly pro první parametr.
Poznámka
Pokud filtr provádí dynamické opětovné připojení, je potřeba vědět o některých problémech s vlákny. Pokud se Správce grafů filtru pokusí filtr zastavit, může dojít k zablokování, protože graf čeká na zastavení filtru, zatímco filtr může čekat na vložení dat přes graf. Aby se zabránilo možnému vzájemnému zablokování, některé metody popsané v této části přebírají popisovač události Win32. Filtr by měl signalizovat událost, pokud se Správce grafů filtru pokusí filtr zastavit. Další informace najdete v tématu IGraphConfig a IPinConnection.
Související témata