媒体基础源:原理、实现与应用
1. 媒体基础源概述
媒体基础(MF)媒体源是COM对象,至少需暴露两个接口: IMFMediaSource
和 IMFMediaEventGenerator
。 IMFMediaSource
接口让应用程序控制源,媒体生成器接口则用于源发送各种状态和操作信号。
媒体源可暴露一个或多个输出媒体流对象,无输入媒体流对象。从概念上讲,MF媒体源等同于DirectShow源过滤器,每个媒体流对象的作用与DirectShow输出引脚相同,负责传输特定数据类型的基本流,如视频、音频、交互式电视数据或字幕。若文件包含同一类型的多个基本流,源通常会暴露多个流对象,每个基本流对应一个。例如,文件含两个音轨,源会暴露两个媒体流对象,将音频数据传输到拓扑结构中。
媒体基础管道采用“拉取”架构,媒体会话(作为控制器)按需从每个节点拉取样本。播放期间,媒体会话会从所选的每个媒体流对象请求数据,而不会从非活动(未选)流请求数据。选择或取消选择特定数据流的原因是媒体文件常含同一类型的多个数据流。如电影可能有三个独立音轨(每种语言一个)和三个字幕轨,为仅播放和显示一种语言的信息,可取消选择不需要的流。
每个媒体流对象关联一个或多个媒体类型,描述该对象可传输的媒体类型。MF拓扑生成器需此信息来确定哪个媒体基础转换(MFT)或接收器与特定输出流对象兼容。
以下是AVF源示例的主要类构成:
graph LR
classDef process fill:#E5F6FF,