Visualización de Teletexto estándar mundial
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Nota:
Esta funcionalidad se ha quitado de Windows Vista y sistemas operativos posteriores. Está disponible para su uso en los sistemas operativos Microsoft Windows 2000, Windows XP y Windows Server 2003.
El Teletexto estándar del mundo (WST) se codifica en el intervalo de en blanco vertical (VBI) de la señal de televisión analógica. El gráfico de filtros para obtener una vista previa del teletexto es similar al gráfico que se usa para ver subtítulos. En el diagrama siguiente se muestra este gráfico.
Este gráfico usa los siguientes filtros para la presentación de WST:
- Convertidor de tee/receptor a receptor. Acepta la información de VBI del filtro de captura y la divide en secuencias independientes para cada uno de los servicios de datos presentes en la señal.
- Códec WST. Descodifica los datos de Teletext de los ejemplos de VBI.
- Descodificador WST. Traduce datos de teletexto y dibuja el texto en mapas de bits. El filtro de bajada (en este caso, el mezclador de superposición) superpone los mapas de bits en el vídeo.
El método RenderStream de Capture Graph Builder no admite los filtros WST directamente, por lo que la aplicación debe realizar algún trabajo adicional.
Agregue el filtro Mezclador de superposición al gráfico de filtros. El código siguiente usa la función AddFilterByCLSID descrita en Agregar un filtro por CLSID. (AddFilterByCLSID no es una 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 la patilla de vista previa al filtro Video Renderer a través del mezclador de superposición. Puede usar el método RenderStream , como se indica a continuación:
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, pOvMix, 0);
Agregue el filtro Tee/Sink-to-Sink Converter al gráfico de filtros. En el código siguiente se usa la función CreateKernelFilter descrita en Creating Kernel-Mode Filters. (CreateKernelFilter no es una API de 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"); }
Agregue el filtro Códec WST al gráfico de filtros:
IBaseFilter* pWstCodec = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, OLESTR("WST Codec"), &pWstCodec); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pWstCodec, L"WST Codec"); }
Llame a RenderStream para conectar el pin VBI del filtro de captura al convertidor tee/sink-to-sink y el convertidor de tee/receptor a receptor al filtro de códec WST:
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, pKernelTee, pWstCodec);
Vuelva a llamar a RenderStream para conectar el filtro de códec WST al mezclador de superposición. El filtro de descodificador WST se introduce automáticamente en el gráfico.
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
Recuerde liberar todas las interfaces de filtro.
pOvMix->Release(); pKernelTee->Release(); pWstCodec->Release();
Nota:
Actualmente, el filtro de descodificador WST no admite conexiones al filtro representador de mezcla de vídeos (VMR). Por lo tanto, debe usar el filtro heredado de Video Renderer para ver el teletexto.
Si el filtro de captura tiene un pin VBI de puerto de vídeo (PIN_CATEGPORY_VIDEOPORT_VBI), conéctelo al filtro de asignador de superficie de VBI . De lo contrario, el grafo no se ejecutará correctamente. En el ejemplo de código siguiente se usa la función AddFilterByCLSID, descrita en Agregar un filtro por CLSID y la función FindPinByCategory, descrita en Trabajar con categorías de pin. (Ninguna función es una API 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();
}
Temas relacionados