Dynamische Wiederherstellung der Verbindung
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
In den meisten DirectShow-Filtern können Pins nicht wiederhergestellt werden, während der Graph aktiv Daten streamt. Die Anwendung muss den Graphen beenden, bevor die Pins wiederhergestellt werden. Einige Filter unterstützen jedoch das Erneute Herstellen von Pinverbindungen, während der Graph ausgeführt wird, ein Prozess, der als dynamische Wiederherstellung der Verbindung bezeichnet wird. Dies kann entweder durch die Anwendung oder durch einen Filter im Diagramm erfolgen.
Betrachten Sie als Beispiel das Diagramm in der folgenden Abbildung.
Ein Szenario für die dynamische Wiederherstellung der Verbindung besteht möglicherweise darin, Filter 2 aus dem Diagramm zu entfernen, während der Graph ausgeführt wird, und ihn durch einen anderen Filter zu ersetzen. Damit dieses Szenario funktioniert, muss Folgendes zutreffen:
- Der Eingabestift von Filter 3 (Pin D) muss die IPinConnection-Schnittstelle unterstützen. Mit dieser Schnittstelle kann der Pin wiederhergestellt werden, ohne den Filter zu beenden.
- Der Ausgabepin auf Filter 1 (Pin A) muss den Mediendatenfluss während der Wiederherstellung der Verbindung blockieren können. Während der erneuten Verbindung können keine Daten zwischen Pin A und Pin D übertragen werden. Im Allgemeinen bedeutet dies, dass der Ausgabepin die IPinFlowControl-Schnittstelle unterstützen muss. Wenn Filter 1 jedoch der Filter ist, der die erneute Verbindung initiiert, verfügt er möglicherweise über einen internen Mechanismus zum Blockieren des eigenen Datenflusses.
Die dynamische Wiederherstellung der Verbindung umfasst die folgenden Schritte:
- Blockieren Sie den Datenstrom von Pin A.
- Verbinden Sie Pin A erneut, um D anzuheften, möglicherweise über einen neuen Zwischenfilter.
- Heben Sie die Blockierung von Pin A auf, damit der Datenfluss wieder beginnt.
Schritt 1: Blockieren des Datenstroms
Um den Datenstrom zu blockieren, rufen Sie IPinFlowControl::Block on pin A auf. Diese Methode kann entweder asynchron oder synchron aufgerufen werden. Um die Methode asynchron aufzurufen, erstellen Sie ein Win32-Ereignisobjekt, und übergeben Sie das Ereignishandle an die Block-Methode . Die -Methode wird sofort zurückgegeben. Warten Sie mit einer Funktion wie WaitForSingleObject, bis das Ereignis signalisiert wird. Der Pin signalisiert das Ereignis, wenn es den Datenfluss blockiert hat. Beispiel:
// 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);
}
}
Um die Methode synchron aufzurufen, übergeben Sie einfach den Wert NULL anstelle des Ereignishandles. Jetzt wird die -Methode blockiert, bis der Vorgang abgeschlossen ist. Dies kann erst geschehen, wenn der Pin bereit ist, ein neues Beispiel zu liefern. Wenn der Filter angehalten wird, kann dies eine beliebige Zeit dauern. Führen Sie daher nicht den synchronen Aufruf von Ihrem Standard Anwendungsthread aus. Verwenden Sie einen Workerthread, oder rufen Sie die Methode asynchron auf.
Schritt 2: Erneutes Verbinden der Pins
Um die Pins wiederherzustellen, fragen Sie den Filter Graph Manager nach der IGraphConfig-Schnittstelle ab, und rufen Sie entweder IGraphConfig::Reconnect oder IGraphConfig::Reconfigure auf. Die Reconnect-Methode ist einfacher zu verwenden. Er führt folgende Aktionen aus:
- Beendet die Zwischenfilter (im Beispiel Filter 2) und entfernt sie aus dem Diagramm.
- Fügt bei Bedarf neue Zwischenfilter hinzu.
- Verbindet alle Pins.
- Hält alle neuen Filter an oder führt diese aus, um dem Zustand des Diagramms zu entsprechen.
Die Reconnect-Methode verfügt über mehrere optionale Parameter, die verwendet werden können, um den Medientyp für die Pinverbindung und den zu verwendenden Zwischenfilter anzugeben. Beispiel:
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);
Weitere Informationen finden Sie auf der Referenzseite. Wenn die Reconnect-Methode nicht flexibel genug ist, können Sie die Reconfigure-Methode verwenden, die eine anwendungsdefinierte Rückrufmethode aufruft, um die Pins wiederherzustellen. Um diese Methode zu verwenden, implementieren Sie die IGraphConfigCallback-Schnittstelle in Ihrer Anwendung.
Blockieren Sie vor dem Aufrufen von Reconfigure den Datenfluss über den Ausgabepin, wie zuvor beschrieben. Übertragen Sie dann alle Daten, die noch ausstehen, im Abschnitt des Graphen, den Sie erneut herstellen, wie folgt:
- Rufen Sie IPinConnection::NotifyEndOfStream auf dem Eingabestift auf, der sich am weitesten nach unten in der Verbindungskette befindet (pin D im Beispiel). Übergeben Sie ein Handle an ein Win32-Ereignis.
- Rufen Sie IPin::EndOfStream für den Eingabepin auf, der sich unmittelbar nach dem Ausgabepin befindet, an dem Sie den Datenfluss blockiert haben. (In diesem Beispiel wurde der Datenfluss an Pin A blockiert, sodass Sie EndOfStream an Pin B aufrufen würden.)
- Warten Sie, bis das Ereignis signalisiert wird. Der Eingabepin (Pin D) signalisiert das Ereignis, wenn es die Benachrichtigung zum Ende des Datenstroms empfängt. Dies weist darauf hin, dass keine Daten zwischen den Pins wandern und der Aufrufer die Pins sicher wieder herstellen kann.
Beachten Sie, dass die IGraphConfig::Reconnect-Methode die vorherigen Schritte automatisch verarbeitet. Sie müssen diese Schritte nur ausführen, wenn Sie die Methode "Reconfigure" verwenden.
Nachdem die Daten durch das Diagramm gepusht wurden, rufen Sie Reconfigure auf, und übergeben Sie einen Zeiger an Ihre IGraphConfigCallback-Rückrufschnittstelle . Der Filter Graph-Manager ruft die IGraphConfigCallback::Reconfigure-Methode auf, die Sie bereitgestellt haben.
Schritt 3 Aufheben der Blockierung des Datenfluss
Nachdem Sie die Pins wiederhergestellt haben, heben Sie die Blockierung des Datenflusses auf, indem Sie IPinFlowControl::Block mit dem Wert 0 (null) für den ersten Parameter aufrufen.
Hinweis
Wenn eine dynamische Wiederherstellung der Verbindung durch einen Filter durchgeführt wird, gibt es einige Threadingprobleme, die Sie beachten müssen. Wenn der Filtergraph-Manager versucht, den Filter zu beenden, kann er zu einem Deadlock führen, da der Graph darauf wartet, dass der Filter beendet wird, während der Filter möglicherweise darauf wartet, dass Daten durch das Diagramm gepusht werden. Um den möglichen Deadlock zu verhindern, verwenden einige der in diesem Abschnitt beschriebenen Methoden ein Handle für ein Win32-Ereignis. Der Filter sollte das Ereignis signalisieren, wenn der Filtergraph-Manager versucht, den Filter zu beenden. Weitere Informationen finden Sie unter IGraphConfig und IPinConnection.
Zugehörige Themen