/*
* 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.