Manejar MPlayer desde C#

Por si alguien no conoce MPlayer (haber estado en una cueva los últimos 10 años nos puede haber pasado a todos) decir que es uno de los mejores reproductores de audio y vídeo que existen. Si MPlayer no puede… lo más seguro es que nadie pueda ;)

No existe, que yo sepa, ninguna API contra la que se pueda trabajar ni ningún componente que encapsule su funcionalidad, así que tendremos que manejar el proceso. Eso, a parte de un coñazo, no sería mayor problema de no ser porque lo normal es que queramos tener el vídeo dentro de nuestra aplicación y no en una ventana aparte como hace MPlayer.

La forma de lograr la integración se basa en usar Overlays. Básicamente sería pintar de un color (en mi caso negro) una zona de la pantalla y decirle a MPlayer que sitúe el vídeo en el rectángulo de ese color que esté dentro de nuestra ventana.

Lograr el primer requisito (tener el recuadro de un color) no es difícil. Puede usarse un PictureBox y darle un color de fondo (Ojo, el color del PictureBox se da en RGB). Luego sólo tendremos que iniciar mplayer con la opción -colorkey 0x000000 (el código de color a MPlayer se le pasa en hexadecimal… ojo).

Ahora bien… si no le decimos a MPlayer en que ventana, difícilmente lograremos la integración. Para ello tenemos que pasarle el numero del manejador de nuestra ventana. Esto se puede obtener mediante la API de Windows. El código sería así:

[DllImport("user32.dll")]
 static extern int GetForegroundWindow();

 

Con eso ya podemos llamar a GetForegroundWindow() que nos devolverá el número del manejador de la ventana activa. No tendremos más que pasarle ese número a MPlayer de la forma «-wid numero». Automágicamente las reproducciones de MPlayer se efectuarán dentro de nuestra ventana.

No se si al final usaré MPlayer para algo, la verdad es que lo miré más como posibilidad para un futuro, ahora tengo cosas más urgentes.. pero si finalmente trabajo con él, intentaré crear un Assembly para que se pueda reutilizar el trabajo.

Por Carballude

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P

3 comentarios

  1. Hola:

    La verdad es que veo que tienes bastante futuro en el mundo del desarrollo, viendo lo integrado que estás y la corta edad que tienes. Enhorabuena.

    Veo que estás puesto con el MPlayer y te escribo para realizarte una consulta a ver si me puedes echar una mano:

    Una vez, leído este post tuyo, he creado una mini-aplicación que levanta un form y a través de process levanto el MPlayer con el vídeo correspondiente pero no entiendo como interar el MPlayer con el formulario. Tengo el identificador el MPlayer pero hasta ahí. El resto no se como seguir.

    Además, me gustaría hacerte otra pregunta, ¿se podría de alguna manera que el MPlayer, además de integrarse en el formulario, se pudiera quitar la barra de menú y todas las opciones que aparecen encima del cuadro de video. Es decir, que solo dejara los controles de Play, Stop, Avance de Video y volumen?

    Cualquier aclaración tienes mi mail.

    Gracias de antemano,
    Un saludo.
    Manuel

    PD: TE MUESTRO EL CÓDIGO:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.Win32;

    namespace ReproductorSMPlayer
    {
    public partial class Form1 : Form
    {
    [DllImport(«user32.dll»)]
    static extern int GetForegroundWindow(); // end GetForegroundWindow

    [DllImport(«user32.dll»)]
    static extern int GetWindowText(int hWnd, StringBuilder text, int count); // end GetWindowText

    public Form1()
    {
    InitializeComponent();
    } // end Form1

    private void Form1_Load(object sender, EventArgs e)
    {
    try
    {
    /// Averiguamos donde está instalada la aplicación de SMPlayer tanto de video o de audio:
    /// Para ello debemos saber que en el registro de windows, en la parte de software existen 2 carpetas que hacen referencias
    /// a la de video y otra a la de audio.
    /// Video: \\MPlayerFileVideo\\shell\\open\\command
    /// Audio: \\MPlayerFileAudio\\shell\\open\\command
    string RutaInstalacion = string.Empty;

    RegistryKey mKey = Registry.LocalMachine.CreateSubKey(«SOFTWARE\\Classes\\MPlayerFileVideo\\shell\\open\\command»);
    if (mKey == null)
    {
    MessageBox.Show(«MPlayer no está instalado en su PC»);
    }
    else
    {
    int posInicial, posFinal;
    posInicial = mKey.GetValue(«»).ToString().IndexOf(«\\») – 2;
    posFinal = mKey.GetValue(«»).ToString().LastIndexOf(«.exe») + 4;
    RutaInstalacion = mKey.GetValue(«»).ToString().Substring(posInicial, posFinal – posInicial);
    }
    mKey.Close();

    /// Si obtenemos la ruta donde está el programa de MPlayer ejecutamos el proceso.
    if (!string.IsNullOrEmpty(RutaInstalacion))
    {
    ProcessStartInfo _processStartInfo = new ProcessStartInfo();
    _processStartInfo.FileName = RutaInstalacion;
    _processStartInfo.WorkingDirectory = @»C:\Documents and Settings\mmontesino\Mis documentos\Mis vídeos»;
    _processStartInfo.Arguments = «billgates.mpg»;
    Process.Start(_processStartInfo);
    }
    GetActiveWindow();
    /// Intentamos que se integre con la aplicación.
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    } // end Form1_Load

    //
    // GetForegroundWindow API
    //
    private void GetActiveWindow()
    {

    const int nChars = 256;
    int handle = 0;
    StringBuilder Buff = new StringBuilder(nChars);

    handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
    MessageBox.Show(Buff.ToString());
    MessageBox.Show(handle.ToString());
    }

    }

    private void button1_Click(object sender, System.EventArgs e)
    {
    this.Close();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    foreach (Process _process in System.Diagnostics.Process.GetProcessesByName(«smplayer_portable»))
    {
    try
    {
    _process.Kill();
    _process.WaitForExit(); // possibly with a timeout
    }
    catch
    {
    throw;
    }
    }

    }

    } // end class Form1
    } // end namespace ReproductorSMPlayer

  2. En primer lugar está muy bien la aclaración sobre el tema, lo que no veo tan claro y creo brilla por su ausencia son las respuestas a preguntas concretas espero que para mis futuras visitas me convenzan de lo contrario

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *