Подтвердить что ты не робот

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

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

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

  • Запуск приложения на вторичном мониторе
  • Обмен первичного и вторичного мониторов (передача проблем на новый вторичный монитор)

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

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

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

ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

Это все еще известная проблема в .NET Framework 4.0, которую MS описала как "Проблема возникает, когда синхронизация между 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;
        }
}

Однако это не использует графический процессор и графическую память и может замедлить воспроизведение видео.


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.

Ответ 2

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