Почему WPF MediaElement не работает на вторичном мониторе?

мое приложение использует WPF MediaElement для воспроизведения видео (MOV-файлов). Это хорошо работает при воспроизведении на основном мониторе, но зависает при перемещении окна на дополнительный монитор.

Я попробовал следующее без успеха:

  1. запуск приложения на вторичном мониторе
  2. замена первичных и вторичных мониторов (передача проблем на новый вторичный монитор)

когда окно приложения охватывает оба монитора работают правильно, но как только он полностью находится во вторичном мониторе, видео зависает. В этом состоянии перемещение приложения обратно на основной монитор не помогает (и загрузка нового видео тоже не помогает).

мониторы расположены так, что координаты всегда положительные (оба монитора 1920x1080, а источник вторичного монитора 1920,0).

кто-нибудь еще видел эту проблему и / или нашел исправить?

редактировать

кто-нибудь использует WPF MediaElement с несколькими мониторами???

2 ответов


Это все еще известная проблема в .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 границы представляет вторичную границу монитора, используйте

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

так MediaElement имеет 1 пиксель накладывается на основной монитор, а затем он может нормально воспроизводить видеофайлы H. 264.


3. Используйте другой кодек MP4, отличный от кодека MS Media Foundation

загрузите инструмент "Win7DSFilterTweaker", чтобы отключить воспроизведение Media Foundation" MP4". Установите другой кодек MP4, например ffshow.


проверьте, если события: MediaOpened, MediaEnded и MediaFailed все еще поднимаются. Я предполагаю, что это не известная проблема, что этот элемент управления "игнорирует" второй монитор.