音视频播放 via Media Foundation II
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 上推出第二种编程模型,内含 SourceReader、Transcode API 、SinkWriter 及 MFPlay 等高度封装模块,大大简化了 MF 的使用难度。
# 本文使用了第二种(简单的)编程模型。
Media Foundation 播放音视频
播放流程图

播放代码
以下是整个播放过程的概要代码,略去错误处理和一些函数的具体实现:
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
hr = MFPCreateMediaPlayer(NULL, FALSE, 0, this, hwndVideo, &m_pPlayer);
// Create the object that manages to audio session.
hr = CAudioSessionVolume::CreateInstance(m_hwndEvent, WM_AUDIO_EVENT, &m_pVolume);
hr = m_pPlayer->CreateMediaItemFromURL(sURL, FALSE, 0, NULL);
hr = m_pPlayer->SetMediaItem(pEvent->pMediaItem);
hr = m_pPlayer->InsertEffect(pMFT, TRUE);
hr = m_pVolume->SetVolume(fLevel);
hr = m_pPlayer->Play();
// Playing ...
hr = m_pPlayer->SetPosition(MFP_POSITIONTYPE_100NS, &var); // Seek
hr = m_pVolume->SetMute(TRUE); // Mute
hr = m_pVolume->SetMute(FALSE); // Unmute
// Playing ...
hr = m_pPlayer->Stop();
hr = m_pPlayer->Shutdown();
CoUninitialize();
MFPlayer 类
Wrap 了 IMFPMediaPlayer,封装无止境 0_0
class MFPlayer : public IMFPMediaPlayerCallback
{
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID iid, void** ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IMFPMediaPlayerCallback methods
void STDMETHODCALLTYPE OnMediaPlayerEvent(MFP_EVENT_HEADER * pEventHeader);
// Playback
HRESULT OpenURL(const WCHAR *sURL);
HRESULT Play();
HRESULT Pause();
HRESULT Stop();
HRESULT Shutdown();
HRESULT GetState(MFP_MEDIAPLAYER_STATE *pState);
// Video
HRESULT HasVideo(BOOL *pfHasVideo);
HRESULT UpdateVideo(</

最低0.47元/天 解锁文章
6658

被折叠的 条评论
为什么被折叠?



