查看隐藏式字幕

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

为了在模拟电视中支持隐藏式字幕,捕获筛选器会公开一个引脚,该引脚提供 VBI 或闭合描述文字数据。 引脚将具有以下引脚类别之一:

  • VBI 引脚 (PIN_CATEGORY_VBI) 。 提供 VBI 波形样本流。 这些内容将传递到提取隐藏式字幕数据的解码器筛选器。
  • CC 引脚 (PIN_CATEGORY_CC) 。 提供从第 21 行数据中提取的闭合描述文字字节对。
  • 硬件切片 CC 引脚 (PINNAME_VIDEO_CC_CAPTURE) 。

若要预览隐藏式字幕,请使用 VBI 引脚类别调用 ICaptureGraphBuilder2::RenderStream ,如果失败,请使用 CC 类别再次调用它。

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, 0);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, 0);
}

下图显示了用于显示隐藏式字幕的典型筛选器图。

隐藏式字幕预览图

此图使用以下筛选器进行关闭描述文字显示:

  • Tee/Sink-to-Sink 转换器。 接受捕获筛选器中的 VBI 信息,并将其拆分为信号上存在的每个数据服务的单独流。 Microsoft 为隐藏式字幕、NABTS 和 World Standard Teletext (WST) 提供 VBI 编解码器。
  • CC 解码器。 从捕获筛选器提供的采样 VBI 波形中解码 CC 数据。
  • 第 21 行解码器。 转换 CC 字节对并将描述文字文本绘制到位图上。 在这种情况下,下游筛选器 (覆盖混音器) 将位图覆盖到视频上。

捕获图形生成器的 RenderStream 方法会自动添加这些筛选器。 如果捕获筛选器具有 CC 引脚而不是 VBI 引脚,则 CC 引脚将直接连接到第 21 行解码器筛选器。

注意

如果使用视频混合呈现器 (VMR) 筛选器进行呈现,请使用第 21 行解码器筛选器 2。 此筛选器具有与第 21 行解码器相同的功能,但 CLSID 是CLSID_Line21Decoder2。

 

注意

在 Windows Vista 中已删除 CC 解码器筛选器。 新应用程序应使用 VBICodec 筛选器,该筛选器在 Microsoft TV Technologies 文档中进行了介绍。

 

如果捕获设备使用视频端口,则捕获筛选器可能具有视频端口 VBI 引脚 (PIN_CATEGORY_VIDEOPORT_VBI) 。 此引脚必须连接到 VBI Surface 分配器 筛选器,该筛选器分配表面用于保存捕获的 VBI 数据。 RenderStream 方法会根据需要添加此筛选器。 下图显示了包含 VBI Surface 分配器的筛选器图。

使用 vbi surface 分配器的隐藏式字幕预览图

启用和禁用字幕

若要控制字幕显示,请在第 21 行解码器筛选器上使用 IAMLine21Decoder 接口。 例如,可以使用 IAMLine21Decoder::SetServiceState 方法关闭字幕显示,如下所示:

// Use the FindInterface method to find the interface.
IAMLine21Decoder *pLine21 = NULL;
hr = pBuild->FindInterface(
    &LOOK_DOWNSTREAM_ONLY, // Look downstream from pCap 
    NULL,                  // No particular media type
    pCap,                  // Pointer to the capture filter.
    IID_IAMLine21Decoder, (void**)&pLine21);
if (SUCCEEDED(hr))
{
    pLine21->SetServiceState(AM_L21_CCSTATE_Off);
    // (Use AM_L21_CCSTATE_On to enable.)
    pLine21->Release();
}

此示例使用 ICaptureGraphBuilder2::FindInterface 方法查找 IAMLine21Decoder 接口。 FindInterface 的第一个参数是 &LOOK_DOWNSTREAM_ONLY,它指定从捕获筛选器 (pCap) 进行下游搜索。

捕获隐藏式字幕位图

可以将描述文字位图捕获到文件中。 为此,请添加筛选器图的文件写入部分,如 将视频捕获到文件中所述。 然后将 CC 或 VBI 引脚呈现到复用筛选器:

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, pMux);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, pMux);
}

如果同时捕获视频,这将创建一个包含两个单独的视频流的文件。 它不会捕获标题覆盖在图片顶部的视频。

隐藏式字幕和电文