Kombinieren von Videoaufnahme und Vorschau

[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 vorherigen Abschnitten wird beschrieben, wie Sie Videos in verschiedenen Dateiformaten erfassen. Im Abschnitt Vorschauvideo wird beschrieben, wie Sie ein Livevorschaudiagramm erstellen. Viele Anwendungen müssen jedoch beides gleichzeitig ausführen. Um ein kombiniertes Vorschau- und Dateischreibdiagramm zu erstellen, führen Sie einfach zwei Aufrufe von ICaptureGraphBuilder2::RenderStream aus:

// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 
    NULL, NULL);

// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 
    NULL, pMux);

In diesem Code verbirgt der Capture Graph Builder einige Details:

  • Wenn der Aufnahmefilter über einen Vorschau- oder Videoport-Pin sowie einen Aufnahmenadel verfügt, rendert die RenderStream-Methode einfach beide Pins, wie in der folgenden Abbildung gezeigt.

    Aufzeichnungs- und Vorschaudiagramm

  • Wenn der Filter nur über einen Aufnahmenadel verfügt, verwendet der Capture Graph Builder den Smart Tee-Filter , um den Aufzeichnungsdatenstrom aufzuteilen. Die folgende Abbildung zeigt das Diagramm mit einem Smart Tee.

    Erfassungs- und Vorschaudiagramm mit Smart Tee-Filter

Der Smart Tee-Filter verfügt über einen Aufnahmenadel und einen Vorschau-Pin. Es nimmt einen einzelnen Videostream aus dem Aufnahmefilter auf und teilt ihn in zwei Streams auf, einen für die Aufnahme und einen für die Vorschau. Um den Durchsatz für den Aufnahmepin zu erhalten, löscht der Vorschaustift frames nach Bedarf. Es entfernt auch die Zeitstempel aus jedem Beispiel, bevor es bereitgestellt wird, aus den Gründen, die im Thema DirectShow-Videoaufnahmefilter erläutert werden.

Obwohl der Smart Tee den Stream teilt, werden die Videodaten nicht physisch dupliziert. Stattdessen werden benutzerdefinierte Medienbeispielobjekte verwendet, die die Puffer gemeinsam nutzen. Die Beispiele sind als "schreibgeschützt" gekennzeichnet, um sicherzustellen, dass nachgeschaltete Filter nicht auf die Daten schreiben.

Wenn Ihr Erfassungsdiagramm über ein Vorschaufenster verfügt, können verschiedene Faktoren dazu führen, dass der Filter graph-Manager den gesamten Graphen beendet, einschließlich des Erfassungsdatenstroms:

  • Sperren des Computers.
  • Drücken Sie STRG+ALT+ENTF auf einem Computer, der Mitglied einer Domäne ist.
  • Ausführen einer Direct3D-Vollbildanwendung, z. B. eines Spiels oder bildschirmschoner.
  • Wechseln von Monitoren oder Ändern der Anzeigeauflösung.
  • Ausführen eines Programms, das dazu führt, dass Windows ein Dialogfeld für die Benutzerkontensteuerung (User Account Control, UAC) anzeigt. (Windows Vista oder höher.)
  • Ausführen eines Vollbild-DOS-Fensters.

Jedes dieser Ereignisse kann die Aufzeichnungssitzung unterbrechen, was möglicherweise zu Datenverlusten führt. (Dies geschieht intern: Der Videorenderer verliert die benötigten Direct3D- oder DirectDraw-Ressourcen. Bei der Wiederherstellung dieser Ressourcen muss der Videorenderer erneut eine Verbindung mit dem Upstream-Filter herstellen, wodurch der Filter graph-Manager den Graphen beendet.)

Zwei mögliche Lösungen für dieses Problem sind die folgenden:

Aufzeichnen von Videos in einer Datei