Поделиться через


Просмотр телетекста мирового стандарта

[Функция, связанная с этой страницей, 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 preview

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

  • Tee-преобразователь/конвертер Sink-to-Sink. Принимает сведения VBI из фильтра захвата и разбивает их на отдельные потоки для каждой из служб данных, присутствующих в сигнале.
  • WST Codec. Декодирует данные телетекста из образцов VBI.
  • декодера WST. Преобразует данные телетекста и рисует текст на растровые изображения. Фильтр на следующем этапе (в данном случае Overlay Mixer) накладывает растровые изображения на видео.

Метод RenderStream сборщика графов не поддерживает фильтры 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. Подключите пин предварительного просмотра к фильтру "Отрисовщик видео" через Overlay Mixer. Вы можете использовать метод RenderStream следующим образом:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Добавьте фильтр Tee/Sink-to-Sink Converter в граф фильтров. В следующем коде используется функция 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 Codec.

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

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

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

Заметка

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

 

Если фильтр захвата содержит контакт видеопорта для VBI (PIN_CATEGORY_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();
}

закрытые субтитры и телетекст