视频端口固定

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

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

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

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

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

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

connecting a video port pin to the overlay mixer filter.

可以使用 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.
);

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

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

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

pGraph->Connect(pVPPin, pOvPin);

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

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

高级捕获主题

在视频捕获中使用覆盖Mixer