Partilhar via


Visualizando o teletexto padrão mundial

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Observação

Esta funcionalidade foi removida do Windows Vista e de sistemas operativos posteriores. Ele está disponível para uso nos sistemas operacionais Microsoft Windows 2000, Windows XP e Windows Server 2003.

 

World Standard Teletext (WST) é codificado no intervalo de vazio vertical (VBI) do sinal de televisão analógica. O gráfico de filtro para visualização de teletexto é semelhante ao gráfico usado para visualizar legendas ocultas. O diagrama a seguir ilustra este gráfico.

gráfico de pré-visualização wst

Este gráfico usa os seguintes filtros para exibição WST:

  • Conversor Tee/Conector entre pias. Aceita as informações VBI do filtro de captura e as divide em fluxos separados para cada um dos serviços de dados presentes no sinal.
  • Codec WST. Decodifica dados de teletexto das amostras VBI.
  • WST Decoder. Traduz dados de teletexto e desenha o texto em bitmaps. O filtro downstream (neste caso, o Overlay Mixer) sobrepõe os bitmaps no vídeo.

O método RenderStream do Capture Graph Builder não suporta diretamente os filtros WST, portanto, seu aplicativo deve fazer algum trabalho extra.

  1. Adicione o filtro Misturador Overlay ao gráfico de filtros. O código a seguir usa a função AddFilterByCLSID descrita em Add a Filter by CLSID. (AddFilterByCLSID não é uma API do 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. Conecte o pino de visualização ao filtro do Renderizador de Vídeo através do Misto de Sobreposições. Você pode usar o método RenderStream, da seguinte maneira:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Adicione o filtro Tee/Sink-to-Sink Converter ao gráfico de filtros. O código a seguir usa a função CreateKernelFilter descrita em Criando filtros Kernel-Mode. (CreateKernelFilter não é uma 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. Adicione o filtro WST Codec ao gráfico de filtro:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Chame RenderStream para conectar o pino VBI do filtro de captura ao conversor Tee/Sink-to-Sink e o Tee/Sink-to-Sink Converter ao filtro WST Codec:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Chame RenderStream novamente para conectar o filtro WST Codec ao Misturador de Overlay. O filtro WST Decoder é automaticamente trazido para o gráfico.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Lembre-se de liberar todas as interfaces de filtro.

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

Observação

Atualmente, o filtro WST Decoder não suporta conexões com o filtro VMR (Video Mixing Renderer). Portanto, você deve usar o filtro de renderizador de vídeo herdado para exibir teletexto.

 

Se o filtro de captura tiver um pino VBI de porta de vídeo (PIN_CATEGPORY_VIDEOPORT_VBI), conecte-o ao filtro Alocador de Superfície VBI . Caso contrário, o gráfico não será executado corretamente. O exemplo de código a seguir usa a função AddFilterByCLSID, descrita em Add a Filter by CLSID, e a função FindPinByCategory, descrita em Trabalhando com categorias de pino. (Nenhuma das funções é uma API do 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();
}

Legendas ocultas e teletexto