Anzeigen von Untertiteln

[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.]

Um Untertitel im analogen Fernsehen zu unterstützen, macht der Aufnahmefilter einen Pin verfügbar, der entweder VBI- oder geschlossene Untertitel-Daten übermittelt. Der Pin weist eine der folgenden Pinkategorien auf:

  • VBI-Pin (PIN_CATEGORY_VBI). Stellt einen Stream von VBI-Wellenformbeispielen bereit. Diese werden an einen Decoderfilter übergeben, der die Untertiteldaten extrahiert.
  • CC-Pin (PIN_CATEGORY_CC). Liefert closed-Untertitel Bytepaare, die aus den Line-21-Daten extrahiert werden.
  • Hardwareslicing CC Pin (PINNAME_VIDEO_CC_CAPTURE).

Um Untertitel in der Vorschau anzuzeigen, rufen Sie ICaptureGraphBuilder2::RenderStream mit der VBI-Pinkategorie auf, und wenn dies fehlschlägt, rufen Sie es erneut mit der Cc-Kategorie auf.

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, 0);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, 0);
}

Das folgende Diagramm zeigt ein typisches Filterdiagramm zum Anzeigen von Untertiteln.

Vorschaudiagramm für Untertitel

In diesem Diagramm werden die folgenden Filter für die Anzeige geschlossener Untertitel verwendet:

  • Tee/Sink-to-Sink-Konverter. Akzeptiert die VBI-Informationen aus dem Erfassungsfilter und teilt sie für jeden datendienst im Signal vorhandenen Datendienst in separate Datenströme auf. Microsoft stellt VBI-Codecs für Untertitel, NABTS und World Standard Teletext (WST) bereit.
  • CC-Decoder. Decodiert CC-Daten aus den erfassten VBI-Wellenformen, die vom Erfassungsfilter bereitgestellt werden.
  • Line 21 Decoder. Übersetzt die CC-Bytepaare und zeichnet die Untertitel Text auf Bitmaps. Der downstream-Filter (in diesem Fall der Überlagerungsmixer) überlagert die Bitmaps auf dem Video.

Die RenderStream-Methode des Capture Graph Builder fügt diese Filter automatisch hinzu. Wenn der Erfassungsfilter einen CC-Pin anstelle eines VBI-Pins aufweist, wird der CC-Pin direkt mit dem Filter Line 21 Decoder verbunden.

Hinweis

Wenn Sie den Filter Video Mixing Renderer (VMR) zum Rendern verwenden, verwenden Sie den Line 21 Decoder Filter 2. Dieser Filter verfügt über die gleiche Funktionalität wie der Line 21-Decoder, aber die CLSID ist CLSID_Line21Decoder2.

 

Hinweis

Der CC-Decoderfilter wurde in Windows Vista entfernt. Neue Anwendungen sollten den Filter VBICodec verwenden, der in der Dokumentation zu Microsoft TV Technologies dokumentiert ist.

 

Wenn das Aufnahmegerät einen Videoport verwendet, verfügt der Aufnahmefilter möglicherweise über einen VBI-Pin (PIN_CATEGORY_VIDEOPORT_VBI). Dieser Pin muss mit dem VBI Surface Allocator-Filter verbunden sein, der Oberflächen zum Aufnehmen der erfassten VBI-Daten zuordnet. Die RenderStream-Methode fügt diesen Filter hinzu, wenn er erforderlich ist. Das folgende Diagramm zeigt ein Filterdiagramm mit dem VBI Surface Allocator.

Vorschaudiagramm mit Untertiteln mit vbi surface allocator

Aktivieren und Deaktivieren der Beschriftungen

Verwenden Sie zum Steuern der Beschriftungsanzeige die IAMLine21Decoder-Schnittstelle im Filter Line 21 Decoder. Beispielsweise können Sie die Beschriftungsanzeige mit der IAMLine21Decoder::SetServiceState-Methode wie folgt deaktivieren:

// Use the FindInterface method to find the interface.
IAMLine21Decoder *pLine21 = NULL;
hr = pBuild->FindInterface(
    &LOOK_DOWNSTREAM_ONLY, // Look downstream from pCap 
    NULL,                  // No particular media type
    pCap,                  // Pointer to the capture filter.
    IID_IAMLine21Decoder, (void**)&pLine21);
if (SUCCEEDED(hr))
{
    pLine21->SetServiceState(AM_L21_CCSTATE_Off);
    // (Use AM_L21_CCSTATE_On to enable.)
    pLine21->Release();
}

In diesem Beispiel wird die ICaptureGraphBuilder2::FindInterface-Methode verwendet, um die IAMLine21Decoder-Schnittstelle zu suchen. Der erste Parameter für FindInterface ist &LOOK_DOWNSTREAM_ONLY, der angibt, dass nach dem Erfassungsfilter (pCap) gesucht werden soll.

Erfassen von Bitmaps mit Untertiteln

Sie können die Untertitel Bitmaps in einer Datei erfassen. Fügen Sie hierzu den Abschnitt zum Schreiben von Dateien des Filterdiagramms hinzu, wie unter Aufzeichnen von Videos in einer Datei beschrieben. Rendern Sie dann den CC- oder VBI-Pin im Mux-Filter:

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, pMux);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, pMux);
}

Wenn Sie auch das Video aufzeichnen, wird eine Datei mit zwei separaten Videostreams erstellt. Es wird kein Video mit Untertiteln aufgenommen, die über dem Bild überlagert sind.

Untertitel und Teletext