Почему WPF MediaElement не работает на дополнительном мониторе? - PullRequest
19 голосов
/ 16 ноября 2010

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

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

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

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

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

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

EDIT

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

Ответы [ 2 ]

25 голосов
/ 10 мая 2012

Это все еще известная проблема в .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;
        }
}

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


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.Используйте другой кодек MP4, отличный от кодека MS Media Foundation

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

1 голос
/ 05 января 2011

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

...