组合使用视频捕获和预览

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

前面的部分介绍如何将视频捕获到各种文件格式。 预览视频部分介绍如何生成实时预览图。 但是,许多应用程序必须同时执行这两项操作。 若要生成合并的预览和文件写入图,只需对 ICaptureGraphBuilder2::RenderStream 进行两次调用:

// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 
    NULL, NULL);

// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 
    NULL, pMux);

在此代码中,捕获图形生成器隐藏了一些详细信息:

  • 如果捕获筛选器具有预览插针或视频端口插针以及捕获插针, 则 RenderStream 方法仅呈现这两个图钉,如下图所示。

    捕获和预览图

  • 如果筛选器只有一个捕获引脚,则捕获图形生成器使用 Smart Tee 筛选器拆分捕获流。 下图显示了具有 Smart Tee 的图形。

    使用智能 Tee 筛选器捕获和预览图形

Smart Tee 筛选器具有捕获引脚和预览图钉。 它从捕获筛选器获取单个视频流,并将其拆分为两个流,一个用于捕获,一个用于预览。 为了保持捕获引脚上的吞吐量,预览引脚会根据需要删除帧。 由于 主题 DirectShow 视频捕获筛选器中讨论的原因,它还在交付之前从每个样本中删除时间戳。

尽管 Smart Tee 拆分流,但它不会以物理方式复制视频数据。 相反,它使用共享缓冲区的自定义媒体示例对象。 这些示例标记为“只读”,以确保下游筛选器不会写入数据。

如果捕获图具有预览窗口,则以下几种情况可能会导致筛选器关系图管理器停止整个图形,包括捕获流:

  • 锁定计算机。
  • 在属于域的计算机上按 Ctrl+Alt+DELETE。
  • 运行全屏 Direct3D 应用程序,例如游戏或屏幕保护程序。
  • 切换监视器或更改显示分辨率。
  • 运行一个程序,使 Windows (UAC) 对话框显示用户帐户控制。 (Windows Vista 或更高版本。)
  • 运行全屏 DOS 窗口。

这些事件中的任何一个都可能会中断捕获会话,从而导致数据丢失。 (以下是内部发生的情况:视频呈现器会丢失所需的 Direct3D 或 DirectDraw 资源。在恢复这些资源的过程中,视频呈现器必须重新连接到上游筛选器,从而导致筛选器图形管理器停止图形。)

此问题的两种可能解决方案如下:

将视频捕获到文件