Anzeigen von World Standard Teletext

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

Hinweis

Diese Funktionalität wurde aus Windows Vista und späteren Betriebssystemen entfernt. Sie ist für die Verwendung in den Betriebssystemen Microsoft Windows 2000, Windows XP und Windows Server 2003 verfügbar.

 

World Standard Teletext (WST) wird im vertikalen Leerungsintervall (VBI) des analogen Fernsehsignals codiert. Das Filterdiagramm für die Vorschau von Teletext ähnelt dem Diagramm, das zum Anzeigen von Untertiteln verwendet wird. Das folgende Diagramm veranschaulicht dieses Diagramm.

WST-Vorschaudiagramm

In diesem Diagramm werden die folgenden Filter für die WST-Anzeige 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.
  • WST-Codec. Decodiert die Teletextdaten aus den VBI-Beispielen.
  • WST-Decoder. Übersetzt Teletextdaten und zeichnet den Text auf Bitmaps. Der downstream-Filter (in diesem Fall der Überlagerungsmixer) überlagert die Bitmaps auf dem Video.

Die RenderStream-Methode des Capture Graph Builder unterstützt die WST-Filter nicht direkt, sodass Ihre Anwendung zusätzliche Arbeit leisten muss.

  1. Fügen Sie dem Filterdiagramm den Filter Overlay Mixer hinzu. Der folgende Code verwendet die AddFilterByCLSID-Funktion, die unter Hinzufügen eines Filters nach CLSID beschrieben wird. (AddFilterByCLSID ist keine DirectShow-API.)

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. Verbinden Sie den Vorschaupin über den Überlagerungsmixer mit dem Video renderer-Filter. Sie können die RenderStream-Methode wie folgt verwenden:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Fügen Sie dem Filterdiagramm den Filter Tee/Sink-to-Sink Converter hinzu. Der folgende Code verwendet die CreateKernelFilter-Funktion, die unter Erstellen von Kernel-Mode Filtern beschrieben wird. (CreateKernelFilter ist keine DirectShow-API.)

    IBaseFilter* pKernelTee = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_SPLITTER, 
        OLESTR("Tee/Sink-to-Sink Converter"), &pKernelTee);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pKernelTee, L"Kernel Tee");
    }
    
  4. Fügen Sie dem Filterdiagramm den WST-Codec-Filter hinzu:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Rufen Sie RenderStream auf, um den VBI-Pin des Aufnahmefilters mit dem Tee/Sink-to-Sink-Konverter und den Tee/Sink-to-Sink-Konverter mit dem WST-Codecfilter zu verbinden:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Rufen Sie RenderStream erneut auf, um den WST-Codecfilter mit dem Überlagerungsmixer zu verbinden. Der WST-Decoderfilter wird automatisch in das Diagramm eingefügt.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Denken Sie daran, alle Filterschnittstellen freizugeben.

    pOvMix->Release();
    pKernelTee->Release();
    pWstCodec->Release();
    

Hinweis

Derzeit unterstützt der WST-Decoderfilter keine Verbindungen mit dem VmR-Filter (Video Mixing Renderer). Daher müssen Sie den älteren Video Renderer-Filter verwenden, um Teletext anzuzeigen.

 

Wenn der Aufnahmefilter über einen VBI-Pin (PIN_CATEGPORY_VIDEOPORT_VBI) für den Videoport verfügt, verbinden Sie ihn mit dem VBI Surface Allocator-Filter . Das Diagramm wird andernfalls nicht ordnungsgemäß ausgeführt. Im folgenden Codebeispiel werden die AddFilterByCLSID-Funktion verwendet, die unter Hinzufügen eines Filters nach CLSID beschrieben wird, und die FindPinByCategory-Funktion, die unter Arbeiten mit Pinkategorien beschrieben wird. (Keine der Funktionen ist eine DirectShow-API.)

// Look for a video port VBI pin on the capture filter.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
    // No video port VBI pin; nothing else to do. OK to run the graph.
}
else
{
    // Found one. Connect it to the VBI Surface Allocator.
    IBaseFilter *pSurf = NULL;
    hr = AddFilterByCLSID(pGraph, CLSID_VBISurfaces, L"VBI Surf", &pSurf);
    if (SUCCEEDED(hr))
    {
        hr = pBuild->RenderStream(NULL, NULL, pVPVBI, 0, pSurf);
        pSurf->Release();
    }
    if (FAILED(hr))
    {
        // Handle the error (not shown). It is probably not safe to 
        // run the graph at this point.
    }
    pVPVBI->Release();
}

Untertitel und Teletext