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.
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.
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.
Tópicos relacionados