DirectShow 接收事件
2021-02-26
209
0
过滤器图形管理器公开了三个支持事件通知的接口。
- IMediaEventSink包含筛选器发布事件的方法。
- IMediaEvent包含应用程序检索事件的方法。
- IMediaEventEx继承并扩展IMediaEvent接口。
过滤器通过调用Filter Graph Manager上的IMediaEventSink::Notify方法投递事件通知。事件通知由定义事件类型的事件代码和提供附加信息的两个参数组成。根据事件代码的不同,参数可能包含指针、返回代码、引用时间或其他信息。
事件的类型详见:https://docs.microsoft.com/zh-cn/windows/win32/directshow/event-notification-codes
为了从队列中获取事件,应用程序调用过滤器图形管理器上的IMediaEvent::GetEvent方法。此方法会一直阻塞,直到有事件要返回或经过指定的时间。假设有一个事件,该方法返回事件代码和两个事件参数。在调用GetEvent之后,应用程序应该始终调用IMediaEvent::FreeEventParams方法来释放与事件参数关联的任何资源。例如,参数可能是由筛选器图分配的BSTR值。
HRESULT GetEvent(
long *lEventCode,
LONG_PTR *lParam1,
LONG_PTR *lParam2,
long msTimeout
);
下面的代码示例概述了如何从队列中获取事件。
long evCode;
LONG_PTR param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0), SUCCEEDED(hr))
{
switch(evCode)
{
// Call application-defined functions for each
// type of event that you want to handle.
}
hr = pEvent->FreeEventParams(evCode, param1, param2);
}
要覆盖筛选器图形管理器对事件的默认处理,请使用事件代码作为参数调用IMediaEvent::CancelDefaultHandling方法。您可以通过调用IMediaEvent::RestoreDefaultHandling方法来恢复默认处理。如果筛选器图没有对指定的事件代码执行默认处理,则调用这些方法没有任何效果。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936