Microsoft Media foundation概述(附实例)

2023-05-16

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft Media foundation概述(附实例) 的相关文章

  • 如何查询 Android MediaStore Content Provider,避免出现孤立图像?

    我正在尝试提供一个应用程序内活动 该活动显示照片缩略图 设备的媒体存储 并允许用户选择一个 用户做出后 选择后 应用程序会读取原始的全尺寸图像并对其进行处理 我正在使用以下代码创建一个Cursor覆盖外部的所有图像 贮存 public vo
  • 最大 CGFloat 值是否有一个常数?

    我需要创建一个 CGSize 来计算任意长度的任意文本的文本高度 UIKit 有一个很好的方法 sizeWithFont constrainedToSize 并且我的文本仅受宽度限制 但不受高度限制 为此 我需要设置高度的最大可能 CGFl
  • C# 控制电脑音量

    有没有办法在 C 中控制计算机的实际音量并将其显示在垂直轨迹栏中 我几乎已经尝试了一切 但一定有一些东西我错过了 Thanks 您是否尝试过使用winmm dll通过 p Invoke 库 这就是本文所推荐的 http www dreami
  • 如何使 JavaFX MediaView 拉伸媒体以填充父容器?

    我试图使视频的尺寸自动拉伸并填充 MediaView 并保持视频的原始宽高比 基本上 我希望我的 MediaPlayer 在调整大小等时适合父容器 就像几乎所有视频播放器一样 如果有人能够阐明如何实现这一目标 我们将不胜感激 谢谢 下面是拉
  • 未调用未捕获的异常处理程序

    我正在尝试捕获 Mac 应用程序上的异常 以便可以将它们记录在自定义日志文件中 我正在像这样实现异常处理程序 void uncaughtExceptionHandler NSException exception NSLog It Work
  • 为所有浏览器嵌入 Windows Media Player

    Edit 这个问题是2008年写的 相当于3个互联网时代之前的事了 如果这个问题仍然与您的环境相关 请接受我的哀悼 其他人都应该转换成一种格式您的浏览器支持 https videojs com html5 video support 如果需
  • 扬帆证券:如何辨别股票基本面的好坏?

    怎样区别股票根本面的好坏 教你轻松区别优劣股 1 市盈率 市盈率是指一个公司股票的价格相对于其每股收益的比率 是衡量一家公司是否被高估或轻视的重要方针之一 2 市净率 市净率指的是每股股价与每股净资产的比率 一般来说市净率较低的股票 出资价
  • 扬帆证券:A股高股息资产“画像”:连续数年跑赢大盘

    近期A股分红 大方 股息率较高的板块再次引起关注 走势显着强于同期大盘 并继续遭到商场追捧 有专家在接受证券时报记者采访时以为 近年A股商场高股息财物受捧背面 有多种要素在发挥作用 包含高股息财物本身具有的出资优势 微观经济布景 出资者心态
  • 对中国手机作恶的谷歌,印度CEO先后向三星和苹果低头求饶

    日前苹果与谷歌宣布合作 发布了 Find My Device Network 的草案 旨在规范蓝牙追踪器的使用 在以往苹果和谷歌的生态形成鲜明的壁垒 各走各路 如今双方竟然达成合作 发生了什么事 首先是谷歌安卓系统的市场份额显著下滑 数年来
  • 将图片保存到媒体库中的自定义文件夹

    WhatsApp 现在将图片保存到媒体库中名为 WhatsApp 的自定义文件夹中 WhatsApp 是否使用未记录的 API 或者每个开发人员都可以这样做吗 现在我只知道可以将图片保存到 相机胶卷 或 保存的图片 中 WhatsApp 似
  • Phonegap 调用 playAudio() 30 到 40 次后声音停止播放

    在我的应用程序中 我在鼠标单击时给出了声音响应 这就是我所做的 我已经这样调用函数了
  • 使用 AUGraph 播放麦克风的声音

    当我使用AUGraph实现麦克风播放声音时 我有一个问题 在设备 iphone 3g 中 我只能从耳机的右侧听到 但在模拟器中效果很好 我可以从耳机的两侧听到声音 这是我用来将输入连接到输出的代码 AUGraphConnectNodeInp
  • Android 在来电时关闭媒体服务

    我对 android 和 java 真的很陌生 我正在制作一个应用程序 它有一个媒体服务 我希望媒体在来电时停止或暂停 这是我的媒体服务代码 公共类 ServiceMusic 扩展服务 MediaPlayer music Override
  • Java音乐播放器:歌曲信息和播放[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在Android中 我们可以使用媒体播放器在设备上播放歌曲 并使用光标来获取曲目信息 操作系统跟踪的信
  • 使用 PATH 列出 MediaStore 中的所有音乐

    好吧 我已经在这个项目上工作了几天 我的大部分时间都在研究如何在列表视图或其他东西中列出设备上的所有音乐 我已经搜索了几天并且这简直要了我的命 我确实一度非常接近显示一个文件夹中的所有音乐 但由于大多数人都会有像 artiest 和专辑这样
  • Objective C 中 NSArray、NSDictionary 等类的可变和不可变版本背后的逻辑是什么?

    为什么 Objective C 中常见的集合类 如 NSString NSArray NSDictionary 等 有可变版本和不可变版本 分别定义它们背后的逻辑是什么 性能 内存管理还是其他什么 类的不可变版本之所以存在 是因为不可变对象
  • Swift 计算属性上的 KVO

    Swift 中计算属性上的 KVO 可行吗 var width 0 var height 0 private var area Double get return with height self addOberser self forKe
  • 图像从部署到heroku的django web应用程序中消失

    我正在开发一个 django 项目 使用 django Rest 框架编写 REST API 以在 Android 应用程序中使用它们 我的主要想法是在 Django 中开发后端 在 Android 中开发前端 项目部署在 Heroku 上
  • 如何在Unity中使用MediaCapture类访问相机预览帧?

    我正在尝试在 Unity 应用程序的脚本中访问 Hololens 的相机预览帧 但遇到一些问题 我想使用 MediaCapture 类访问相机预览 我知道它可以在 UWP 应用程序中实现 但我想在 Unity 中实现 在 UWP 应用程序中
  • 在 Android 上的测试用例之外运行 ExtractDecodeEditEncodeMuxTest

    我正在尝试添加在 Android 上提取 解码 编辑 编码和混合视频的功能 因此 我发现了一些非常有用的实现 它是Android CTS的一部分ExtractDecodeEditEncodeMuxTest https android goo

随机推荐

  • TensorFlow——训练自己的数据(三)模型训练

    参考 xff1a Tensorflow教程 猫狗大战数据集 文件training py 导入文件 span class hljs import span class hljs keyword import span os span span
  • TensorFlow——训练自己的数据(四)模型测试

    参考 xff1a Tensorflow教程 猫狗大战数据集 测试一张图片 获取一张图片 函数 xff1a def get one image train 输入参数 xff1a train 训练图片的路径返回参数 xff1a image xf
  • linux BST树算法实现

    简介 BST就是二叉搜索树 Binary Search Tree 的简称 xff0c 因此毫无疑问BST也是二叉树 xff0c 对于二叉树而言 xff0c 和线性表的实现一样 xff0c 我们也必须设计其数据节点 xff0c 而且也必须设计
  • TensorFlow——训练自己的数据——CIFAR10(一)数据准备

    参考教程 Tensorflow教程 xff1a 深度学习 图像分类 CIFAR10数据集 Reading Data 所用函数 span class hljs function span class hljs keyword def span
  • TensorFlow:Object_Detection_API在Windows10上的配置

    安装 假设已配置完tensorflow xff0c 并安装好Anaconda3 4 2 0 xff08 此版本为python3 5 xff09 从github下载models tensorflow models Protobuf 编译 pr
  • TensorFlow Object Detection API 在Windows10和Ubuntu上的配置

    前言 好久没用博客了 xff0c 因为服务器原因重装了好几次 xff0c tensorflow也一直跟着重装 xff0c 这篇博文相比上一篇会更完善点 xff0c 用的版本也会新一些 主要记录在win10和ubuntu上配置Tensorfl
  • 那一年读过的技术经典书

    转载请注明 xff1a http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 xff0c 总结起来读过的书并不算多 xff0c 而且主要集中在大四的时期读的 x
  • Bert: 双向预训练+微调

    最近要开始使用Transformer去做一些事情了 xff0c 特地把与此相关的知识点记录下来 xff0c 构建相关的 完整的知识结构体系 以下是要写的文章 xff0c 文章大部分都发布在公众号 雨石记 上 xff0c 欢迎关注公众号获取最
  • Federated Learning: 问题与优化算法

    工作原因 xff0c 听到和使用Federated Learning框架很多 xff0c 但是对框架内的算法和架构了解不够细致 xff0c 特读论文以记之 这个系列计划要写的文章包括 xff1a Federated Learning 问题与
  • DIN: 阿里点击率预估之深度兴趣网络

    广告推荐算法系列文章 xff1a 莫比乌斯 百度的下一代query ad匹配算法百度凤巢分布式层次GPU参数服务器架构DIN 阿里点击率预估之深度兴趣网络DIEN 阿里点击率预估之深度兴趣进化网络 本文的知识点来源于参考文献 1 xff0c
  • DIEN: 阿里点击率预估之深度兴趣进化网络

    广告推荐算法系列文章 xff1a 莫比乌斯 百度的下一代query ad匹配算法百度凤巢分布式层次GPU参数服务器架构DIN 阿里点击率预估之深度兴趣网络基于Delaunay图的快速最大内积搜索算法DIEN 阿里点击率预估之深度兴趣进化网络
  • 概率矩阵分解模型 PMF

    本文是论文 一种结合推荐对象间关联关系的社会化推荐算法 的笔记 xff08 上 xff09 因为对其中的概率矩阵分解 Probabilistic Matrix Factorization PMF 不够了解 xff0c 因而我先去脑补了PMF
  • 卷积神经网络

    卷积神经网络 转载请注明 xff1a http blog csdn net stdcoutzyx article details 41596663 自今年七月份以来 xff0c 一直在实验室负责卷积神经网络 xff08 Convolutio
  • linux系统非线性结构的遍历算法

    介绍 非线性结构的二叉搜索树 xff08 BST xff09 可以进行各种不同方式的遍历 xff0c 所谓遍历 xff0c 就是环游树中的每一个节点 xff0c 然后根据我们的需要对这些节点做某种处理 树的遍历方式主要有以下几种 xff08
  • DeepID人脸识别算法之三代

    DeepID人脸识别算法之三代 转载请注明 xff1a http blog csdn net stdcoutzyx article details 42091205 DeepID xff0c 目前最强人脸识别算法 xff0c 已经三代 如今
  • 理解dropout

    理解dropout 开篇明义 xff0c dropout是指在深度学习网络的训练过程中 xff0c 对于神经网络单元 xff0c 按照一定的概率将其暂时从网络中丢弃 注意是暂时 xff0c 对于随机梯度下降来说 xff0c 由于是随机丢弃
  • 深度卷积对抗生成网络(DCGAN)

    本文是参考文献 1 的论文笔记 卷积神经网络在有监督学习中的各项任务上都有很好的表现 xff0c 但在无监督学习领域 xff0c 却比较少 本文介绍的算法将有监督学习中的CNN和无监督学习中的GAN结合到了一起 在非CNN条件下 xff0c
  • 看图说话——CNN和LSTM的联合应用

    看图说话是深度学习波及的领域之一 其基本思想是利用卷积神经网络来做图像的特征提取 xff0c 利用LSTM来生成描述 但这算是深度学习中热门的两大模型为数不多的联合应用了 本文是参考文献 1 的笔记 xff0c 论文是比较早的论文 xff0
  • 机器学习经典书籍小结

    机器学习经典书籍小结 转载本博客请注明链接 xff1a http blog csdn net xinzhangyanxiang article details 9069045 博客第一篇文章 1 是转载的 xff0c 也算是开始写博客不经意
  • Microsoft Media foundation概述(附实例)

    Microsoft Media Foundation是微软新一代多媒体开发平台 xff0c 用以取代原来的Directshow xff0c 为了满足现在多媒体播放的高清晰 xff0c 高品质 xff0c 颜色管理 xff0c 以及充分利用硬