为什么WPF MediaElement无法在辅助监视器上运行?

gra*_*tnz 19 wpf multiple-monitors mediaelement

我的应用程序使用WPF MediaElement来播放视频(MOV文件).这在主监视器上播放时效果很好,但在窗口移动到辅助监视器时会冻结.

我试过以下没有成功:

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

当应用程序窗口跨越两个监视器时,它可以正常工作,但只要它完全位于辅助监视器内,视频就会冻结.一旦处于此状态,将应用程序移回主监视器将无济于事(并且加载新视频也无济于事).

安排监视器使坐标始终为正(两个监视器均为1920x1080,辅助监视器原点为1920,0).

有没有其他人看到这个问题和/或找到了修复?

编辑

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

det*_*ale 26

这仍然是.NET Framework 4.0中的一个已知问题,MS将其描述为"当显示更改发生时,WPF与底层WMP控件之间的同步必须重新同步时会出现问题." 它发生在H.264编解码器视频文件中.


这里有3个解决方法.

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

然而,这不利用GPU和图形内存,并且可能减慢视频播放速度.


2.在主显示屏上重叠至少1个像素

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

this.Left = bounds.Left - 1;
this.Width = bounds.Width;
this.Top = bounds.Top;
this.Height = bounds.Height;
Run Code Online (Sandbox Code Playgroud)

因此MediaElement在主显示器上重叠了1个像素宽,然后它就能正常播放H.264视频文件.


3.使用MS的Media Foundation编解码器以外的其他MP4编解码器

下载工具"Win7DSFilterTweaker"以禁用Media Foundation"MP4"播放.例如,安装另一个MP4编解码器ffshow.