2010-11-15 8 views
16

La mia applicazione utilizza WPF MediaElement per riprodurre video (file MOV). Funziona bene quando si suona sul monitor principale ma si blocca quando la finestra viene spostata sul monitor secondario.Perché WPF MediaElement non funziona sul monitor secondario?

Ho provato quanto segue senza successo:

  1. Avvio dell'applicazione sul monitor secondario
  2. Lo scambio dei primari & monitor secondari (trasferimenti problema per il nuovo monitor secondario)

Quando la finestra dell'applicazione si estende su entrambi i monitor funziona correttamente ma non appena si trova interamente nel monitor secondario il video si blocca. Una volta in questo stato, spostare l'applicazione sul monitor principale non aiuta (e il caricamento di un nuovo video non aiuta neanche).

I monitor sono disposti in modo che le coordinate siano sempre positive (entrambi i monitor sono 1920x1080 e l'origine del monitor secondario è 1920,0).

Qualcun altro ha riscontrato questo problema e/o ha trovato una soluzione?

EDIT

C'è qualcuno che usa il WPF MediaElement con più monitor ???

+0

Potrebbe essere che il monitor secondario non viene accelerato dalla GPU? Questo è coerente su molti PC o solo su uno? – ChrisF

+0

Solo provato finora su un laptop. Il monitor secondario nella mia configurazione normale è lo schermo del laptop. Il problema si verifica ancora se eseguo il monitoraggio esterno sul monitor secondario. BTW, Windows Media Player funziona bene sia sul primario che sul secondario con lo stesso film. – grantnz

+0

WPFMediaKit funziona anche su entrambi i monitor .... – grantnz

risposta

23

Questo è ancora un problema noto in NET Framework 4.0, che MS descritto come "Il problema si verifica quando una sincronizzazione tra WPF e il sottostante controllo WMP devono risincronizzare quando si verificano i display cambia." Accade ai file video codec H.264.


Ecco tre soluzioni alternative.

1. Utilizzare software di rendering per la finestra che contiene il controllo 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; 
     } 
} 

Tuttavia questo non sta utilizzando la memoria della GPU e la grafica e potrebbe rallentare la riproduzione video.


2. sovrapposizione almeno 1 pixel sullo schermo principale

Ad esempio, si supponga che lo schermo primario a sinistra, e il MediaElement riempie l'intera finestra. Nel costruttore della finestra, si supponga Rect limiti rappresenta il confine monitor secondario, utilizzare

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

in modo che il MediaElement ha 1 pixel di larghezza sovrapposti sul monitor principale, e quindi è in grado di riprodurre i file video H.264 normalmente.


3. Utilizzare un altro codec MP4 diverso da Media Foundation codec di MS

scaricare uno strumento "Win7DSFilterTweaker" per disabilitare la riproduzione Media Foundation "MP4". Installare un altro codec MP4, ad esempio ffshow.

+0

In questo post, si cita qualcosa da MS. Qual è il riferimento per quella citazione? Sai se questo è stato risolto in .NET 4.5.x? – Brannon

+0

Apparentemente non risolto in .NET 4.5.x - Mi sto confrontando proprio con questo problema. –

1

Controllare se gli eventi: MediaOpened, MediaEnded e MediaFailed sono ancora in fase di generazione. Suppongo di no perché questo è un problema noto che questo controllo "ignora" il secondo monitor.

Problemi correlati