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#.

Sin categoría

48 thoughts on “Reproducir MP3, vídeo y otros tipos de archivos con .NET

  1. He hecho lo que dice en tu blog:
    [DllImport(«winmm.dll»)]
    private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

    como uno de sus metodos de una simple clase ventana

    y declarando el metodo:

    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);
    }

    al metodo play lo llamo cuando instancio la clase de ventana y no me reproduce ningun sonido:
    this.PlayMP3(@»C:Documents and SettingsMonicaEscritorioLab 4Juego RPGbinDebugsonido.mp3);

    , compila y se muestrala ventana pero no reproduce el archivo , estoy usando el reproductor de windows media 10 y solo una simple ventana

    Saludos

    CaRLOs

  2. Carlos quizas te pase lo q a mi, q no tengo el mci.dll ahi otras como mciavi32 y cosas asi, habra q mirar cual es la q nos vale. El programa no te avisa de q no la tengas, simplemente no hace nada

  3. ei esta bn facil
    jajaja ami si me funciono
    les paso el codigo y luego pa ke esten ai diciendole al bato ke lo iso ke no funciona i no c ke
    jajaja

    Dios los bendiga

    gracias chabo
    me aras pasar una unidad en el tec ::D

  4. hola!

    quiero hacer algo similar para un Mobile Web Form, y también estoy trabajando en C# pero a pesar de cargar la librería, no me acepta el mciSendString, dice que no existe.

    No se puede usar en pocket pc? hay otras alternativaS? es que necesitaba algo similar.

    Un saludo y gracias

  5. Solo una cosa, yo lo uso para abrir un archivo de video, pero no quiero q me abra otra ventana, me gustaria q se reproduciera dentro del formulario, alguna idea???

  6. no me funciona en asp
    reproduce una sola vez y de ahi hasta que reinicio la maquina vuelve a tocar pero solo una vez

    alguien me puede ayudar necesito reproducir mp3 en asp.net 2.0 gracias

  7. Hola:

    En ASP.NET 2.0 no te vale absolutamente de nada reproducir MP3 porque es código que se ejecuta en el servidor, no en el cliente. Lo único que quieras mosquear a los del DataCenter haciendo sonar algo fúnebre cuando pasen por delante de la máquina, 😉

    En el cliente tendrás que usar un control ActiveX para reproducir (Windows Media Player) o, de más nera más genérica, Flash. También ahora podrías usar WPF/E (SilverLight).

    Saludos

    JM

  8. mira soy nuevo en esto de c# y eso de .net, mi pregunta es.. Puedo hacer un ejecutable en c# para ejecutarlo en cualquier otra maquina que no tenga instalado el framework? y otra…
    Importa la version que se use para poder ejecutar el programa que describes?

  9. Hola pachas, teoricamente no se puede,por q los ejecutables q se hacen en .net verdaderamente es tu codigo transformado a un lenguaje intermedio q despues sera interpretado, por lo tanto necesitaras la plataforma para poder ejecutar esos .exe. Si alguien q no tienen la plataforma instalada o tiene una version anterior q con la q compilaste tu programa, no podra ejecutarlo, le saltara una ventana de error.

  10. Gracias, mi funciono a la primera.
    Solo tengo una pregunta, como hago para que me salga un MessageBox cuando la aplicacion no encuentra el archivo del sonido en C#?
    Gracias.

  11. Hola, ya encontre una solucion, si alguien sabe alguna mejor seria bueno que me lo hicieran saber.

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

    public void PlayMP3(string rutaArchivo)
    {
    string comandoMCI = string.Format(«open «{0}» type mpegvideo alias miMP3″, rutaArchivo);
    mciSendString(comandoMCI, null, 0, IntPtr.Zero);
    comandoMCI = «play miMP3»;
    mciSendString(comandoMCI, null, 0, IntPtr.Zero);
    }

    // mciSendString me devuelve valor 0 si no tiene errores
    int error = mciSendString(comandoMCI, null, 0, IntPtr.Zero);
    if (error != 0)
    this.PlayMP3(@»C:Documents and SettingsMonicaEscritorioLab 4Juego RPGbinDebugsonido.mp3);
    else
    MessageBox.Show(«Error»);

  12. hola me falla tu codigo es sencillo pero como soy nuevo la verdad no se me marca un error en el StringBuilder y dice que falta una directiva de using
    podrian ayudarme de antemano gracias

  13. Bien, me sirvio, pero me pueden decir como ademas de parar la musica y luego seguir reproduciiendola, de que manera determino que un tema termino, o como puedo interactuar con las propiedades de un archivo de audio, como la duracion por ejemplo….saludos

  14. Para lo del error se puede abri el archivo con un openfiledialog
    mucho mas efectivo……mas o menos asi:

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    PlayMP3(openFileDialog1.FileName);
    }

    despues de haber incluido un filedialog en el form claro…..saludos

  15. El código expuesto me ha servido de gran ayuda. Pero ¿alguien sabe cómo usar ese código bajo un IIS? Es decir, lo que quiero es llamar a un servicio web y que este reproduzca en el propio servidor un sonido. Una vez lo conseguí, pero ahora no soy capaz de ponerlo en pie. El código es que Jose Manuel ha puesto aquí. Creo que debe ser algo de permisos en el IIS. He estado jugando con las cuentas «LocalSystem», «NetworkService» para los pools y otorgando todos los permisos posibles al IIS, pero no hay forma. La funcion mciSendString me devuelve el código 266 (MCIERR_CANNOT_LOAD_DRIVER)
    ¿Alguien puede ayudarme?
    Muchas gracias por anticipado

  16. Hola Tenchu:

    No tengo ni idea de cómo conseguir eso, pero aunque lo lograses tampoco creo que sea muy recomendable. Las aplicaciones de servidor son por definición desatendidas y al igual que no muestran interfaz de usuario tampoco debería hacer sonidos ni nada que implique interacción.

    Si necesitases notificaciones para ciertas cosas lo mejor es que las señalizases de algún modo (por ejemplo metiendo cierta info en una BD o creando un archivo o lanzando un mensaje a una cola) e hicieses un programa independiente (un ejecutable normal) que hiciese ese trabajo.

    Saludos

    JM

  17. Muchas gracias por tu respuesta.
    Una vez conseguí hacerlo mediante IIS (pero no sé qué toqué para que funcionase) y, como dije, no soy capaz de reproducirlo.
    El problema es que esa máquina va a estar desantendida y, entre otras cosas, debe emitir sonidos cuando se produzcan ciertos eventos y debe ser independiente de la sesión que se encuentre abierta en ese momento. Por eso debe ser un servicio y pensé en usar el IIS (que es lo que utilizo para el resto de la aplicación). Además, como están en clúster, esa parte ya la tendría resuelta. Me tendré que crear un servicio Windows e intentar hacer lo mismo que pretendía con IIS.
    De cualquier forma, si encuentro la forma de hacerlo con el IIS, os lo pondré aquí para compartirlo con vosotros.

    Muchas gracias!

  18. Hombre, yo lo que haría sería usar la infraestructura de Health Monitoring deASP.NET y enviar un correo o algo así, por que lo de los sonidos, la verdad, no lo veo…

    Saludos

    JM

  19. que tal me sirvio mucho el codigo y lo reproduce a la perfeccion lo puse tal y como lo tienes aqui, solo tengo una duda: como le hago para que me lo reproduzca mas de una vez? ya que solo lo hace una vez y de ahi lo hace de nuevo hasta que lo vuelvo a compilar!! saludos

  20. la verdad me sirvio de mucho pero me gustaria saber como se hace para q pueda reproducir diferentes sonidos en un mismo form ….y muchas veces … gracias

  21. hola amigo gracias por la explicacion me sirvio mucho, puse la llamada de la funcion en un botton de mi form pero solo suena una ves, que cambios debo hacer para que cada que aprieto el boton suene ese mismo archivo??

  22. ke tal, gracias por la xplicacion me funciono a la primera utilizando la ruta de acceso al archivo, solo que nomas lo reproduce una ves y tengo ke cerrar la aplicacion para ke vuelva a reproducir e intente cargue el archivo de sonido en el resources de C# para tenerlo como ruta fija para cuando utilice la aplicacion en una pc diferente pero no lo reproduce espero me puedas ayudar con esto gracias

  23. Holas

    Tengo un problema, cuando lo uso en un formulario app windows funciona a la perfeccion pero lo que yo necesito es para una pagina web, pongo un boton con html y al hacer click me reprodusca la musica.mp3 no logra abrir el archivo.

    Les agradeceria mucho la ayuda.

  24. Me costó un poquillo lograr hacerlo funcionar. StringBuilder está definido en
    System.Text (al menos en framework 2.0), y no lo sabía. Por lo demas, está muy bien el código.

  25. Holaa todos… he implementado el codigo para reproducir sonido pero me marca un error:

    ‘System.StackOverflowException’ en mscorlib.dll’

    no se si implemente bien la instruccion:

    string comandoMCI = string.Format(«open C: type mpegvideo alias miMP3», «C:my Hups.MP3»);

    porfas alguien ayudeme!!!!……

  26. Ya lo resolvi… jaja…..
    ahora. que pasa cuando quiero detener la cancion?… alguna instruccion??? porfavor si alguien me puede ayudar, le agradeceria.

  27. Hola:

    El código me funciona bien, pero solo me reproduce el archivo una vez hasta que vuelvo a compilar.
    ¿alguien me puede decir qué cambio debo introducir para que funcione igual cada vez?

    Gracias.

  28. Gracias por el gran aporte!

    Pero tengo una duda, con el codigo que nos has brindado puedo reproducir la musica y cambiandole el play por el stop en el comando MCI hago que se cree una pequeña pausa, pero quisiera saber si existen otros comandos MCI para implementar diferentes acciones con el archivo de MP3. Yo sólo necesito Play ( que ya lo hiciste), Pausa y Stop.

    Otra vez muchas gracias por el codigo,

    Cesar
    cberrios93@hotmail.com

Deja un comentario

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