Exibindo o Teletexto Padrão Mundial
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na 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 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
Essa funcionalidade foi removida do Windows Vista e de sistemas operacionais posteriores. Ele está disponível para uso nos sistemas operacionais Microsoft Windows 2000, Windows XP e Windows Server 2003.
O WST (World Standard Teletext) é codificado no VBI (intervalo de espaços em branco vertical) do sinal de televisão analógico. O grafo de filtro para visualização de teletexto é semelhante ao grafo usado para exibir legendas fechadas. O diagrama a seguir ilustra esse grafo.
Este grafo usa os seguintes filtros para exibição do WST:
- Conversor tee/coletor para coletor. Aceita as informações da VBI do filtro de captura e as divide em fluxos separados para cada um dos serviços de dados presentes no sinal.
- WST Codec. Decodifica os dados de Teletexto dos exemplos de VBI.
- Decodificador WST. Converte dados de teletexto e desenha o texto 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 não dá suporte diretamente aos filtros WST, portanto, seu aplicativo deve fazer algum trabalho extra.
Adicione o filtro Do Mixer de Sobreposição ao grafo de filtro. O código a seguir usa a função AddFilterByCLSID descrita em Adicionar um filtro por CLSID. (AddFilterByCLSID não é uma 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 ... }
Conecte o pino de visualização ao filtro renderizador de vídeo por meio do Mixer de Sobreposição. Você pode usar o método RenderStream da seguinte maneira:
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, pOvMix, 0);
Adicione o filtro Conversor tee/coletor para coletor ao grafo de filtro. O código a seguir usa a função CreateKernelFilter descrita em Criando filtros de Kernel-Mode. (CreateKernelFilter não é uma API do 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"); }
Adicione o filtro WST Codec ao grafo de filtro:
IBaseFilter* pWstCodec = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, OLESTR("WST Codec"), &pWstCodec); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pWstCodec, L"WST Codec"); }
Chame RenderStream para conectar o pino de VBI do filtro de captura ao Conversor Tee/Sink-to-Sink e ao Conversor Tee/Sink-to-Sink ao filtro do Codec do WST:
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, pKernelTee, pWstCodec);
Chame RenderStream novamente para conectar o filtro do WST Codec ao Mixer de Sobreposição. O filtro de decodificador WST é automaticamente trazido para o grafo.
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
Lembre-se de liberar todas as interfaces de filtro.
pOvMix->Release(); pKernelTee->Release(); pWstCodec->Release();
Observação
Atualmente, o filtro de Decodificador WST não dá suporte a conexões com o filtro VMR (Renderizador de Combinação de Vídeo). Portanto, você deve usar o filtro herdado do Renderizador de Vídeo para exibir o teletexto.
Se o filtro de captura tiver um pino de VBI de porta de vídeo (PIN_CATEGPORY_VIDEOPORT_VBI), conecte-o ao filtro Alocador de Superfície de VBI . Caso contrário, o grafo não será executado corretamente. O exemplo de código a seguir usa a função AddFilterByCLSID, descrita em Adicionar um Filtro por 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();
}
Tópicos relacionados