Freigeben über


Dynamische Erneute Verbindung

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

In den meisten DirectShow-Filtern können Pins nicht erneut verbunden werden, während das Diagramm aktiv Daten streamt. Die Anwendung muss das Diagramm beenden, bevor die Pins erneut verbunden werden. Einige Filter unterstützen jedoch pin-erneute Verbindungen, während das Diagramm ausgeführt wird, ein Prozess, der als dynamische Erneute Verbindung bezeichnet wird. Dies kann entweder durch die Anwendung oder durch einen Filter im Diagramm erfolgen.

Betrachten Sie beispielsweise das Diagramm in der folgenden Abbildung.

dynamische Diagramm-Gebäudediagramm

Ein Szenario für die dynamische Erneute Verbindung kann das Entfernen von Filter 2 aus dem Diagramm sein, während das Diagramm ausgeführt wird, und es durch einen anderen Filter ersetzen. Damit dieses Szenario funktioniert, muss Folgendes zutrifft:

  • Der Eingabenadel auf Filter 3 (Pin D) muss die IPinConnection- Schnittstelle unterstützen. Mit dieser Schnittstelle kann der Pin erneut verbunden werden, ohne den Filter zu beenden.
  • Der Ausgabehefter für Filter 1 (Pin A) muss in der Lage sein, den Fluss von Mediendaten zu blockieren, während die erneute Verbindung auftritt. Während der erneuten Verbindung können keine Daten zwischen Pin A und Pin D reisen. 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, hat er möglicherweise einen internen Mechanismus, um seinen eigenen Datenfluss zu blockieren.

Die dynamische Erneute Verbindung umfasst die folgenden Schritte:

  1. Blockieren des Datenstroms vom Anheften A.
  2. Verbinden Sie A erneut an pin D, möglicherweise über einen neuen Zwischenfilter.
  3. Heben Sie die Blockierung von A auf, damit daten wieder fließen.

Schritt 1. Datenstrom blockieren

Rufen Sie zum Blockieren des Datenstroms IPinFlowControl::Block an pin A auf. Diese Methode kann entweder asynchron oder synchron aufgerufen werden. Um die Methode asynchronaufzurufen, erstellen Sie ein Win32-Ereignisobjekt, und übergeben Sie das Ereignishandle an die methode Block. Die Methode wird sofort zurückgegeben. Warten Sie, bis das Ereignis signalisiert wird, indem Sie eine Funktion wie WaitForSingleObjectverwenden. Der Pin signalisiert das Ereignis, wenn er den Datenfluss blockiert hat. Zum 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 synchronaufzurufen, ü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 Zeitspanne dauern. Führen Sie daher nicht den synchronen Aufruf aus Dem Hauptanwendungsthread aus. Verwenden Sie einen Workerthread, oder rufen Sie die Methode asynchron auf.

Schritt 2. Erneutes Verbinden der Pins

Um die Pins erneut zu verbinden, fragen Sie den Filter Graph-Manager für die IGraphConfig--Schnittstelle ab, und rufen Sie entweder IGraphConfig::Reconnect oder IGraphConfig::Reconfigureauf. Die Reconnect Methode ist einfacher zu verwenden; Dies geschieht wie folgt:

  • Beendet die Zwischenfilter (Filter 2 im Beispiel) 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 sie 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. Zum 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);     

Ausführliche Informationen finden Sie auf der Referenzseite. Wenn die Reconnect-Methode nicht flexibel genug ist, können Sie die methode Reconfigure verwenden, die eine anwendungsdefinierte Rückrufmethode aufruft, um die Pins erneut zu verbinden. Um diese Methode zu verwenden, implementieren Sie die IGraphConfigCallback- Schnittstelle in Ihrer Anwendung.

Bevor Sie neu konfigurieren, blockieren Sie den Datenfluss von der Ausgabenadel, wie zuvor beschrieben. Pushen Sie dann alle Daten, die noch im Abschnitt des Diagramms ausstehen, das Sie erneut verbinden, wie folgt:

  1. Rufen Sie IPinConnection::NotifyEndOfStream auf dem Eingabe-Pin nacheinander nach unten in der Verbindungskette auf (pin D im Beispiel). Übergeben Sie ein Handle an ein Win32-Ereignis.
  2. Rufen Sie IPin::EndOfStream auf der Eingabenadel auf, die unmittelbar von der Ausgabenadel nachgeschaltet wird, an der Sie den Datenfluss blockiert haben. (In diesem Beispiel wurde der Datenfluss an pin A blockiert, sodass Sie EndOfStream- an Pin B aufrufen würden.)
  3. Warten Sie, bis das Ereignis signalisiert wird. Der Eingabenadel (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 reisen und dass der Anrufer die Pins sicher wieder verbinden kann.

Beachten Sie, dass die IGraphConfig::Reconnect-Methode die vorherigen Schritte automatisch verarbeitet. Sie müssen diese Schritte nur ausführen, wenn Sie die Reconfigure-Methode verwenden.

Nachdem die Daten über das Diagramm übertragen wurden, rufen Sie neu konfigurieren 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 Datenflusses

Nachdem Sie die Pins erneut verbunden haben, heben Sie die Blockierung des Datenflusses auf, indem Sie IPinFlowControl::Block mit dem Wert Null für den ersten Parameter aufrufen.

Anmerkung

Wenn eine dynamische Erneute Verbindung von einem Filter ausgeführt wird, gibt es einige Threadingprobleme, die Sie beachten müssen. Wenn der Filterdiagramm-Manager versucht, den Filter zu beenden, kann er inaktiviert werden, da das Diagramm wartet, bis der Filter beendet wird, während gleichzeitig der Filter darauf wartet, dass Daten durch das Diagramm verschoben werden. Um das mögliche Deadlock zu verhindern, nehmen einige der in diesem Abschnitt beschriebenen Methoden ein Handle zu einem Win32-Ereignis. Der Filter sollte das Ereignis signalisieren, wenn der Filter Graph-Manager versucht, den Filter zu beenden. Weitere Informationen finden Sie unter IGraphConfig und IPinConnection.

 

Dynamic Graph Building