使用 Microsoft Media Foundation 从文件播放视频
Posted
技术标签:
【中文标题】使用 Microsoft Media Foundation 从文件播放视频【英文标题】:Playing a video from file using Microsoft Media Foundation 【发布时间】:2013-02-12 09:07:21 【问题描述】:我正在尝试使用 Windows Media Foundation 播放一个简单的视频。
不幸的是,关于如何执行此操作的文档似乎很少。
实际上我正在使用sharpDX 绑定来完成此操作。但我也会对 C++ 示例感到高兴。
这是我到目前为止尝试遵循本教程的内容 http://msdn.microsoft.com/en-us/library/windows/desktop/ms703190(v=vs.85).aspx
MediaManager.Startup();
MediaSession mediaSession;
MediaFactory.CreateMediaSession(null, out mediaSession);
SourceResolver sourceResolver;
MediaFactory.CreateSourceResolver(out sourceResolver);
ComObject comObject;
ObjectType objectType;
sourceResolver.CreateObjectFromURL("Jack.mp4", (int) SourceResolverFlags.None, null, out objectType, out comObject);
Topology topology;
MediaFactory.CreateTopology(out topology);
这运行没有错误,但我还没有想出如何将它链接到窗口或纹理,以便我可以实际看到视频。
【问题讨论】:
【参考方案1】:Windows SDK 中有多个Media Foundation Samples(C++)在:
\Samples\multimedia\mediafoundation例如,MFPlayer2 Sample 创建将其链接到视频窗口的播放器:
HRESULT MFPlayer2::Initialize(HWND hwndVideo)
HRESULT hr = S_OK;
SafeRelease(&m_pPlayer);
hr = MFPCreateMediaPlayer(
NULL,
FALSE, // Start playback automatically?
0, // Flags
this, // Callback pointer
hwndVideo, // Video window
&m_pPlayer
);
【讨论】:
在较新的 API(媒体会话)上,您可以通过MFCreateVideoRendererActivate
连接您的windnow,请参阅Creating Playback Topologies(在底部)。
..这对我来说相当复杂且难以理解。所有这些拓扑、流描述符、源解析器等......
这是你切换到 DirectShow API 的地方(这不是简单的,但仍然更广泛使用)。【参考方案2】:
如果您可以放弃对 Windows 7 的支持,请使用 IMFMediaEngine 而不是会话。
API documentation, sample code.
不要忘记将 D3D11_CREATE_DEVICE_VIDEO_SUPPORT flag 添加到您的 D3D 设备,创建 IMFDXGIDeviceManager,并将管理器传递给 MF_MEDIA_ENGINE_DXGI_MANAGER 属性中的引擎。
【讨论】:
以上是关于使用 Microsoft Media Foundation 从文件播放视频的主要内容,如果未能解决你的问题,请参考以下文章
使用 Microsoft Media Foundation 从文件播放视频
如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?
microsoft azure Media Services 媒体服务解决方案
隐藏MediaPlayer控件(Microsoft Media Platform Player框架)
对象 ID 为“XXX”的客户端“XXX”无权执行操作“Microsoft.Media/mediaServices/transforms/write”