处理视频捕获中的重绘事件

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

如果在不使用 ICaptureGraphBuilder2 接口的情况下生成视频捕获图,并且使用旧的视频呈现器筛选器预览视频,则应替代 EC_REPAINT 事件的默认处理。 查询 IMediaEvent 接口的筛选器关系图管理器,并使用值EC_REPAINT调用 IMediaEvent::CancelDefaultHandling 方法:

IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
    pEvent->CancelDefaultHandling (EC_REPAINT);
    pEvent->Release();
}

这可以防止可能损坏捕获文件的错误。 如果用户覆盖并隐藏预览窗口,视频呈现器筛选器将收到WM_PAINT消息。 默认情况下,视频呈现器请求一个新帧,筛选器图形管理器暂停该图以提示另一个视频帧。 如果在图形写入文件时发生这种情况,则会损坏文件。 重写默认EC_REPAINT行为可防止呈现器请求新帧。

如果使用 ICaptureGraphBuilder2 接口,则不必执行此步骤,因为捕获图形生成器会自动执行此操作。 此外,如果使用视频混合呈现器 (VMR) 进行预览,则不需要它。 VMR 始终提供最新的帧,因此不会发送EC_REPAINT事件。

高级捕获主题

DirectShow 中的事件通知