媒体播放与转码技术解析
1. 媒体播放基础
在媒体播放过程中,为节省资源,渲染器并非在一开始就创建,而是在需要时才创建。在相关操作中,会先创建渲染器的激活控制器对象(实现 IMFActivate
接口的对象),后续媒体会话会使用这些激活对象来实例化渲染器,并在播放完成后关闭它们。
需注意,如果在其他应用中绕过媒体会话直接调用 IMFActivate::ActivateObject()
函数,使用完渲染器后别忘了调用 IMFActivate::ShutdownObject()
函数,否则会导致应用程序资源泄漏。不过,若让会话处理渲染器激活,会话会在必要时调用关闭操作,就无需担心这一步。
完成一系列操作后,会得到源节点和接收节点对,即“分支”,这些分支构成部分拓扑。部分拓扑并不包含流式传输数据所需的所有最终组件,而是为最终拓扑解析器提供提示。示例播放器应用中,媒体会话负责解析拓扑并添加缺失但隐含的组件。
2. 解析部分拓扑
在拓扑构建操作的渲染阶段,即播放前,媒体会话会实例化一个拓扑加载对象(实现 IMFTopoLoader
接口的 COM 对象),该对象接收部分拓扑并进行解析,激活内部组件并添加缺失组件。解析部分拓扑的步骤如下:
1. 会话激活节点所代表的组件。在简单拓扑中,会话只需实例化音频和视频渲染器,因为源已处于活动状态。
2. 媒体会话搜索将源产生的媒体类型数据转换为渲染器期望的媒体类型所需的 MF 转换或转换组合。对于之前的部分拓扑,会话会查找并添加视频和音频解码器转换。