2016-08-24 24 views
1

我需要一个非常简单的视频播放器在我的C#应用​​程序。它只需从文件中循环播放视频即可。由于我正在开发WPF应用程序,因此我尝试使用System.Windows.Controls.MediaElement。它具有我需要的所有功能,但功能非常差:我已经播放了一些完整的高清视频,并且始终处于滞后和尖峰状态。如何使MediaElement与AxWindowsMediaPlayer一样好?

为了确保它不是我的应用程序问题,我创建了2个测试应用程序。第一个在WinForms无边界1920x1080窗口中只有AxWMPLib.AxWindowsMediaPlayer控制权。第二个在与System.Windows.Controls.MediaElement相同尺寸的无边框WPF窗口中。

然后我在两位玩家身上运行2个视频。以下是他们的规格:

1:1920x1080, 12000kb/s, 25 FPS, wmv

2:1920x1080, 5730kb/s, 25 FPS, mp4

AxWindowsMediaPlayer一切都看起来不错。但是MediaElement似乎会丢失一些帧并忽略垂直同步(在快速场景更改期间可能会看到另一帧的一部分)。所以,这是完全不合适的,不应该是这样,但我没有发现任何关于微软官方文档中的问题(他们只建议使用MediaElement而不是AxWindowsMediaPlayerWPF应用程序中)。是否有可能使其工作更顺利或使用额外的WinFormsFormAxWindowsMediaPlayer是唯一的解决方案?

回答

2

It was written over five years ago(在线索中查找James Dailey的消息),可能有一些改进,但总体而言,我认为这些陈述仍然保持良好的信誉。我会拿起一些相关的报价:

正如你所知,WPF环境是从头开始构建的,为开发人员提供了一个非常丰富的“图形优先”环境。 MediaElement特别旨在让您可以将视频与各种其他UI组件无缝地混合。此解决方案将为您提供无闪烁的“正在寻找视频”解决方案。最好的部分是你可以在C#中完成所有这些。这个解决方案的不好之处在于MediaElement不是为显示时间敏感的媒体内容而设计的。换句话说,MediaElement因放弃和延迟显示视频帧而臭名昭着。有一些方法可以减少这种如使用SD而不是HD内容,使用加速编解码器的视频等

也:

不幸的是,你真的不能告诉WPF的MediaElement永不落帧。我们用于这类问题的术语是“不同的时钟”。在这种情况下,WPF正在以一定的速率更新屏幕(时钟1)。 MediaElement(基于WMP)以略微不同的速率启动视频帧(时钟2)。鉴于基础技术,目前没有办法同步这两个时钟并迫使它们以相同的速率“打勾”。由于显示器只会根据WPF时钟进行更新,因此可能会在时钟滴答之间将多帧视频从MediaElement发送到WPF。因此,MediaElement可能会丢帧。这是多媒体开发中非常普遍的问题,并没有简单的解决方案。

Windows Media Player使用Media Foundation和DirectShow API,为高质量视频体验提供媒体播放功能。