Windows开发:关于微软媒体基础(Microsoft Media Foundation)


注:文章由作者翻译和资料整理,转载请注明出处

序言

介绍

Microsoft Media Foundation是适用于Windows的下一代多媒体平台,使开发人员,消费者和内容提供商能够以更强的健壮性,无与伦比的质量和无缝交互来拥抱新一轮的高级内容。
Media Foundation需要Windows Vista或更高版本。它使用组件对象模型(COM),并且需要C / C ++。Microsoft不提供Media Foundation的托管API。
Media Foundation API是Windows SDK的一部分。要开发Media Foundation应用程序,请安装最新版本的Windows SDK

可用的基础工具

基础概念 Essential Concepts

流 Streams

流,是一个统一格式的媒体数据序列。其中最常见的是音频流和视频流,但是一个流也可以包含几乎任何种类的数据,包括文本、脚本命令、以及静止图片。在这篇文章里的术语“流”并不特指网络传输中的流。用于本地播放的媒体文件也包含“流”。
通常一个媒体文件要么包含单一的音频流,要么是一个视频流和一个音频流。然而一个媒体文件也可能包含很多个相同类型的流。例如一个视频文件可能包含多种语言的音频流。在运行过程中应用程序去选择播放哪一种语言的音频。

压缩 Compression

压缩是指通过删除冗余信息来减少数据流大小的过程。
压缩算法分为两大类:

  • 无损压缩:使用无损算法,复原后的数据与原始数据相同
  • 有损压缩:使用有损算法,复原后的数据是原始数据的近似值,但不是准确值

在大多数其他领域中,有损压缩是不可接受的。(想象一下电子表格的“近似值”!)但是有两个原因,有损压缩方案非常适合音频和视频。
第一个原因与人类感知的物理学有关。当我们听复杂的声音(例如音乐录音)时,该声音中包含的某些信息是听不到的。借助信号处理理论,可以分析和分离无法感知的频率。可以消除这些频率,而不会产生感知影响。尽管重建的音频将与原始音频不完全匹配,但它对听众来说听起来是一样的。类似的原理也适用于视频。
其次,根据预期目的,声音或图像质量的某些下降可能是可以接受的。例如,在电话中,音频通常被高度压缩。结果足以进行电话交谈-但却不能用来听音乐。
压缩也称为编码,将进行编码的设备称为编码器。反向过程是解码,该设备自然称为解码器。编码器和解码器的总称是编解码器。编解码器可以用硬件或软件来实现。

媒体容器 Media Containers

我们很少将原始音频或视频流存储为文件,或者直接通过网络发送。一方面,如果不事先知道要使用哪个编解码器,就不可能解码这样的流。因此,媒体文件通常至少包含以下某些元素:

  • 用于描述流的数量,以及每个流的格式等的文件头。
  • 允许对内容进行随机访问的索引。
  • 描述内容的元数据(例如,文件的作者或标题)。
  • 数据包头,以实现网络传输或随机访问。

本文档使用术语“container ”来描述流,标头,索引,元数据等的整个包。之所以使用术语“容器”而不是“文件”,是因为某些容器格式是为直播而设计的。应用程序可以实时生成容器,而无需将其存储到文件中。

媒体容器的早期示例是AVI文件格式。其他示例包括MP4和高级系统格式(ASF)。可以通过文件扩展名(例如.mp4)或MIME类型来标识容器。

下图显示了媒体容器的典型结构。该图不代表任何特定格式;因为每种格式的细节差异很大。
在这里插入图片描述
请注意,图中所示的结构是分层的,标头信息出现在容器的开头。这种结构是许多(但不是全部)容器格式的代表。还要注意,数据部分包含交错的音频和视频数据包。这种交织在媒体容器中很常见。
术语多路复用是指对音频和视频流进行打包并将包交织到容器中的过程。从打包数据重新组合流的反向过程称为多路分解

格式 Formats

在数字媒体中,格式一词并不明确。格式可以指代编码的类型(例如H.264视频)或容器的类型(例如MP4)。这种区别通常会使普通用户感到困惑。媒体格式的名称并不总是有用。例如,MP3既指编码格式(MPEG-1音频第3层)又指文件格式。
但是,区别很重要,因为读取媒体文件实际上涉及两个阶段:

  1. 首先,必须对容器进行解析。在大多数情况下,直到完成此步骤才能知道流的数量和每个流的格式。
  2. 接下来,如果流被压缩,则必须使用适当的解码器对其进行解码。

这种情况下自然衍生了一种软件设计模式,使用单独的组件来解析容器和解码流。另外,此方法适合于插件模型,以便第三方可以提供自己的解析器和编解码器。在Windows上,组件对象模型(COM)提供了一种将API与实现分开的标准方法,这是任何插件模型所必需的,这也是Media Foundation使用COM接口的原因之一。
下图显示了用于读取媒体文件的组件:
在这里插入图片描述
编写媒体文件还需要两个步骤:

  1. 编码未压缩的音频/视频数据。
  2. 将压缩数据放入特定的容器格式。

下图显示了用于写入媒体文件的组件:
在这里插入图片描述

增强的视频渲染器 Enhanced Video Renderer(EVR)

增强的视频渲染器(EVR)是在用户的监视器上显示视频的组件。存在两种版本的EVR:

  • EVR媒体接收器,用于Media Foundation应用程序。
  • EVR筛选器,用于DirectShow应用程序。

两种版本都使用相同的内部对象来渲染视频,并且它们共享许多相同的接口。
EVR最多可以混合16个视频流。第一个输入流称为参照流。参照流通常在z-order的首位。
(窗口的z-order表明了在一堆堆叠的窗口中该窗口的位置。窗口的堆叠是沿bai着一条虚轴—Z轴,从屏幕里向外延伸的。在z-order顶端的窗口将会压在其他窗口上。在z-order底部的窗口将会被其他窗口所压。 系统在一个单一的表中维护z-order 。根据窗口是不是顶级窗口,父窗口,子窗口,系统把他们添加到z-order中。顶级窗口将会堆叠在所有非顶级窗口之上,不管它是否是活动窗口或者是前台窗口。)
任何其他流称为子流,并在参照流的顶部混合。应用程序可以更改子流的z-order,但是任何子流都不能在z-order中排在首位。
图形驱动程序确定支持哪些视频格式,但通常仅限于以下几种:

  • 参照流:逐行或交错式的没有单个像素alpha值的YUV(例如NV12或YUY2),或渐进式RGB。
  • 子流:含逐像素alpha值的渐进式YUV,例如AYUV或AI44。

可用的子流格式可能取决于参考流的格式。
在内部,EVR使用称为混合器(mixer)的对象将来自输入流的帧合成到一个表面上进行渲染。混合器还执行去隔行和色彩校正。混合器最终输出混合后的视频帧。再通过第二个对象演示器(presenter)将视频帧渲染到屏幕。演示器安排渲染帧的时间并管理Direct3D设备。应用程序可以提供混合器或演示器的自定义实现。
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MFC(Microsoft Foundation Classes)是一个用于Windows平台的编程框架,它提供了一组用于开发Windows应用程序的类和函数。Media Foundation是一个在Windows平台上用于媒体处理的多媒体框架,它包含了一组用于音视频播放、音视频捕捉和音视频解码等功能的API。 在MFC中调用Media Foundation,可以实现在MFC应用程序中进行媒体处理的功能。 首先,需要在MFC应用程序中添加对Media Foundation的引用。可以通过在项目属性中的配置管理器中添加对Media Foundation的包含路径,并在源代码中包含相应的头文件来引用该框架。 然后,在MFC应用程序中可以使用MFC提供的窗口类(如CWnd)来创建一个显示媒体内容的窗口。可以使用Media Foundation的API来加载和播放音视频文件,或者进行音视频的捕捉和编解码处理。 例如,通过调用MFCreateSourceReaderFromURL函数可以创建一个媒体源读取器,用于加载和读取音视频文件。通过调用IMFSourceReader的相关方法,可以获取音视频数据的格式信息、读取音视频帧等操作。 另外,可以使用MFC提供的各种控件,如按钮、滑动条等来实现对媒体播放的控制。例如,通过响应按钮的点击事件,可以调用Media Foundation的API来控制音视频的播放、暂停、停止等操作。 总而言之,MFC提供了一个方便的开发框架,而Media Foundation则提供了丰富的媒体处理功能。通过在MFC应用程序中调用Media Foundation的API,可以实现媒体文件的播放、捕捉和编解码等功能,为应用程序增加了更多的媒体处理能力。 ### 回答2: MFC(Microsoft Foundation Classes)是微软提供的一套应用程序框架,用于Windows操作系统上的软件开发。而Media Foundation微软提供的多媒体处理框架,用于开发处理音频视频等多媒体内容。 在MFC中调用Media Foundation,可以实现对多媒体内容的处理和管理。通过Media Foundation,我们可以进行多媒体文件的播放、录制、转码等操作。 首先,需要在MFC应用程序中添加Media Foundation相关的头文件和库文件。在需要使用Media Foundation的代码文件中,包含头文件,并链接相应的库文件。 接下来,可以使用Media Foundation提供的函数和接口来实现具体的操作。例如,可以使用MFCreateMediaSession函数创建一个Media Session对象,该对象可以用于播放多媒体文件。可以通过该对象的方法,设置音频视频源,然后调用播放方法进行多媒体内容的播放。 此外,还可以使用Media Foundation提供的其他接口,如IMFMediaSource、IMFMediaSink等,来实现对多媒体内容的录制、转码、编辑等操作。 需要注意的是,MFC本身是一个比较老旧的框架,而Media Foundation是较新的技术,因此在调用Media Foundation时可能会遇到一些兼容性问题。如果在MFC中调用Media Foundation出现问题,可以尝试解决兼容性问题或者考虑使用其他更适合的框架来实现对多媒体内容的处理。 总之,通过在MFC应用程序中调用Media Foundation,可以实现对多媒体内容的处理和管理,为应用程序增加丰富的多媒体功能。 ### 回答3: MFC(Microsoft Foundation Class)是微软开发的一个基于Windows操作系统的应用程序框架,而Media FoundationWindows平台上用于处理音频视频的多媒体框架。MFC提供了一系列的类和方法,用于构建Windows桌面应用程序,并且可以方便地集成其他的Windows API和框架。 如果想在MFC应用程序中调用Media Foundation库,首先需要在项目的设置中添加对Media Foundation库的引用。然后,通过使用MFC提供的类和方法,可以实现对音频视频的播放、录制、编码解码等操作。 在MFC中调用Media Foundation可以有如下步骤: 1. 创建一个MFC应用程序项目,并设置好相关的项目属性。 2. 在应用程序的代码中包含"afxwin.h"头文件,并在初始化阶段通过调用MFStartup函数初始化Media Foundation库。 3. 使用MFC提供的窗口类或控件类创建一个用于播放音视频的窗口。 4. 在应用程序的代码中,通过调用MFC提供的类方法,利用Media Foundation库加载、解析和播放音视频文件。 5. 通过调用MFC提供的类方法,可以实现对音视频的暂停、停止、快进、快退等操作。 6. 在应用程序退出时,通过调用MFShutdown函数清理Media Foundation库的资源。 总之,MFC是一个用于构建Windows桌面应用程序的框架,而Media Foundation是用于处理音频视频的多媒体框架。通过将MFC与Media Foundation结合起来使用,可以实现在MFC应用程序中对音频视频进行播放、录制等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值