2010-11-15 18 views
16

Mi aplicación usa WPF MediaElement para reproducir video (archivos MOV). Esto funciona bien cuando se reproduce en el monitor principal, pero se congela cuando la ventana se mueve al monitor secundario.¿Por qué WPF MediaElement no funciona en el monitor secundario?

he intentado lo siguiente sin éxito:

  1. Inicio de la aplicación en el monitor secundario
  2. Alternar los & monitores secundarios primarios (transferencias de problemas para el nuevo monitor secundario)

Cuando la ventana de la aplicación abarca ambos monitores, funciona correctamente pero, una vez que está completamente dentro del monitor secundario, el video se congela. Una vez en este estado, mover la aplicación de vuelta al monitor principal no ayuda (y cargar un nuevo video tampoco ayuda).

Los monitores están dispuestos de modo que las coordenadas sean siempre positivas (ambos monitores son 1920x1080 y el origen del monitor secundario es 1920,0).

¿Alguien más ha visto este problema y/o ha encontrado una solución?

EDITAR

¿Alguien usa la WPF MediaElement con varios monitores ???

+0

¿Podría ser que la GPU no acelere el monitor secundario? ¿Es esto coherente en muchas PC o solo en una? – ChrisF

+0

Solo intenté en una computadora portátil hasta el momento. El monitor secundario en mi configuración normal es la pantalla del portátil. El problema aún ocurre si hago que el monitor externo sea el monitor secundario. Por cierto, Windows Media Player funciona bien tanto en la primaria y secundaria con la misma película. – grantnz

+0

WPFMediaKit también funciona en ambos monitores .... – grantnz

Respuesta

23

Esto sigue siendo un problema conocido en .NET Framework 4.0, que MS descrito como "El problema se produce cuando una sincronización entre WPF y el control WMP subyacente tienen que volver a sincronizar cuando se producen los cambios de pantalla". Sucede a los archivos de video de códec H.264.


Aquí hay 3 soluciones.

1. Utilice software de renderizado para la ventana que contiene el control 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; 
     } 
} 

Sin embargo esto no es la utilización de la memoria de la GPU y los gráficos y podrían ralentizar la reproducción de vídeo.


2. Overlap al menos 1 pixel en la pantalla primaria

Por ejemplo, supongamos que la pantalla principal en la izquierda, y la MediaElement llena toda la ventana. En el constructor de la ventana, supongamos Rect límites representa el límite monitor secundario, utilice

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

por lo que el MediaElement tiene 1 pixel de ancho solapado en el monitor principal, y entonces es capaz de reproducir archivos de vídeo H.264 normalmente.


3. Uso MP4 otro códec que no sea Media Foundation codec de MS

Descargar una herramienta de "Win7DSFilterTweaker" para desactivar la reproducción Fundación de Medios "MP4". Instale otro códec MP4, ffshow, por ejemplo.

+0

En esta publicación, citas algo de MS. ¿Cuál es la referencia para esa cita? ¿Sabes si esto se ha solucionado en .NET 4.5.x? – Brannon

+0

Aparentemente no está arreglado en .NET 4.5.x - Me estoy enfrentando a este mismo problema ahora. –

1

Compruebe si los eventos: MediaOpened, MediaEnded y MediaFailed se siguen planteando. Supongo que no, ya que es un problema conocido que este control "ignora" el segundo monitor.

Cuestiones relacionadas