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

时间:2010-11-15 22:51:07

标签: wpf mediaelement multiple-monitors

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

我尝试了以下但没有成功:

  1. 在辅助监视器上启动应用程序
  2. 交换主要&辅助监视器(问题转移到新的辅助监视器)
  3. 当应用程序窗口跨越两个监视器时,它可以正常工作,但只要它完全位于辅助监视器内,视频就会冻结。一旦处于此状态,将应用程序移回主监视器将无济于事(并且加载新视频也无济于事。)

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

    是否有其他人看到此问题和/或找到了修复程序?

    修改

    是否有人将WPF MediaElement与多个监视器一起使用???

2 个答案:

答案 0 :(得分:25)

这仍是 .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;
        }
}

然而,这并没有使用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。使用MS的Media Foundation编解码器以外的其他MP4编解码器

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

答案 1 :(得分:1)

检查是否仍有事件:MediaOpened,MediaEnded和MediaFailed。 我假设不是因为这是一个已知的问题,这个控件“忽略”第二个监视器。