Microsoft Media Foundation是微软新一代多媒体开发平台,用以取代原来的Directshow,为了满足现在多媒体播放的高清晰,高品质,颜色管理,以及充分利用硬件加速等功能而建立的新一代开发平台。本文概述了Media Foundation的结构和相关信息,最后附上一个再次基础编写的一个视频播放器,由于时间的原因,视频播放器的功能并不完整,比如,所建立的时间线还没有添加插入播放时间的功能。但是这不影响我们了解和学习Media Foundation。

正如微软给我们的开发文档一样,我们首先应该了解一些基础知识,这对于我们学习很有帮助。首先是流,流的概念很广泛,基本意义也就是按一定序列(顺序)的数据,比如,网络传输有数据流。在Media Foundation中,就是一定序列的媒体数据。然后是压缩,压缩从字面意思也可以明白,就是通过一定的算法重新保存数据或剔除一些不重要的数据信息,以减少数据的大小,压缩分为有损压缩和无损压缩,压缩的过程也就是我们常说的编码,反过来的过程就是解码。第三,容器(container),对于一个已经编码的流,我们不可能直接存储为一个文件,因为,当我们解码的时候,就可能不知道应该用何种解码器,于是,通过一个容器,来保存了一些文件头,用来描述我们编码的数据,那么在解码的时候,就可以从文件头中读取信息,正确解码,如下图(来自msdn):

这个是一个典型的容器结构,可以看见视频数据和音频数据交错存储,我们Media Foundation的MedaSource的任务就是解析文件头,然后对交错的数据分布解析为音频流和视频流,然后交由MFT。容器其实离我们不远,就在我们身边,例如,我们常常说的媒体文件的“格式”,其实指的是容器格式,如,MP4,avi,等等,其实指的是容器格式,也就是说,媒体文件的扩展名标明了它使用的容器,这个概念要和我们说的音频格式和视频格式要分开。最后就是格式,刚刚已经说了要和容器格式分开,那么,实际说的视频格式和音频格式,应该是只它的无压缩格式或是压缩格式,具体的,无压缩格式具体有哪些格式,可以在msdn Media Foundation章节中可以查到,有表列出,对于压缩格式,也就是编码格式,如,MP4的编码格式有H.264格式。所以,我们进行这方面的开发应该要将这些概念分清楚。

Media Foundation有两个编程模型,如下图(来自MSDN):

本文主要是针对基于Media Foundation控制层的编程模型的分析。右边的模型适用于媒体文件的播放,右边的模型适用于要对媒体数据的访问。

由上图可以看到,程序通过Medal Session来控制管道中数据的流动,也就是说,Media Foundation控制管道的,管道上面呢有一些节点(node)可以分为三类,源节点,转换节点,Sink节点。下面就以MSDN中提供的基本播放框架的程序来说明。

在前面也有提到,源节点的作用就是解析一个媒体的文件头,读取相关信息,如流的数目,每个流的格式等等。然后对文件进行解析,产生数据流,交给下一个节点。这里呢,在具体一点描述:

  HRESULT hr = MFCreateSourceResolver(&pSourceResolver);if (FAILED(hr)){goto done;}// Use the source resolver to create the media source.// Note: For simplicity this sample uses the synchronous method to create // the media source. However, creating a media source can take a noticeable// amount of time, especially for a network source. For a more responsive // UI, use the asynchronous BeginCreateObjectFromURL method.hr = pSourceResolver->CreateObjectFromURL(sURL,                       // URL of the source.MF_RESOLUTION_MEDIASOURCE,  // Create a source object.NULL,                       // Optional property store.&ObjectType,        // Receives the created object type. &pSource            // Receives a pointer to the media source.);if (FAILED(hr)){goto done;}// Get the IMFMediaSource interface from the media source.hr = pSource->QueryInterface(IID_PPV_ARGS(ppSource));
MFCreateSourceResolver这个函数就会查找注册表(有规定的目录,具体自己查),通过文件的扩展名,找到相应的处理程序,建立Source对象并返回pSource接口指针。通过这个接口指针,就可以获取有关这个文件的信息,然后创建一个管道Topology,创建一个源节点,将这些信息给源节点,再把这个节点给Topolgy。如下:
 HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &pNode);if (FAILED(hr)){goto done;}// Set the attributes.hr = pNode->SetUnknown(MF_TOPONODE_SOURCE, pSource);if (FAILED(hr)){goto done;}hr = pNode->SetUnknown(MF_TOPONODE_PRESENTATION_DESCRIPTOR, pPD);if (FAILED(hr)){goto done;}hr = pNode->SetUnknown(MF_TOPONODE_STREAM_DESCRIPTOR, pSD);if (FAILED(hr)){goto done;}// Add the node to the topology.hr = pTopology->AddNode(pNode);

这时候,我们再创建一个输出节点,首先创建一个 Activation Objects对象,并返回 IMFActivate 接口,它是一个帮助对象,用于建立Sink,SInk我们可以理解为使用已经解码的数据产生图像及音频的一个节点:

 HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);if (FAILED(hr)){goto done;}// Set the object pointer.hr = pNode->SetObject(pActivate);if (FAILED(hr)){goto done;}// Set the stream sink ID attribute.hr = pNode->SetUINT32(MF_TOPONODE_STREAMID, dwId);if (FAILED(hr)){goto done;}hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE);if (FAILED(hr)){goto done;}
hr = pTopology->AddNode(pNode);

设置节点的信息,然后添加到管道。

接着是将源节点和输出节点连接:

 hr = pSourceNode->ConnectOutput(0, pOutputNode, 0);
最后,将这个管道给Media Session:
 hr = m_pSession->SetTopology(0, pTopology);
这个时候,我们就可以利用Media Foundation来控制如播放,暂停,停止等操作了。但是大家也许奇怪,为什么没有转换节点,转换节点的作用其实就是解码,我们并没有设置转换节点,可是怎么播放了呢。

这里就有一个概念,就是partial Topology,这个技术,Media Session会根据你的源节点的输出格式来自动到注册表中(固定位置,自己了解)查找解码器,然后可以接受源节点的输出格式的解码器,然后Media Session将MFT转换节点添加到管道中。所以我们尽管没有设置解码器,但是照样播放了,就是这个原因。

说到这里呢,Media Session的播放模型就是这样的。下面还有补充说明:

Media Foundation在不同的系统平台上,功能有所不同,但是最低要求是Vista系统以上,越往后,系统平台越新,功能也更加强大。Media Foundation默认支持的格式非常有限,在MSDN中有说明,对于如RM,RMVB,FLV等格式,默认的Media Foundation不支持,如果要支持,必须要我们自己编写插件,并注册到系统,才可以对别的格式支持。如,MP4,AVI,这样的格式也支持,但是我们前面说过,这些知识容器格式,但是如果一个文件的编码器格式与Media Foundation不支持,也不能播放,在Media Foundation中,MP4格式的编解码器为H.264。如果要支持别的编码器,也需要自己编写插件。

基本情况就说明到这些,下面是一个实例图:

该程序在win7系统,vs2010下基于对话框程序框架编写。

资源链接地址:http://download.csdn.net/detail/xinzhiyounizhiyouni/6398691

Microsoft Media foundation概述(附实例)相关推荐

  1. Microsoft Media Foundation官方文档翻译(20)《Stream Subtype GUIDs》《...

    官方英文文档链接:https://docs.microsoft.com/en-us/windows/desktop/medfound/stream-subtype-guids 基于05/31/2018 ...

  2. Microsoft Media Foundation官方文档翻译(一)《Microsoft Media Foundation》

    官方英文文档链接:https://docs.microsoft.com/en-us/windows/desktop/medfound/microsoft-media-foundation-sdk 基于 ...

  3. Windows Workflow Foundation(1)- Windows Workflow Foundation 概述

    Windows Workflow Foundation(第一章)- Windows Workflow Foundation 概述 工作流概述 活动(Activity)是工作流的基本单元,用于描述实际进 ...

  4. Microsoft Team Foundation Server 2010安装指南

    索引: 介绍 安装操作系统 准备安装过程中的需要的用户账户 安装IIS 7.0 安装SQL Server 2008 安装SQL Server 2008 SP1补丁 安装TFS 2010 配置TFS 2 ...

  5. Qt 中使用 VLC-Qt 播放网络视频流(附实例)

    VLC-Qt库:一个在libVLC基础上结合了Qt框架的开源库.它提供了媒体播放的视频.音频处理控制的核心类,并提供基于QWidget和QML的GUI框架.效果图: 官网地址:Quickly crea ...

  6. 关于Windows media foundation打开摄像头无法获取到数据问题

    之前开发应用的时候一直使用的是direct show接口,后面想着使用windows media foundation接口试试,结果始终获取不到数据,关键代码如下: 这里我采用的是异步的方式去读取数据 ...

  7. Media Foundation——媒体类型(1)

    Media Foundaton对象的属性和特性 每一个对象上的数据,都可通过"属性(Attributes)"和"特性(Properties)"来设置.描述.属性 ...

  8. redis详细介绍附实例代码--看一篇就够了

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html redis介绍详解附实例代码- ...

  9. vuex结合php,vuex中store的使用介绍(附实例)

    本篇文章给大家带来的内容是关于vuex中store的使用介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.状态管理(vuex)简介 vuex是专为vue.js应用程序 ...

最新文章

  1. 关于spring的p标签(转)
  2. php压缩文件 不能二次开发,PHP 'ZipArchive library is not enabled'异常的解决方法
  3. python开发小型数据库_python数据库编程小应用
  4. comparable和comparator比较
  5. 深度优先遍历算法-01小偷偷东西问题
  6. 洛谷2055 [ZJOI2009]假期的宿舍
  7. Sublime Text 3 快捷键总结(详细版本)
  8. 如何评价NVIDIA RTX 2080 Ti显卡?
  9. python学习笔记-Day5
  10. 在线图片坐标拾取工具
  11. C++ 引用以及和指针的区别
  12. 30天自制操作系统 pdf_30天自制操作系统-汇编实现初版镜像
  13. 小米无线路由器服务器用户名和密码忘了,小米路由器登陆入口用户名和密码指南...
  14. 马杰花总刘韧对话:机器人服务是元宇宙虚拟与现实的链接
  15. 有趣的 Google command line shell
  16. 21天攻克PET核心词汇,加油!
  17. map iterator it 的用法
  18. c# 时间格式化为英文_C# DateTime日期格式化
  19. 巧妙去除Word文档修订和批注帮助
  20. 微信小程序开发初学:图片组件 - image

热门文章

  1. 通过TrackPopupMenu函数弹出菜单
  2. FortiGate部分用户上网慢,丢包严重
  3. 九度_题目1388:跳台阶
  4. WD企业盘参数对照表
  5. poj pku 1673 EXOCENTER OF A TRIANGLE 三角形 垂心
  6. 「微服务系列」微服务框架的介绍
  7. php获取上传文件的临时位置,PHP上传 找不到临时文件夹的解决方法
  8. 一加支持鸿蒙吗,业界第一个支持华为鸿蒙,居然是一加手机掌门?那么……
  9. 有图有真相!华为P20系列才是俄罗斯之旅的最佳拍档
  10. PHP秒杀--消息队列实现及应用