媒体会话与高级功能开发
1. 媒体会话基础
在媒体处理中,媒体会话是一个关键的概念。当 HandleSourceStreamEvent()
函数接收到源流的 MEMediaSample
事件时,它会先从事件对象中提取样本,并将其缓存到会话对象中。接着,调用 SetEvent()
设置Win32事件,通知等待的同步MFT线程有新样本可用。同步MFT线程会从内部变量中提取样本并返回。
2. 会话时钟机制
会话时钟在媒体播放中起着重要作用。所有样本流在拓扑中的流动由接收器触发的样本请求事件驱动,接收器通过拓扑主动拉取单个样本。MP3会话使用标准渲染接收器,每个样本依次被渲染。接收器通过查看样本中的呈现时间戳,并将其与呈现时钟对象进行比较,来确定每个样本的渲染时间。
呈现时钟实现了 IMFPresentationClock
接口,它提供相对于媒体项开始的时钟访问。在播放开始时,呈现时钟初始化为零,只有当样本的呈现时间戳与呈现时钟的时间匹配时,样本才会被渲染。例如,如果在五秒时暂停呈现时钟,然后将其重置为零,音频将停止播放,直到时钟再次达到五秒。
媒体会话负责在每次搜索时调整时钟。如果将源搜索到媒体开始后的35秒,需要将呈现时钟也调整到35秒。在具有多个数据流和多个接收器的拓扑中,呈现时钟可确保各个流之间的同步,使当前播放的视频帧与音频匹配。
呈现时钟由一个媒体接收器(通常是音频渲染器)维护,每个接收器在开始播放前必须有对呈现时钟的引用。在 CMP3Session::Start()