代码之家  ›  专栏  ›  技术社区  ›  grantnz

为什么WPF mediaellent不能在辅助监视器上工作?

  •  19
  • grantnz  · 技术社区  · 15 年前

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

    我尝试过以下方法,但没有成功:

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

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

    监视器的布置应确保坐标始终为正(两个监视器均为1920x1080,二次监视器原点为1920,0)。

    有没有其他人看到这个问题和/或找到解决方法?

    编辑

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

    2 回复  |  直到 15 年前
        1
  •  26
  •   NoWar    13 年前

    这仍然是一个众所周知的问题 .NET框架4.0 ,MS描述为 “当显示更改发生时,必须重新同步WPF和基础WMP控件之间的同步时,会出现此问题。” H.264编解码器视频文件就是这样。


    这里有3个解决方法。

    一。对包含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个像素

    例如,假设左边的主屏幕中,media元素填充了整个窗口。在窗口的构造函数中,假设 矩形 边界表示次监视器边界,使用

    this.Left = bounds.Left - 1;
    this.Width = bounds.Width;
    this.Top = bounds.Top;
    this.Height = bounds.Height;
    

    因此MediaElement在主监视器上有1个像素宽的重叠,然后它可以正常播放H.264视频文件。


    三。使用除MS的媒体基础编解码器以外的其他MP4编解码器

    下载工具“win7dsfiltertslenger”以禁用媒体基础“MP4”播放。 例如,安装另一个MP4编解码器ffshow。

        2
  •  1
  •   brovar    15 年前

    检查事件:MediaOpen、MediaEnd和MediaFailed是否仍在引发。 我假设这不是一个已知的问题,这个控件“忽略”第二个监视器。

    推荐文章