2010-06-27 44 views
13

estoy tratando de reproducir un archivo MP3 en C# usando esta guía: http://www.crowsprogramming.com/archives/58¿Cómo reproducir archivos mp3 en C#?

y estoy haciendo todo lo mencionado, pero todavía no se puede reproducir cualquier tipo de música en mi programa en C#. ¿Alguien puede decirme lo que estoy haciendo mal?

static void Main(string[] args) 
    { 
     WMPLib.WindowsMediaPlayer a = new WMPLib.WindowsMediaPlayer(); 
     a.URL = "song.mp3"; 
     a.controls.play(); 
    } 

El archivo de música "Song" está en la carpeta bin.

+0

enlace en cuestión está muerto – user3791372

+0

duplicado posible de [Reproducción de un archivo MP3 en una aplicación WinForm] (http://stackoverflow.com/questions/15025626/playing-a-mp3-file-in-a-winform-application) – user

Respuesta

0

Hay un par de cosas que me gustaría probar:

1) calificar por completo la ruta a ese archivo .mp3, por si acaso. 2) Pruebe a.Ctlcontrols.play(); en lugar.

Además, estoy casi seguro de que es un Windows (control ActiveX) el que está intentando cargar. Es posible que necesite un contexto de Windows para cargar y trabajar. Estoy seguro de que hay otra forma de jugar un .mp3, porque lo he usado antes, pero no pude encontrar el código. Sin embargo, puede haber sido parte del DirectX SDK. Espero que ayude.

10

No he usado el objeto COM del Reproductor de Windows Media, pero here's a link a un método alternativo. (No soy el autor.) Utiliza pinvoke para llamar a winmm.dll para reproducir el MP3. Lo probé en Windows Server 2008 y funcionó bien.

Aquí hay una clase de muestra que utiliza el código del enlace.

using System.Runtime.InteropServices; 

public class MP3Player 
{ 
     private string _command; 
     private bool isOpen; 
     [DllImport("winmm.dll")] 

     private static extern long mciSendString(string strCommand,StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback); 

     public void Close() 
     { 
     _command = "close MediaFile"; 
     mciSendString(_command, null, 0, IntPtr.Zero); 
     isOpen = false; 
     } 

     public void Open(string sFileName) 
     { 
     _command = "open \"" + sFileName + "\" type mpegvideo alias MediaFile"; 
     mciSendString(_command, null, 0, IntPtr.Zero); 
     isOpen = true; 
     } 

     public void Play(bool loop) 
     { 
     if(isOpen) 
     { 
      _command = "play MediaFile"; 
      if (loop) 
      _command += " REPEAT"; 
      mciSendString(_command, null, 0, IntPtr.Zero); 
     } 
     } 
} 
4

No estoy seguro de que sigue siendo relevante, pero cuando lo probé, sólo funcionaba cuando el código no funcionó en el hilo principal, es decir, this.InvokeRequired == false

lo tanto, yo aconsejaría intentar algo así como :

ThreadPool.QueueUserWorkItem(
      delegate(object param) 
      { 
       WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer(); 
       player.URL = "song.mp3";      
      }); 

player.controls.play() no es necesaria ya que el jugador se establece en la reproducción automática.

No estoy seguro de por qué el hilo principal no se reproducirá correctamente, pero espero que esto ayude.

+0

Esto funcionó totalmente bien para mí – SeBo

1

puede intentar eliminar su código del evento "principal" y ponerlo en "form_load" o "button_click" o algo similar. porque la forma en que se ve, debería funcionar. también como sugirió Robert Seder, puedes intentar escribir todo el camino para el archivo mp3.

0

La manera simple, necesita el siguiente código: 1.En el primer agregar System.Runtime.InteropServices namespase. 2.In clase crear:

static class Program 
{ 
     [DllImport("winmm.dll")] 
     private static extern long mciSendString(string strCommand, 
               StringBuilder strReturn, 
               int iReturnLength, 
               IntPtr hwndCallback); 

     //some code 

} 

3. Agregar atributo en el método principal:

[STAThread] 
static void Main(string[] args) 
{//some code} 

y luego crear método de jugador, así:

public void player() 
{ 
       mciSendString("open \"" + "mp3 file path" + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero); 
     mciSendString("play MediaFile", null, 0, IntPtr.Zero); 
} 
8

todo lo que tiene que hacer es agregar una referencia al componente COM del Reproductor de Windows Media. Debe agregar la referencia al archivo wmp.dll, que puede encontrar en el directorio System32.

0

que tenían el mismo problema y lo resuelve mediante el establecimiento del jugador como estático, por ejemplo:

public class MiClass(){ 
static WMPLib.WindowsMediaPlayer wplayer; 
private void PlayMusic() 
    { 
     wplayer = new WMPLib.WindowsMediaPlayer(); 
     wplayer.URL = "c:\shoryuken.mp3"; 
     wplayer.controls.play(); 
    } 
} 
Cuestiones relacionadas