关于拓扑

拓扑是一个对象,表示数据在管道中的流动方式。 应用程序创建一个拓扑来描述每个流从媒体源到媒体接收器的路径。 应用程序将拓扑传递到媒体会话,媒体会话使用该拓扑来控制数据流。

管道中的数据处理组件 (媒体源、转换和媒体接收器) 在拓扑中表示为 节点。 从一个组件到另一个组件的数据流由节点之间的连接表示。 定义了以下节点类型:

  • 源节点:表示媒体源上的媒体流。
  • 转换节点:表示媒体基础转换 (MFT) 。
  • 输出节点:表示媒体接收器上的流接收器。
  • Tee 节点:表示流中的分支。 Te 节点是节点表示管道对象的规则的例外。 与其他节点类型不同,tee 节点只是指导数据流。

正常运行的拓扑必须包含至少一个连接到输出节点的源节点,可能通过一个或多个转换节点。 例如,下图显示了一个包含一个流的简单拓扑。

显示包含一个流的拓扑的关系图。

对于文件播放,转换节点可能表示解码器,输出节点表示音频或视频呈现器。 对于文件编码,转换节点表示编码器,输出节点表示存档接收器,例如 ASF 文件接收器。

如果两个节点已连接,则生成数据的节点称为上游节点,接收数据的节点称为下游节点。 例如,在上图中,源节点从转换节点上游。

在一对连接的节点中,上游节点上的连接点称为输出。 下游节点上的连接点称为 输入。 下图显示了一对节点及其连接点,以及它们之间的数据流。 连接点在拓扑中不表示为单独的对象。 它们由节点对象上的索引值指定。

显示两个连接的节点的关系图。

源节点不能有任何输入。 因此,无法从源节点上游任何节点。 同样,输出节点不能具有输出,并且输出节点下游不能有任何节点。 从源节点到输出节点的节点链称为拓扑的 分支 。 本主题中的第一张图显示了具有单个分支的拓扑。 通常每个流有一个分支。 例如,若要播放包含一个音频流和一个视频流的文件,需要具有两个分支的拓扑。

部分拓扑

完整或 完整 拓扑包含所需的每个管道对象的节点。 但是,应用程序并不总是需要创建完整的拓扑。 相反,它会 创建省略 一个或多个转换节点的部分拓扑。

媒体会话使用名为拓扑 加载程序的对象完成拓扑。 拓扑加载程序通过插入所需的转换将部分拓扑转换为完整拓扑。 转换过程称为 解析 拓扑。

例如,若要播放编码的音频流,拓扑必须在源节点和输出节点之间具有解码器。 应用程序创建一个部分拓扑,该拓扑将源节点直接连接到输出节点,而无需解码器。 拓扑加载程序检查流格式,查找正确的解码器,并将转换节点插入拓扑。

下图显示了应用程序创建的部分拓扑。

显示包含源节点和输出节点的部分的示意图。

下图显示了拓扑加载程序解析后的完整拓扑。 在此示例中,拓扑加载程序为解码器插入了转换节点。

显示完整拓扑的示意图。

在当前版本的 Media Foundation 中,拓扑加载程序支持用于播放的拓扑。 对于文件编码和其他方案,应用程序必须构造完整的拓扑。

应用程序还可以创建拓扑加载程序并直接使用它。 例如,可以使用拓扑加载程序解析部分拓扑,然后修改完整拓扑,然后再将其分配给媒体会话。 若要创建拓扑加载程序,请调用 MFCreateTopoLoader

拓扑