音视频播放 via Media Foundation I

Media Foundation 简介

Media Foundation (简称 MF)是微软在 Windows Vista上 推出的新一代多媒体应用库,目的是提供 Windows 平台一个统一的多媒体影音解决方案,开发者可以通过 MF 播放视频或声音文件、进行多媒体文件格式转码,或者将一连串图片编码为视频等等。

MF 是 DirectShow 为主的旧式多媒体应用程序接口的替代者与继承者,在微软的计划下将逐步汰换 DirectShow 技术。MF 要求 Windows Vista 或更高版本,不支持较早期的 Windows 版本,特别是 Windows XP。

MF 长于高质量的音频和视频播放,高清内容(如 HDTV,高清电视)和数字版权管理(DRM)访问控制。MF 在不同的 Windows 版本上能力不同,如 Windows 7 上就添加了 h.264 编码支持。Windows 8 上则提供数种更高质量的设置。

MF 提供了两种编程模型,第一种是以 Media Session 为主的 Media pipeline 模型,但是该模型太过复杂,且曝露过多底层细节,故微软于 Windows 7 上推出第二种编程模型,内含 SourceReaderTranscode APISinkWriterMFPlay 等高度封装模块,大大简化了 MF 的使用难度。

# 本文使用了第一种(复杂的)编程模型。

Media Foundation 播放音视频

播放流程图

MF session play audio

播放代码

以下是整个播放过程的概要代码,略去错误处理和一些函数的具体实现:

hr = MFCreateMediaSession(NULL, &m_pSession);
hr = m_pSession->BeginGetEvent((IMFAsyncCallback*)this, NULL);

hr = MFCreateSourceResolver(&pSourceResolver);
hr = pSourceResolver->CreateObjectFromURL( sURL,
        // indicate that we want a source object, and pass in optional source search parameters
        MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, 
        NULL, &objectType, &pSource );
        
hr = MFCreateTopology(&m_pTopology);
for (DWORD i = 0; i < nSourceStreams; i++) {
   
   
    hr = pPresDescriptor->GetStreamDescriptorByIndex(i, &streamSelected, &pStreamDescriptor);
    hr = CreateSourceStreamNode(pPresDescriptor, pStreamDescriptor, pSourceNode); 
    hr = CreateOutputNode(pStreamDescriptor, m_videoHwnd, pOutputNode);
    hr = m_pTopology->AddNode(pSourceNode);
    hr = m_pTopology->AddNode(pOutputNode);
    hr = pSourceNode->ConnectOutput(0, pOutputNode, 0);
}

hr = m_pSession->SetTopology(0, pTopology);
hr = m_pSession->Start(&GUID_NULL, &varStart);
// playing...

hr = m_pSession->Stop();
hr = m_pSession->Close();
m_pSession->Shutdown();

CPlayer::OpenURL 函数

创建 Media SessionTopology(相当于 DShow 的 Filter Graph)。

HRESULT CPlayer::OpenURL(PCWSTR sURL)
{
   
   
    CComPtr<IMFTopology> pTopology = NULL;
    HRESULT hr = S_OK;
    MFUtil::AutoLock lock(m_critSec);
    
    if (m_pSession)
        Stop();
        
    hr = CreateSession();
    GOTO_IF_FAILED(hr);
    
    hr = m_topoBuilder.RenderURL(sURL, m_hwndVideo);
    GOTO_IF_FAILED(hr);
    
    pTopology = m_topoBuilder.GetTopology();
    hr = m_pSession->SetTopology(0, pTopology);
    GOTO_IF_FAILED(hr);
    
    // If a brand new topology was just created, set the player state to "open pending"
    // - not playing yet, but ready to begin.
    if (m_state == PlayerState_Ready)
        m_state = PlayerState_OpenPending;
        
    return S_OK;
    
RESOURCE_FREE:
    if (FAILED(hr))
        m_state 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值