为什么WPF MediaElement在副显示器上无法工作?

22

我的应用程序使用WPF MediaElement播放视频(MOV文件)。在主监视器上播放良好,但当窗口移动到次要监视器时会冻结。

我已经尝试了以下方法,但没有成功:

  1. 在次要监视器上启动应用程序
  2. 交换主要和次要监视器(问题转移到新的次要监视器)

当应用程序窗口跨越两个监视器时,它能正确工作,但是一旦完全位于次要监视器中,视频就会冻结。一旦处于这种状态,将应用程序移回主监视器也无济于事(加载新视频也没有帮助)。

监视器排列方式使得坐标始终为正值(两个监视器均为1920x1080,次要监视器原点位于1920,0)。

其他人有没有遇到过这个问题或找到解决办法?

编辑

有没有人在多个监视器上使用 WPF MediaElement ?


可能是GPU没有加速第二个显示器吗?这在许多台电脑上都一致吗,还是只有一台电脑出现了这种情况? - ChrisF
目前只在一台笔记本电脑上尝试过。在我的正常配置中,辅助显示器是笔记本电脑屏幕。如果我将外部显示器设置为辅助显示器,问题仍然存在。顺便说一下,Windows Media Player在主显示器和辅助显示器上播放同一部电影时都能正常工作。 - grantnz
WPFMediaKit 也可以在两个显示器上使用... - grantnz
找到了另一台笔记本电脑,它没有这个问题。我的笔记本电脑从未找到解决方案。 - grantnz
我可以确认这个 bug。我正在使用 MediaElement 播放视频,但它总是在窗口生成到第二个显示器时冻结。 - Jippers
2个回答

31

.NET Framework 4.0中, 这仍然是一个已知的问题,微软描述为"当WPF和底层的WMP控件之间需要重新同步时,会发生显示更改"。这种情况发生在 H.264 编解码视频文件中。


以下是三种解决方法:

1. 对包含 MediaElement 控件的窗口使用软件渲染

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
        if (hwndSource != null)
        {
            var hwndTarget = hwndSource.CompositionTarget;
            if (hwndTarget != null) hwndTarget.RenderMode = RenderMode.SoftwareOnly;
        }
}

然而,这并没有使用GPU和显存,可能会减慢视频播放速度。


2. 将至少1个像素重叠到主显示器上

例如,假设主屏幕在左侧,而MediaElement填充整个窗口。在窗口的构造函数中,假设Rect bounds表示辅助监视器的边界,请使用。

this.Left = bounds.Left - 1;
this.Width = bounds.Width;
this.Top = bounds.Top;
this.Height = bounds.Height;
所以,MediaElement在主监视器上有1个像素的重叠,并且它能够正常播放H.264视频文件。

3. 使用除微软媒体基础编解码器之外的其他MP4编解码器

下载一个名为“Win7DSFilterTweaker”的工具来禁用Media Foundation的“MP4”播放。 安装另一个MP4编解码器,例如ffshow。


在这篇文章中,你引用了MS的一些内容。那个引用的参考文献是什么?你知道这个问题是否已经在.NET 4.5.x中得到解决了吗? - Brannon
1
显然在.NET 4.5.x中没有固定 -- 我现在正在遇到这个问题。 - G. Stewart
显然在.NET 6中没有修复。 - nevermind

1

检查事件:MediaOpened,MediaEnded和MediaFailed是否仍在被触发。 我认为不会,因为这是一个已知问题,该控件“忽略”第二个监视器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接