Просмотр телетекста world standard

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Примечание

Эта функция была удалена из операционных систем Windows Vista и более поздних версий. Он доступен для использования в операционных системах Microsoft Windows 2000, Windows XP и Windows Server 2003.

 

World Standard Teletext (WST) кодируется в интервале вертикального пробела (VBI) аналогового телевизионного сигнала. Диаграмма фильтра для предварительного просмотра телетекста похожа на диаграмму, используемую для просмотра скрытых субтитров. Этот график показан на следующей схеме.

Граф предварительного просмотра wst

На этом графике используются следующие фильтры для отображения WST:

  • Преобразователь tee/sink-to-Sink. Принимает сведения О VBI из фильтра отслеживания и разбивает их на отдельные потоки для каждой службы данных, присутствующих в сигнале.
  • Кодек WST. Декодирует данные Teletext из примеров VBI.
  • Декодер WST. Преобразует данные телетекста и рисует текст на растровые рисунки. Нисходящий фильтр (в данном случае Overlay Mixer) накладывает растровые изображения на видео.

Метод RenderStream конструктора capture Graph Builder не поддерживает фильтры WST напрямую, поэтому приложение должно выполнить дополнительные действия.

  1. Добавьте фильтр Overlay Mixer в граф фильтра. В следующем коде используется функция AddFilterByCLSID, описанная в разделе Добавление фильтра по CLSID. (AddFilterByCLSID не является 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 ...
    }
    
  2. Подключите контакт предварительного просмотра к фильтру отрисовщика видео с помощью средства наложения Mixer. Метод RenderStream можно использовать следующим образом:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Добавьте фильтр Преобразователь tee/Sink-To-Sink в граф фильтра. В следующем коде используется функция CreateKernelFilter, описанная в разделе Создание фильтров Kernel-Mode. (CreateKernelFilter не является 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");
    }
    
  4. Добавьте фильтр кодеков WST в граф фильтров:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Вызовите RenderStream , чтобы подключить контакт VBI фильтра отслеживания к преобразователю Tee/Sink-to-Sink, а конвертер Tee/Sink-to-Sink к фильтру кодека WST:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Вызовите RenderStream еще раз, чтобы подключить фильтр кодека WST к overlay Mixer. Фильтр декодера WST автоматически вводится в граф.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Не забудьте освободить все интерфейсы фильтров.

    pOvMix->Release();
    pKernelTee->Release();
    pWstCodec->Release();
    

Примечание

В настоящее время фильтр декодера WST не поддерживает подключения к фильтру отрисовщика для микширования видео (VMR). Поэтому для просмотра телетекста необходимо использовать устаревший фильтр отрисовщика видео.

 

Если фильтр захвата содержит соединитель VBI видеопорта (PIN_CATEGPORY_VIDEOPORT_VBI), подключите его к фильтру VBI Surface Allocator . В противном случае граф будет работать неправильно. В следующем примере кода используется функция AddFilterByCLSID, описанная в разделе Добавление фильтра по CLSID, и функция FindPinByCategory, описанная в разделе Работа с закрепленными категориями. (Ни функция не является 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();
}

Скрытые субтитры и телетекст