Visualizzazione del teletext standard mondiale

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Nota

Questa funzionalità è stata rimossa da Windows Vista e dai sistemi operativi successivi. È disponibile per l'uso nei sistemi operativi Microsoft Windows 2000, Windows XP e Windows Server 2003.

 

World Standard Teletext (WST) è codificato nell'intervallo di vuoto verticale (VBI) del segnale televisivo analogico. Il grafico del filtro per l'anteprima del teletext è simile al grafico usato per visualizzare le didascalie chiuse. Il diagramma seguente illustra questo grafico.

grafico di anteprima wst

Questo grafico usa i filtri seguenti per la visualizzazione WST:

  • Tee/Sink-to-Sink Converter. Accetta le informazioni VBI dal filtro di acquisizione e la suddivide in flussi separati per ognuno dei servizi dati presenti sul segnale.
  • Codec WST. Decodifica i dati di teletext dagli esempi VBI.
  • Decodificatore WST. Converte i dati di teletext e disegna il testo nelle bitmap. Il filtro downstream (in questo caso overlay mixer) sovrappone le bitmap nel video.

Il metodo RenderStream di Capture Graph Builder non supporta direttamente i filtri WST, quindi l'applicazione deve eseguire alcune operazioni aggiuntive.

  1. Aggiungere il filtro Overlay Mixer al grafico del filtro. Il codice seguente usa la funzione AddFilterByCLSID descritta in Aggiungere un filtro per CLSID. AddFilterByCLSID non è un'API DirectShow.

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. Connettere il pin di anteprima al filtro Del renderer video tramite Il mixer sovrimpressione. È possibile usare il metodo RenderStream , come indicato di seguito:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Aggiungere il filtro Tee/Sink-to-Sink Converter al grafico del filtro. Il codice seguente usa la funzione CreateKernelFilter descritta in Creazione di filtri Kernel-Mode. CreateKernelFilter non è un'API DirectShow.

    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. Aggiungere il filtro Codec WST al grafico del filtro:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Chiamare RenderStream per connettere il pin VBI del filtro di acquisizione al convertitore tee/sink-to-sink e il convertitore tee/sink-to-sink al filtro codec WST:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Chiamare di nuovo RenderStream per connettere il filtro Codec WST al mixer di sovrapposizione. Il filtro decodificatore WST viene automaticamente inserito nel grafico.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Ricordarsi di rilasciare tutte le interfacce di filtro.

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

Nota

Attualmente, il filtro decodificatore WST non supporta le connessioni al filtro VR (Video Mixing Renderer). Pertanto, è necessario usare il filtro del renderer video legacy per visualizzare il teletext.

 

Se il filtro di acquisizione ha un pin VBI della porta video (PIN_CATEGPORY_VIDEOPORT_VBI), connetterlo al filtro Surface Allocator VBI . Il grafico non verrà eseguito correttamente in caso contrario. Nell'esempio di codice seguente viene usata la funzione AddFilterByCLSID, descritta in Aggiungere un filtro per CLSID e la funzione FindPinByCategory, descritta in Uso con categorie di pin. (Nessuna funzione è un'API DirectShow).

// 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();
}

Sottotitoli e teletext