DirectShow通过事件通知(Event Notifation)机制使应用程序与Filter Graph Manager之间实现交互控制。当filter状态转换、播放完成、出错或者重绘视频窗口等时刻会发出特定事件消息,又filter graph manager处理或者转发给应用程序处理。
在Filter Graph Manager中定义了三个接口用于处理事件通知,即IMediaEventSink、IMediaEvent和IMediaEventEx。
- IMediaEventSink:主要用于filter内部,向Filter Graph Manager发送通知消息;
- IMediaEvent:向应用程序提供处理Filter
Graph Manager发出事件的接口;
- IMediaEventEx:IMediaEvent接口的扩展,可以使用窗口消息通知应用程序;
- 满足一定条件时,Filter Graph中的一个filter向 Filter Graph Manager发送一条消息;
- Filter Graph Manager或者按照默认方法直接处理事件,或者放入事件队列中由应用程序处理;
- 应用程序获知有消息发出后,使用IMediaEventEx接口的方法从事件队列中读取消息并作相应处理。
DirectShow的数据流控制机制通过Filter Graph Manager的另一个接口IMediaControl实现。该接口包含了控制Filter Graph Manager的运行、暂停和停止动作。主要通过该接口的run、stop、pause函数实现。
ps:干货略少……