2010-11-15 5 views
16

Mon application utilise le MediaFlement de WPF pour lire la vidéo (fichiers MOV). Cela fonctionne bien lors de la lecture sur le moniteur principal mais se fige lorsque la fenêtre est déplacée vers le moniteur secondaire.Pourquoi WPF MediaElement ne fonctionne pas sur le moniteur secondaire?

J'ai essayé ce qui suit sans succès:

  1. Démarrage de l'application sur le moniteur secondaire
  2. Permutation les & primaires moniteurs secondaires (transferts de problème au nouveau moniteur secondaire)

Lorsque la fenêtre de l'application couvre les deux moniteurs, elle fonctionne correctement, mais dès qu'elle est entièrement dans le moniteur secondaire, la vidéo se fige. Une fois dans cet état, le retour de l'application sur le moniteur principal n'aide pas (et le chargement d'une nouvelle vidéo n'aide pas non plus).

Les moniteurs sont agencés de sorte que les coordonnées soient toujours positives (les deux moniteurs sont 1920x1080 et l'écran secondaire est 1920,0).

Est-ce que quelqu'un d'autre a vu ce problème et/ou a trouvé une solution?

EDIT

Quelqu'un utilise-t WPF MediaElement avec plusieurs moniteurs ???

+0

Est-il possible que le moniteur secondaire ne soit pas accéléré par le GPU? Est-ce cohérent sur plusieurs PC ou juste sur un? – ChrisF

+0

Seulement essayé sur un ordinateur portable jusqu'à présent. Le moniteur secondaire dans ma configuration normale est l'écran d'ordinateur portable. Le problème se produit toujours si je fais le moniteur externe le moniteur secondaire. BTW, Windows Media Player fonctionne bien à la fois sur le primaire et secondaire avec le même film. – grantnz

+0

WPFMediaKit fonctionne également sur les deux moniteurs .... – grantnz

Répondre

23

Ceci est encore un problème connu dans .NET Framework 4.0, qui décrit comme MS « Le problème se produit lorsque une synchronisation entre WPF et le contrôle WMP sous-jacents doivent resynchroniser lorsque les changements d'affichage se produisent. » Il arrive aux fichiers vidéo du codec H.264.


Voici 3 solutions de contournement.

1. Utilisez un logiciel de rendu pour la fenêtre contenant le contrôle 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; 
     } 
} 

Toutefois, ce n'utilise pas le GPU et la mémoire graphique et pourrait ralentir la lecture vidéo.


2. Overlap au moins 1 pixel sur l'écran principal

Par exemple, supposons que l'écran primaire à gauche, et la MediaElement remplit toute la fenêtre. En représente la limite du moniteur secondaire, le constructeur de la fenêtre, supposons Rect limites utiliser

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

de sorte que le MediaElement a 1 pixel de large chevauché sur le moniteur principal, et il est capable de lire des fichiers vidéo H.264 normalement.


3. Utilisez un autre codec MP4 autre que Media Foundation codec MS

Télécharger un outil "Win7DSFilterTweaker" pour désactiver la lecture Media Foundation "MP4". Installez un autre codec MP4, ffshow, par exemple.

+0

Dans ce post, vous citez quelque chose de MS. Quelle est la référence pour cette citation? Savez-vous si cela a été corrigé dans .NET 4.5.x? – Brannon

+0

Apparemment non corrigé dans .NET 4.5.x - Je suis confronté à ce problème même maintenant. –

1

Vérifiez si les événements: MediaOpened, MediaEnded et MediaFailed sont toujours en cours de levée. Je suppose que ce n'est pas un problème connu que ce contrôle "ignore" le second moniteur.

Questions connexes