关于 MCT

Media Foundation 转换 (MRT) 提供用于处理媒体数据的通用模型。 MRT 用于解码器、编码器和数字信号处理器, (DSP) 。 简言之,位于媒体源和媒体接收器之间的媒体管道中的任何内容都是 MFT。

对于大多数应用程序,MFT 数据处理的详细信息被媒体基础体系结构的更高层隐藏。 许多 Media Foundation 应用程序永远不会直接调用 MFT。 但是,当然可以直接在应用程序中托管 MFT。

MMFT 是 DirectX 媒体对象首次引入的转换模型的演变, (MTO) 。 事实上,创建支持这两个模型的转换相对容易。 与 MTO 相比,MRT 的所需行为更明确,因此更容易编写正确的实现。 此外,MCT 可以支持硬件加速视频处理。

本主题简要概述了 MFT 处理模型,重点介绍整体设计,而不是特定方法调用。 有关更详细的分步说明,请参阅 基本 MFT 处理模型

MFT 具有输入流和输出流。 输入流接收数据,输出流生成数据。 例如,解码器具有一个接收编码数据的输入流和一个输出流,用于生成解码数据。

MFT 上的流不表示为不同的 COM 对象。 相反,每个流都有一个指定的流标识符, IMFTransform 接口中的方法将流标识符作为输入参数。

某些 MRT 具有固定数量的流。 例如,解码器和编码器通常只有一个输入和输出。 其他 MRT 具有动态数量的流。 如果 MFT 支持动态流,则客户端可以添加新的输入流。 客户端无法添加输出流,但 MFT 可能会在处理期间添加或删除输出流。 例如,多路复用器通常允许客户端添加输入流,并为多路复用流提供一个输出。 反多路复用器是相反的,具有一个输入,但输出流的动态数量,具体取决于输入流的内容。 下图显示了多路复用器和多路复用器之间的差异。

显示编码器/解码器 (1 个输入、1 个输出) 、多路复用器 (2 个输入、1 个输出) 和一个多路复用器 (1 个输入、2 个输出)

媒体类型

首次创建 MFT 时,所有流都没有已建立的格式。 在 MFT 可以处理数据之前,客户端必须设置流的格式。 例如,使用解码器时,输入格式是原始源文件中使用的压缩格式,输出格式是未压缩的格式,如 PCM 音频或 RGB 视频。 流格式是使用 媒体类型描述的。

根据 MFT 的内部状态,它可能会为每个流提供可能媒体类型的列表。 设置媒体类型时,可以使用此列表作为提示。 在一个流上设置媒体类型可以更改另一个流的可能类型列表。 例如,在客户端设置输入类型之前,解码器通常无法提供任何输出类型。 输入类型包含解码器返回可能输出类型的列表所需的信息。

若要在流上设置媒体类型,请调用 IMFTransform::SetInputTypeIMFTransform::SetOutputType。 若要获取流可能媒体类型的列表,请调用 IMFTransform::GetInputAvailableTypeIMFTransform::GetOutputAvailableType

处理数据

客户端在流上设置媒体类型后,MFT 即可处理数据。 为此,客户端在向 MFT 提供输入数据和从 MFT 获取输出数据之间交替:

ProcessInput 方法使用指向客户端分配的媒体示例的指针。 媒体示例包含一个或多个缓冲区,每个缓冲区都包含要处理的 MFT 的输入数据。

ProcessOutput 方法支持两种不同的分配模型:MFT 分配输出缓冲区,或客户端分配输出缓冲区。 某些 MFT 支持这两种分配模型,但 MFT 不需要同时支持这两种分配模型。 例如,MFT 可能要求客户端分配输出缓冲区。 IMFTransform::GetOutputStreamInfo 方法返回有关输出流的信息,包括 MFT 支持的分配模型。

MMFT 旨在缓冲尽可能少的数据,以最大程度地减少管道中的延迟。 因此,在任何给定时间,MFT 都可以发出以下条件之一的信号:

  • MFT 需要更多的输入数据。 在此状态下,在客户端调用 ProcessInput 至少一次之前,MFT 无法生成输出。
  • 在客户端调用 ProcessOutput 至少一次之前,MFT 不会再接受任何输入。

例如,假设使用视频解码器解码包含关键帧和增量帧混合的视频流。 最初,MFT 需要一些输入才能解码任何帧。 客户端调用 ProcessInput 来传递第一个帧。 假设第一个帧是一个增量帧, (在下图中显示为预测帧) 的“P”。 解码器会保留此帧,但在获得下一个关键帧之前,它无法生成任何输出。

显示需要输入的 mft 的示意图,该图指向预测帧

客户端继续调用 ProcessInput ,最终到达下一个关键帧 (在下一个图中显示为“I”的内编码帧) 。 现在,解码器具有足够的帧来开始解码。 此时,它停止接受输入,并且客户端必须调用 ProcessOutput 来获取解码的帧。

显示不接受输入的 mft 的示意图,该图指向一个内编码帧和三个预测帧

客户端最简单的方法是对 ProcessInputProcessOutput 交替调用。 基本 MFT 处理模型主题中介绍了更复杂的算法。

Media Foundation 转换