Reproducir MP3, vídeo y otros tipos de archivos con .NET

En mis dos anteriores post comentaba la manera de reproducri archivos de sonido del sistema con .NET, tanto en la versión 1.x como en la 2.0. En el último un visitante preguntaba cómo podemos reproducir MP3 desde .NET.


La solución más sencilla es la de toda la vida: recurrir a la API de MCI para hacerlo.


MCI es el acrónimo de Media Control Interface. se trata de una API basada en comandos de texto que permite controlar los diferentes dispositivos multimedia de reproducción y grabación que hay en el sistema. Gracias a MCI podemos reproducir vídeo, audio, CDs, MIDI, etc.. . así como grabar desde micrófonos, cámaras y demás, todo ello de forma estándar e independiente del dispositivo real que haya detrás.


La única función importante de MCI que nos interesa para nuestro ejemplo de reproducción de MP3 es ‘mciSendString‘. Ésta permite enviar comandos MCI para abrir dispositivos y operar con ellos.


Para reproducir un archivo MP3 (o realmente cualquier otro) sólo necesitamos conocer dos comandos de MCI: open y play. El primero sirve abrir un dispositivo lógico de reproducción indicando ´cuál es y de qué manera lo queremos usar. El segundo simplemente hace que éste reproduzca el archivo multimedia seleccionado.


En el caso de MP3 el tipo de dispositivo es mpegvideo, por lo que el comando a enviar es:



open «ruta a mi archivo multimedia» type mpegvideo alias miMP3


Lo que vaa continuación de la palabra ‘alias’ es un nombre únuco que damos al recurso multimedia desde nuestra aplicación. De este modo podemos controlar y reproducir varios archivos a la vez.


Con esta teoría ya podemos pasar a la práctica y reproducir MP3 fácilmente desde una aplicación Windows de ejemplo. Abre un nuevo proyecto de Windows Forms (mi código va en C# pero es directo traducirlo a VB). En el formulario que aparece agregue el siguiente using en la parte superior:



using System.Runtime.InteropServices;


Esto nos permite definir la función de la API que necesitamos que es la siguiente y deberá añadir dentro del código del formulario:



[DllImport(«winmm.dll»)]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);


Sólo vamos a usar en este ejemplo el primer parámetro que es el comando que queremos enviar a MCI. Los otros parámetros se usarían para obtener valores (por ejemplo el volumen o la posición actuales), pero no los usaremos aquí (queda como «deberes» para el lector ;-)).


Define a continuación el siguiente método en tu formulario:



public void PlayMP3(string rutaArchivo)
{
  //Abrir el dispositivo MCI
  string comandoMCI = string.Format(«open «{0}» type mpegvideo alias miMP3″, rutaArchivo);
  mciSendString(comandoMCI, null, 0, IntPtr.Zero);
  //Reproducir el archivo abierto
  comandoMCI = «play miMP3»;
  mciSendString(comandoMCI, null, 0, IntPtr.Zero);
}


Como vemos es muy fácil. El método toma como parámetro la ruta completa al archivo que queremos reproducir y se lanzan dos comandos MCI. El primero de ellos abre el archivo para su reproducción. El segundo lo reproduce. para reproducir cualquier MP3 sólo hay que escribir algo como:



PlayMP3(@»E:Black Eyed Peas – Pump It.mp3″);


¡Ya está! Muy fácil ¿verdad?


En este enlace tienes una lista con todos los comandos MCI existentes. Investígala más por tu cuenta para hacer muchas más cosas y crear un reproductor completo de audio y vídeo.


También es posible reproducir archivos multimedia usando DirectX. Si estás interesado he estado googleando un poco y, aquí y aquí, tienes un par de buenos ejemplos de como hacerlo con C#.

Reproducir sonidos del sistema en nuestra aplicación .NET 1.x

Este post surge a raíz del anterior en el que explicaba como reproducir sonidos en .NET 2.0 (viene muy facilito), ya que un asiduo lector de este blog ha preguntado cómo se harí en versiones anteriores.


La respuesta a esta pregunta es: ¡usando la API de Windows!. Los que llevamos unos cuantos años programando con tecnologías Microsoft (los dinosaurios que usábamos ActiveX y estas cosas) estamos todos muy acostumbrados a usar la API de windows y no nos suena raro. En .NEt se sigue usando para algunas cosas, pero la verdad es que está todo tan mascado que pocas veces suele hacer falta.


En este caso la función clave de la API MessageBeep. Esta función permite reproducir sonidos predefinidos del sistema con sólo pasarle su código numérico. Por tanto lo único que necesitamos para replicar la funcionalidad de la clase que viene con .NET 2.0 es declarar esta función y conocer las constantes. así que una clase similar a la anterior sería la siguiente (código completo):



using System;
using System.Runtime.InteropServices;

public class SystemSound
{
    [DllImport(«user32.dll», CharSet=CharSet.Auto, ExactSpelling=true)]
    private static extern bool MessageBeep(int type);

    public static void Play(SystemSounds sonido)
    {
        try
        {
          MessageBeep((int) sonido);
        }
        catch{}
    }
    
    public enum SystemSounds
    {
        Beep = 0,
        Question = 0x20,
        Exclamation = 0x30,
        Asterisk = 0x40,
    }
}


¡Listo!.


Ahora para reproducir el sonido que queramos sólo tenemos que escribir:



SystemSound.Play(SystemSounds.Asterisk);


Bastante fácil pero desde luego más complicado que en .NET 2.0.


En Coding4Fun de Microsoft he encontrado un artículo que habla de este tema pero en lugar de usar este método que he empleado yo lee del registro los sonidos asignados y los reproduce (son WAVs). Permite replicar la funcionalidad del panel de control, pero es bastante más complicado. Al que le interese puede leerlo desde aquí: Where Did That Sound Come From?.