查看世界标准电文

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

注意

此功能已从 Windows Vista 及更高版本的操作系统中删除。 它可用于 Microsoft Windows 2000、Windows XP 和 Windows Server 2003 操作系统。

 

世界标准电文 (WST) 以模拟电视信号的 VBI) 垂直消隐间隔 (编码。 用于预览图文的筛选图类似于用于查看隐藏式字幕的图。 下图演示了此图。

wst 预览图

此图对 WST 显示使用以下筛选器:

  • Tee/Sink-to-Sink 转换器。 接受捕获筛选器中的 VBI 信息,并将其拆分为信号上存在的每个数据服务的单独流。
  • WST 编解码器。 解码 VBI 示例中的 Teletext 数据。
  • WST 解码器。 转换图文数据并将文本绘制到位图上。 在这种情况下,下游筛选器 (覆盖混音器) 将位图覆盖到视频上。

Capture Graph Builder 的 RenderStream 方法不直接支持 WST 筛选器,因此应用程序必须执行一些额外的工作。

  1. 将覆盖混音器筛选器添加到筛选器图。 以下代码使用添加 CLSID 筛选器中所述的 AddFilterByCLSID 函数。 (AddFilterByCLSID 不是 DirectShow API.)

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. 通过覆盖混合器将预览引脚连接到视频呈现器筛选器。 可以使用 RenderStream 方法,如下所示:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. 将 Tee/Sink-to-Sink 转换器筛选器添加到筛选器图。 以下代码使用创建 Kernel-Mode筛选器中所述的 CreateKernelFilter 函数。 (CreateKernelFilter 不是 DirectShow API.)

    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 编解码器筛选器连接到覆盖混合器。 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 分配器 筛选器。 否则,该图将无法正确运行。 下面的代码示例使用 AddFilterByCLSID 函数( 按 CLSID 添加筛选器中所述)和 FindPinByCategory 函数( 如使用固定类别中所述)。 (两个函数都不是 DirectShow API.)

// 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();
}

隐藏式字幕和电文