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.
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.
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 ... }
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);
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"); }
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"); }
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);
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);
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();
}
Tópicos relacionados