2010-06-27 7 views
13

Je suis en train de lire un fichier MP3 en C# en utilisant ce guide: http://www.crowsprogramming.com/archives/58Comment lire des fichiers mp3 en C#?

Et je fais tout ce que la liste, mais je ne peux toujours pas jouer de la musique dans mon programme C#. Quelqu'un peut-il me dire ce que je fais mal?

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

Le fichier musical "Song" se trouve dans le dossier bin.

+0

en question est mort – user3791372

+0

double possible de [Lecture d'un fichier MP3 dans une application WinForm] (http://stackoverflow.com/questions/15025626/playing-a-mp3-file-in-a-winform-application) – user

Répondre

0

Il y a deux ou trois choses que je voudrais essayer:

1) entièrement le chemin à qualifier ce fichier .mp3, juste au cas où. 2) Essayez a.Ctlcontrols.play(); au lieu.

Aussi, je suis presque certain que c'est un Windows (contrôle ActiveX) que vous essayez de charger. Il peut avoir besoin d'un contexte Windows pour charger et travailler. Je suis certain qu'il existe une autre façon de jouer un .mp3, parce que je l'ai déjà utilisé, mais je n'ai pas trouvé le code. Cela a peut-être fait partie du SDK DirectX. J'espère que cela pourra aider.

10

Je n'ai pas utilisé l'objet COM Windows Media Player, mais here's a link à une méthode alternative. (Je ne suis pas l'auteur.) Il utilise pinvoke pour appeler winmm.dll pour lire le MP3. Je l'ai testé sur Windows Server 2008 et cela a très bien fonctionné.

Voici un exemple de classe utilisant le code du lien.

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

Je ne suis pas sûr qu'il est toujours pertinent, mais quand je l'ai essayé, il ne fonctionnait lorsque le code a couru pas dans le thread principal, à savoir, this.InvokeRequired == false

Alors, je vous conseille d'essayer quelque chose comme :

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

player.controls.play() n'est pas nécessaire puisque le joueur est réglé sur la lecture automatique.

Je ne suis pas sûr de savoir pourquoi le fil principal ne jouera pas correctement mais j'espère que cela aidera.

+0

Cela a fonctionné totalement bien pour moi – SeBo

1

vous pouvez essayer de retirer votre code de l'événement "main" et le mettre dans "form_load" ou "button_click" ou quelque chose comme ça. Parce que ça a l'air, ça devrait marcher. Aussi, comme Robert Seder a suggéré, vous pouvez essayer d'écrire le chemin complet pour le fichier mp3.

0

La manière simple, besoin code suivant: 1.Dans le premier ajouter System.Runtime.InteropServices namespase. 2.In élaborez:

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

     //some code 

} 

3. Ajouter atribute dans la méthode principale:

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

Et puis créer méthode de joueur, donc:

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

tout ce que vous devez faire est d'ajouter une référence au composant COM Windows Media Player. Vous devez ajouter la référence au fichier wmp.dll, que vous pouvez trouver dans le répertoire System32.

0

J'ai eu le même problème et je résolus en réglant le joueur comme statique, par exemple:

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