【Media Foundation】简单实例 - 使用Media Session来播放文件

/*
* blackboy   psyc209@163.com
* QQ群: 135202158
* 转载请注明作者及出处
*/


参考MSDN官方的页面:http://msdn.microsoft.com/en-us/library/ms703190(v=vs.85)


本文详细演示了如何使用Media Foundation中的Media Session对象来播放媒体文件。也就是不自己编写/自定义任何的Media Foundation组件,一切都是用现成的,以及让Media Foundation“自动完成”的(如Topology的解析)。Media Foundation的API会根据文件的路径或URL智能创建合适的media source组件,并会智能地在media source和音视频渲染器(renderer)之间添加合适的解码器等等。Topology中的数据流等任务由Media Session来处理。

这是最简单的开发任务。然而,如果要实现使用自定义的meida source或media transform组件这样的任务,可能不能使用Media Session。


预备知识

在阅读本主题之前,你需要熟悉以下MF概念:

  • Media Session
  • Source Resolver
  • Topologies
  • Media Event Generators
  • Presentation Descriptors

注意:此主题不描述如何播放被DRM保护的文件。关于MMF中DRM的相关信息,见 How to Play Protected Media Files

其实不太了解以上概念也没关系,通过这个小例子的动手实践,我们会对一些基本概念有个基本了解。


概述

以下对象用来和Media Session播放多媒体文件:

  • media source对象用来解析多媒体文件或其他媒体数据源。media source为文件中的每个音频或视频流创建一个steam对象。 Decoders把编码后的多媒体数据转换为非压缩视频和音频
  • Source Resolver从URL创建一个media source
  • EVR将视频渲染到屏幕上
  • SAR将音频渲染至扬声器或其他音频输出设备
  • Topology定义从media source至EVR和SAR的数据流
  • Media Session控制数据流,并发送状态数据到应用程序。下图展示了这个过程




step by step实例

大概了解一下概念,我们可以来进行实践了。我们主要将完成以下任务:

  • Media Foundation平台的初始化与关闭
  • 创建media session
  • 根据文件路径,(智能)创建(合适的)media source
  • 创建topology,添加media source、EVR/SAR(renderer)节点,并将其连接,此时的topology是一个partial topology
  • 将刚创建的topology关联到media session,内部的topology loader会给partial topology“智能地”加入所需的解码器等节点,使其成为一个complete topology
  • 获取和处理来自media session的事件
  • 用media session来控制播放,但不要直接操作media source
  • 程序结束,释放资源

1. 创建程序

我使用visual studio 2012创建了一个基于对话框的MFC项目。含有可缩放的边框、 最小化框。

再创建一个菜单,把对话框的菜单属性设为此菜单。

添加全局的播放核心类对象 

Core*	g_pCore = NULL;

在stdafx.h中添加要用到的头文件和类模板。头文件后面的注释说明了为什么需要它

#include <mfapi.h>	// MFStartup, mfplat.lib
#include <mfidl.h>	// MFCreateMediaSession, mf.lib
#include <evr.h>	// IMFVideoDisplayControl, strmiids.lib
#include <shlwapi.h>	// QITABENT, shlwapi.lib
#include <mferror.h>	// MF_E_ALREADY_INITIALIZED

template <class T> void SafeRelease(T **ppT)
{
    if (*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

#include "Core.h" // Core类头文件

配置项目属性,此项目需要链接以下Lib:

mfplat.lib; mf.lib; mfuuid.lib; strmiids.
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值