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

如果在不使用 ICaptureGraphBuilder2 界面的情况下生成视频捕获图,并且使用旧的视频呈现器筛选器预览视频,则应替代 EC_REPAINT 事件的默认处理。 查询 IMediaEvent 接口的筛选器Graph管理器,并使用值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消息。 默认情况下,视频呈现器请求新帧,筛选器Graph管理器暂停图形,以便提示另一个视频帧。 如果图形正在写入文件时发生这种情况,它将损坏该文件。 重写默认EC_REPAINT行为可防止呈现器请求新帧。

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

高级捕获主题

DirectShow中的事件通知