查看世界标准电文
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
注意
此功能已从 Windows Vista 及更高版本的操作系统中删除。 它可用于 Microsoft Windows 2000、Windows XP 和 Windows Server 2003 操作系统。
世界标准电文 (WST) 以模拟电视信号的 VBI) 垂直消隐间隔 (编码。 用于预览图文的筛选图类似于用于查看隐藏式字幕的图。 下图演示了此图。
此图对 WST 显示使用以下筛选器:
- Tee/Sink-to-Sink 转换器。 接受捕获筛选器中的 VBI 信息,并将其拆分为信号上存在的每个数据服务的单独流。
- WST 编解码器。 解码 VBI 示例中的 Teletext 数据。
- WST 解码器。 转换图文数据并将文本绘制到位图上。 在这种情况下,下游筛选器 (覆盖混音器) 将位图覆盖到视频上。
Capture Graph Builder 的 RenderStream 方法不直接支持 WST 筛选器,因此应用程序必须执行一些额外的工作。
将覆盖混音器筛选器添加到筛选器图。 以下代码使用添加 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 ... }
通过覆盖混合器将预览引脚连接到视频呈现器筛选器。 可以使用 RenderStream 方法,如下所示:
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, pOvMix, 0);
将 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"); }
将 WST 编解码器筛选器添加到筛选器图:
IBaseFilter* pWstCodec = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, OLESTR("WST Codec"), &pWstCodec); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pWstCodec, L"WST Codec"); }
调用 RenderStream 将捕获筛选器的 VBI 引脚连接到 Tee/Sink-to-Sink 转换器,将 Tee/Sink-to-Sink 转换器连接到 WST 编解码器筛选器:
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, pKernelTee, pWstCodec);
再次调用 RenderStream 以将 WST 编解码器筛选器连接到覆盖混合器。 WST 解码器筛选器会自动引入图形。
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
请记得释放所有筛选器接口。
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();
}
相关主题