视频端口引脚

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

具有硬件视频端口的捕获设备可能使用 Microsoft® DirectX® 中 VPE) (视频端口扩展。 如果是这样,捕获筛选器将具有一个视频端口 (VP) 引脚。 没有视频数据从 VP 引脚通过筛选器图传输。 相反,视频帧在硬件中生成,并直接发送到视频内存。 VP 引脚允许将控制消息发送到硬件。

连接 VP 引脚非常重要,即使应用程序仅执行文件捕获而没有预览。 如果使引脚保持未连接状态,则图将无法正常运行。 这与无需连接的预览引脚不同。

不同的 DirectShow 视频呈现器为 VP 引脚提供不同的支持:

  • 视频呈现器:将 VP 引脚连接到 覆盖混音器 筛选器上的固定 0,并将覆盖混音器筛选器连接到视频呈现器。
  • VMR-7:将 VP 引脚连接到 视频端口管理器 筛选器,并将视频端口管理器连接到 VMR-7。
  • VMR-9:如果设备有 VP 引脚,则无法使用 VMR-9,因为 Direct3D 9 不支持视频端口。 使用视频呈现器或 VMR-7。

对于视频端口方案,建议使用覆盖混音器和视频呈现器而不是视频端口管理器和 VMR-7,因为并非所有驱动程序都支持视频端口管理器。 通常,覆盖混音器是视频端口最可靠的选项。

如果有 VP 引脚, ICaptureGraphBuilder2::RenderStream 方法会自动插入覆盖混音器。 如果在不使用此方法的情况下生成图形,则应为捕获筛选器上的视频端口引脚检查,如果存在,请将其连接到覆盖混音器筛选器,如下图所示。

将视频端口引脚连接到覆盖混音器筛选器。

可以使用 ICaptureGraphBuilder2::FindPin 方法在捕获筛选器上搜索 VP 引脚:

hr = pBuild->FindPin(
    pCap,                    // Pointer to the capture filter.
    PINDIR_OUTPUT,           // Look for an output pin.
    &PIN_CATEGORY_VIDEOPORT, // Look for a video port pin.
    NULL,                    // Any media type.
    FALSE,                   // Pin can be connected.
    0,                       // Retrieve the first matching pin.
    &pVPPin                  // Receives a pointer to the pin.
);

将覆盖混音器添加到图形后,再次调用 FindPin 以在覆盖混音器上查找引脚 0。 引脚 0 始终是筛选器上的第一个输入引脚。

pBuild->FindPin(pOvMix, PINDIR_INPUT, NULL, NULL, TRUE, 0, &pOVPin);

通过调用 IGraphBuilder::Connect 连接两个引脚。

pGraph->Connect(pVPPin, pOvPin);

然后将覆盖混音器的输出引脚连接到视频呈现器筛选器。 可以通过在 Filter Graph 管理器上调用 IVideoWindow::p ut_AutoShowIVideoWindow::p ut_Visible 方法来隐藏视频。

对于电视调谐器,捕获筛选器可能还具有视频端口 VBI 引脚 (PIN_CATEGORY_VIDEOPORT_VBI) 。 如果是这样,请将该引脚连接到 VBI Surface 分配器 筛选器。 有关详细信息,请参阅 查看隐藏式字幕

高级捕获主题

在视频捕获中使用覆盖混音器