Exibindo legendas ocultas

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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.]

Para dar suporte a legendas ocultas na televisão analógica, o filtro de captura expõe um pino que fornece dados VBI ou legenda fechados. O pino terá uma das seguintes categorias de pino:

  • Pino VBI (PIN_CATEGORY_VBI). Fornece um fluxo de amostras de forma de onda de VBI. Eles são passados para um filtro de decodificador que extrai os dados de legendagem oculta.
  • Pino CC (PIN_CATEGORY_CC). Fornece pares de bytes legenda fechados, extraídos dos dados da linha 21.
  • Pino CC de divisão de hardware (PINNAME_VIDEO_CC_CAPTURE).

Para visualizar legendas ocultas, chame ICaptureGraphBuilder2::RenderStream com a categoria de pino de VBI e, se isso falhar, chame-o novamente com a categoria CC.

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

O diagrama a seguir mostra um grafo de filtro típico para exibir legendas ocultas.

gráfico de visualização de legenda oculta

Este grafo usa os seguintes filtros para exibição legenda fechada:

  • Conversor de tee/coletor para coletor. Aceita as informações de VBI do filtro de captura e as divide em fluxos separados para cada um dos serviços de dados presentes no sinal. A Microsoft fornece codecs VBI para Legenda Oculta, NABTS e WST (World Standard Teletext).
  • Decodificador CC. Decodifica os dados CC das formas de onda de VBI de exemplo fornecidas pelo filtro de captura.
  • Decodificador de Linha 21. Converte os pares de bytes CC e desenha o texto legenda em bitmaps. O filtro downstream (nesse caso, o Mixer de Sobreposição) sobrepõe os bitmaps no vídeo.

O método RenderStream do Capture Graph Builder adiciona esses filtros automaticamente. Se o filtro de captura tiver um pino CC em vez de um pino de VBI, o pino CC será conectado diretamente ao filtro de Decodificador de Linha 21.

Observação

Se você estiver usando o filtro VMR (Renderizador de Combinação de Vídeo) para renderização, use o Filtro de Decodificador de Linha 21 2. Esse filtro tem a mesma funcionalidade que o Decodificador de Linha 21, mas o CLSID é CLSID_Line21Decoder2.

 

Observação

O filtro de Decodificador CC foi removido no Windows Vista. Novos aplicativos devem usar o filtro VBICodec, que está documentado na documentação da Microsoft TV Technologies.

 

Se o dispositivo de captura usar uma porta de vídeo, o filtro de captura poderá ter um pino de VBI de porta de vídeo (PIN_CATEGORY_VIDEOPORT_VBI). Esse pino deve estar conectado ao filtro Alocador de Superfície de VBI , que aloca superfícies para manter os dados VBI capturados. O método RenderStream adicionará esse filtro se for necessário. O diagrama a seguir mostra um grafo de filtro com o Alocador de Superfície de VBI.

gráfico de visualização de legendagem oculta com o alocador de superfície do vbi

Habilitar e desabilitar as legendas

Para controlar a exibição de legendagem, use a interface IAMLine21Decoder no filtro Decodificador de Linha 21. Por exemplo, você pode desativar a exibição de legenda usando o método IAMLine21Decoder::SetServiceState , da seguinte maneira:

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

Este exemplo usa o método ICaptureGraphBuilder2::FindInterface para localizar a interface IAMLine21Decoder . O primeiro parâmetro para FindInterface é &LOOK_DOWNSTREAM_ONLY, que especifica a pesquisa downstream do filtro de captura (pCap).

Capturando bitmaps de legenda oculta

Você pode capturar os bitmaps legenda em um arquivo. Para fazer isso, adicione a seção de gravação de arquivo do grafo de filtro, conforme descrito em Capturando vídeo em um arquivo. Em seguida, renderize o pino CC ou VBI no filtro mux:

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

Se você também estiver capturando o vídeo, isso criará um arquivo com dois fluxos de vídeo separados. Ele não capturará vídeo com legendas sobrepostas na parte superior da imagem.

Legendas ocultas e teletexto