0
点赞
收藏
分享

微信扫一扫

获取directshow中的播放事件IMediaEvent


获取directshow中的播放事件IMediaEvent

​​编者:李国帅​​


背景原因:

使用简单的代码,编写一个播放器,莫过于使用directshow直接播放了,这里讲一下在directshow的graph中添加事件处理的方法。

 

问题相关:

首先看一下directshow经典例程,经典的步骤:

获取directshow中的播放事件IMediaEvent_消息处理

获取directshow中的播放事件IMediaEvent_消息处理_02

如何添加播放事件:

声明和获取:

#define WM_GRAPHNOTIFY  WM_APP + 1
IMediaEventEx *g_pEvent = NULL;
pGraph->QueryInterface(IID_IMediaEventEx, (void **)&g_pEvent);
g_pEvent->SetNotifyWindow((OAHWND)g_hwnd, WM_GRAPHNOTIFY, 0);//绑定到接收窗口

//In your application's WindowProc function, add a case statement for the WM_GRAPHNOTIFY message:
case WM_GRAPHNOTIFY:
HandleGraphEvent(); break;//在窗口消息处理函数中处理directshow事件

查询处理:

void HandleGraphEvent()
{
// Disregard if we don't have an IMediaEventEx pointer.
if (g_pEvent == NULL) return;

// Get all the events
long evCode, param1, param2;
HRESULT hr;
while (SUCCEEDED(g_pEvent->GetEvent(&evCode, &param1, &param2, 0)))//循环查询事件
{
g_pEvent->FreeEventParams(evCode, param1, param2);
switch (evCode)
{
case EC_COMPLETE: // Fall through.
case EC_USERABORT: // Fall through.
case EC_ERRORABORT:
CleanUp();
PostQuitMessage(0);
return;
}
}
}

接口释放:

// Disable event notification before releasing the graph.
g_pEvent->SetNotifyWindow(NULL, 0, 0);
g_pEvent->Release();
g_pEvent = NULL;

 

举报

相关推荐

0 条评论