2010-06-27 20 views
13

sto cercando di riprodurre un file MP3 in C# utilizzando questa guida: http://www.crowsprogramming.com/archives/58Come si riproducono i file mp3 in C#?

e sto facendo tutto quello elencato, ma ancora non può giocare qualsiasi tipo di musica nel mio programma C#. Qualcuno può dirmi cosa sto facendo di sbagliato?

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

Il file musicale "Song" si trova nella cartella bin.

+0

collegamento in questione è morto – user3791372

+0

Possibile duplicato di [Riproduzione di un file MP3 in un'applicazione WinForm] (http://stackoverflow.com/questions/15025626/playing-a-mp3-file-in-a-winform-application) – user

risposta

0

Ci sono un paio di cose che vorrei provare:

1) completamente qualificare il percorso a quel file .mp3, per ogni evenienza. 2) Prova a.Ctlcontrols.play(); anziché.

Inoltre, sono quasi certo che è un Windows (controllo ActiveX) che si sta tentando di caricare. Potrebbe essere necessario un contesto di Windows per caricare e lavorare. Sono certo che c'è un altro modo di suonare una .mp3, perché l'ho già usata in precedenza, ma non ho trovato il codice. Potrebbe essere stato parte di DirectX SDK però. Spero possa aiutare.

10

Non ho utilizzato l'oggetto COM di Windows Media Player, ma here's a link in un metodo alternativo. (Io non sono l'autore.) Usa pinvoke per chiamare winmm.dll per riprodurre l'MP3. L'ho testato su Windows Server 2008 e ha funzionato bene.

Ecco una classe di esempio che utilizza il codice del collegamento.

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

Io non sono sicuro che sia ancora rilevante, ma quando l'ho provato, ha funzionato solo quando il codice non ha funzionato nel thread principale, vale a dire, this.InvokeRequired == false

Quindi, vorrei consigliarvi di provare qualcosa di simile :

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

player.controls.play() non è necessaria in quanto il lettore è impostato per la riproduzione automatica.

Non sono sicuro del motivo per cui il thread principale non verrà riprodotto correttamente, ma spero che ciò possa essere d'aiuto.

+0

Questo ha funzionato perfettamente per me – SeBo

1

si può provare a rimuovere il codice dall'evento "principale" e metterlo in "form_load" o "button_click" o qualcosa del genere. Per come sembra, dovrebbe funzionare. inoltre, come suggerito da Robert Seder, puoi provare a scrivere l'intero percorso per il file mp3.

0

Il modo semplice, è necessario il seguente codice: 1. Nel primo aggiungere System.Runtime.InteropServices namespace. 2.In classe creare:

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

     //some code 

} 

3. Add atribute nel metodo principale:

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

E quindi creare metodo di giocatore, quindi:

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

tutto quello che dovete fare è aggiungere un riferimento al componente COM di Windows Media Player. È necessario aggiungere il riferimento al file wmp.dll, che è possibile trovare nella directory System32.

0

Ho avuto lo stesso problema e ho risolto impostando il giocatore come Static, ad esempio:

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