组合使用视频捕获和预览
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media 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 的图形。
Smart Tee 筛选器具有捕获引脚和预览图钉。 它从捕获筛选器获取单个视频流,并将其拆分为两个流,一个用于捕获,一个用于预览。 为了保持捕获引脚上的吞吐量,预览引脚会根据需要删除帧。 由于 主题 DirectShow 视频捕获筛选器中讨论的原因,它还在交付之前从每个样本中删除时间戳。
尽管 Smart Tee 拆分流,但它不会以物理方式复制视频数据。 相反,它使用共享缓冲区的自定义媒体示例对象。 这些示例标记为“只读”,以确保下游筛选器不会写入数据。
如果捕获图具有预览窗口,则以下几种情况可能会导致筛选器关系图管理器停止整个图形,包括捕获流:
- 锁定计算机。
- 在属于域的计算机上按 Ctrl+Alt+DELETE。
- 运行全屏 Direct3D 应用程序,例如游戏或屏幕保护程序。
- 切换监视器或更改显示分辨率。
- 运行一个程序,使 Windows (UAC) 对话框显示用户帐户控制。 (Windows Vista 或更高版本。)
- 运行全屏 DOS 窗口。
这些事件中的任何一个都可能会中断捕获会话,从而导致数据丢失。 (以下是内部发生的情况:视频呈现器会丢失所需的 Direct3D 或 DirectDraw 资源。在恢复这些资源的过程中,视频呈现器必须重新连接到上游筛选器,从而导致筛选器图形管理器停止图形。)
此问题的两种可能解决方案如下:
- 不要包含预览流。 但是,请注意,当捕获设备具有视频端口固定时, ICaptureGraphBuilder2::RenderStream 方法会自动添加预览窗口。 请参阅 文件捕获中的视频端口固定。
- 使用流缓冲区引擎将预览流发送到另一个进程中的图形。
相关主题