Media Foundation架构简介
如下图所示:MF提供了两套编程模型,分别是:
1,图中左边部分,用一个端到端的流水线。程序通过提供一个URL来初始化流水线,然后调用控制流的函数。
2,图中右边部分,程序既从源中抽数据,也将数据推送到目标中,这种模型在处理音视频数据时很有用,因为程序可以直接访问数据流。
从底依次往上说:
primitives 是一些贯穿于整个MF API的辅助对象,包括:
- Attributes,即“属性”。一般用于在对象中存储信息,存储方式是键值对。
- Media Types,即“媒体类型”。用于描述数据流的格式。
- Buffers,即“缓冲区”。用于保存大块的媒体数据,例如视频帧和音频采样,也可以用于在两个对象间传输数据。
- Samples,即“采样”。是Buffer的容器,也包含Buffer的元数据,比如时间戳。
Media Foundation Platform提供了一些用于流水线的核心功能,例如异步回调和工作队列。某些程序可能需要直接地调用这些API,比如你需要自定义媒体数据源,格式转换,或者sink(槽)。
--1,图中左边部分,用一个端到端的流水线。程序通过提供一个URL来初始化流水线,然后调用控制流的函数。
Media Pipeline,流水线包含3种类型的对象,它们生成或处理媒体数据,分别是:
- Media Sources,即数据源。将数据引入流水线,数据源可能是本地文件,例如视频文件,也可能是网络上的流,或者来自于摄像头。
- Media Foundation Transfroms(MFTs),即数据转换器。从一个流中处理数据,编码器和解码器都是MFTs。
- Media Sinks,即槽。消费数据,例如显示视频,播放声音,或者将数据写入文件。
第3方可以实现自己的Sources,Transforms,Sinks。例如用来支持新的文件格式。
Media Session,控制数据流,处理一些诸如质量控制,音视频同步的任务,以及响应格式的变化。
--2,图中右边部分,程序既从源中抽数据,也将数据推送到目标中,这种模型在处理音视频数据时很有用,因为程序可以直接访问数据流。
Source Reader 和 Sink Writer,是另一种处理Sources,Transforms,Sinks这3个对象的方式中需要用到的组件。Source Reader中有一个数据源和一些解码器(也可能没有解码器),而Sink Writer中有一个Sink和一些编码器(也可能没有编码器)。你可以使用Source Reader从数据源得到压缩或未压缩的数据,然后用Sink Writer将数据编码然后发送至Media Sink。