必威体育Betway必威体育官网
当前位置:首页 > IT技术

DirectShow 事件回应

时间:2019-08-16 03:13:17来源:IT技术作者:seo实验室小编阅读:85次「手机版」
 

directshow

事件通知原理

当DirectShow应用程序正在运行时,事件可能发生在过滤器图形中。 例如,一个过滤器可能会遇到流式传输错误。 过滤器通过发送事件来提醒Filter Graph Manager,事件由事件代码和两个事件参数组成。 事件代码指示事件的类型,事件参数提供附加信息。 参数的含义取决于事件代码。 

 某些事件由Filter Graph Manager静默处理,无需通知应用程序。 其他事件放置在应用程序的队列中。 根据应用程序的不同,您可能需要处理各种事件。 本文侧重于三个非常通用的事件:

 ·EC_COMPLETE事件表示播放已正常完成。

 ·EC_USERABORT事件表明用户已经中断播放。 视频渲染器在用户关闭视频窗口时发送此事件。

 ·EC_ERRORABORT事件表示错误导致播放暂停。

事件通知应用

  应用程序可以指示Filter Graph Manager在发生新事件时将windows消息发送到指定的窗口。 这使应用程序能够在窗口的消息循环内作出响应。 首先,定义将发送到应用程序窗口的消息。 应用程序可以使用WM_APP到0xBFFF范围内的消息号作为私人消息:

#define WM_GRAPHNOTIFY  WM_APP + 1

  接下来,查询Filter Graph Manager以获取IMediaEventEx接口并调用IMediaEventEx :: SetNotifyWindow方法:

IMediaEventEx *g_pEvent = NULL;
g_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&g_pEvent);
g_pEvent->SetNotifyWindow((OAHWND)g_hwnd, WM_GRAPHNOTIFY, 0);

 该方法将指定的窗口(g_hwnd)指定为消息的接收者。 在创建过滤器图之后调用方法,但在运行图之前调用该方法。          WM_GRAPHNOTIFY是一个普通的Windows消息。 每当Filter Graph Manager在事件队列中放置一个新事件时,它都会将WM_GRAPHNOTIFY消息发布到指定的应用程序窗口。 消息的lParam参数等于SetNotifyWindow中的第三个参数。 该参数使您能够通过消息发送实例数据。 窗口消息的wParam参数始终为零。

在应用程序的WindowProc函数中,为WM_GRAPHNOTIFY消息添加一个case语句:

case WM_GRAPHNOTIFY:
    handleGraphEvent();
    break;

 在事件处理函数中,调用IMediaEvent :: GetEvent方法从队列中检索事件:

void HandleGraphEvent()
{
    // Disregard if we don't have an IMediaEventEx pointer.
    if (g_pEvent == NULL)
    {
        return;
    }
    // Get all the events
    long evCode;
    LONG_PTR param1, param2;
    HRESULT hr;
    while (SUCCEEDED(g_pEvent->GetEvent(&evCode, ¶m1, ¶m2, 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;
        }
    } 
}

  在释放IMediaEventEx指针之前,通过使用NULL窗口句柄调用SetNotifyWindow来取消事件通知:

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

  在WM_GRAPHNOTIFY消息处理程序中,在调用GetEvent之前检查IMediaEventEx指针:

if (g_pEvent == NULL) return;

参考:

https://www.yuque.com/docs/share/9a27ded3-4298-46a8-bba3-14696e82b654

相关阅读

linux 高并发事件触发处理 — epoll

一. 概述 epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本

jquery checkbox 选中、改变状态、change 和 click

jquery判断checked的三种方法: ​​​​​​​ .attr('checked); //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true

事件管理器的查看方法 win10

左下角的图标,右键点击事件查看器 ,点击左侧windows日志,点击应用程序 就可以查看运行的程序的报错了

微软开源数据处理引擎 Trill,每天可分析万亿次事件

微软近日开源了数据处理引擎 Trill,它每天能够分析万亿次事件。 项目地址:https://github.com/Microsoft/trill 当下每毫秒处理大量

Java MouseEvent类(鼠标事件)

简介 所有组件都能发出鼠标事件,MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener接口的监听器类来处理相应

分享到:

栏目导航

推荐阅读

热门阅读