Media Foundation基本概念

Media Foundation

Media Foundation(简称MF)是微软用来替换DirectShow的视频API,从Vista开始支持,直到现在的Windows 8,Windows Phone 8,让编码解码的操作更容易。
MF只支持C++,不支持C#。
MF加强了对DirectX Video Acceleration (DXVA),EVR(enhanced video renderer),高清(High-definition)以及数字保护方面的功能。

基本概念

先科普几个专业名词,扫清理解上的障碍。

Streams,即“流”:
“流”是一个统一了格式的多媒体数据序列。最常见的数据类型是音频和视频,但是“流”可以包含任何类型的数据,文字,脚本,图片都是有可能的。要把这里的术语“流”与网络上的数据“流”分开,此流非彼流。

通常,一个多媒体文件要么包含一个单独的音频流,要么音视频都包含。但是有可能包含同一种类型的多个流,比如一个视频文件可能包含多种语言的音频,播放的时候根据需要选择某一种来使用。

Compression ,即“压缩"

”压缩“指的是通过删除冗余信息而达到减小数据体积目的的流程。压缩算法分为两种:

无损压缩:压缩后的数据和原始数据是一样的。
有损压缩:压缩后的数据接近原始数据,但不会精确匹配。

在大多数领域中,有损压缩是不能被接受的,但是有损压缩适合音频频,因为:
1,人类的生理感知能力决定了有些频率的声音是听不到的,根据信号处理原理可以分离出那些听不到的数据,删除之,因为这些数据是没有意义的。2,稍微降低图像或声音的质量在某种情况下也是可以接受的,比如打电话时的声音通常是高倍压缩的,但人们也能听懂对方。

压缩也叫做”编码“,执行编码的叫做”编码器",相反的过程叫做“解码”,执行解码的当然叫做“解码器”。
通常把这两者统称为编解码器(codec),硬件或软件都可以作为编解码器。

Media Container,即“容器”

一般来说,很少直接将原始的音频和视频流数据通过网络传输。因为:

1,不预先知道用什么编解码器是没办法直接解码这样一个数据流的。
2,媒体文件通常包含至少以下几种元素:

  • 文件头,描述流的数量,以及每一个流的格式,等等。
  • 索引,用于随机访问。
  • 元数据,描述内容的相关介绍,比如作者,标题之类的。
  • 包头,允用于网络传输和随机访问。

术语“容器”是用来描述流的所有包,文件头,索引,元数据这4项数据。用“容器”而不用“文件”来描述的原因是有些容器格式是用来直播的,程序可能实时生成容器而从不保存成一个文件。早期的容器的例子是AVI文件格式,其他例子还有MP4和ASF。容器可以通过文件扩展名或MIME类型来识别,例如 .mp4。

下图是一个典型的容器结构,但此图并不代表某一种特定的容器格式,因为不同的格式相差甚远。

Media Foundation基本概念_第1张图片

注意这个结构是分层级的,文件头信息在容器的开头,大多数容器结构都是这样的。另外注意:数据段中的音频和视频包是隔行出现的,这也很常见。术语"多路复用",即multiplexing,指的是将音频和视频流打包并隔行放进容器的过程,反向的过程叫做即demultiplexing。

Format,即“格式”:

“格式”这个词其实是这点歧义的,格式可能指的是编码类型,例如H.264视频,也可能是容器类型,例如MP4。很多人都搞不太清楚,因为文件的扩展名也容易把人把迷糊,例如: mp3既指编码格式(MPEG-1 Audio Layer 3)又指的是文件格式。

作为开发者把这格式这个词理解清楚是很重要的,因为读取媒体文件格式有两个步骤:
1,解析容器,之后流的数量和每个流的格式就知道了。
2,用合适的解码器解码流。

这样就很自然地将两个过程从软件设计的角度上分开了,并且可以设计成插件模型,这样第3方就可以手袋自己的解析器和编解码器了。COM提供了一套标准方式来分离接口和实现,也正是因为如此,MF使用COM接口模型。

下图显示了用于读取媒体文件的流程中用到的组件:


写入媒体文件也需要两个步骤:

1,将未压缩的音频视频数据编码。
2,将压缩后的数据放进某个容器格式。

下图显示了用于写入媒体文件的流程中用到的组件:


你可能感兴趣的:(Media,Foundation)