web-dev-qa-db-fra.com

Comment lire des fichiers mp3 en C #?

J'essaie de lire un fichier MP3 en C # en utilisant ce guide: http://www.crowsprogramming.com/archives/58

Et je fais tout ce qui est indiqué, mais je ne peux toujours pas jouer de 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 de musique "Song" est dans le dossier bin.

13
Waffles

Je n'ai pas utilisé l'objet COM de Windows Media Player, mais voici un lien vers une autre méthode. (Je ne suis pas l'auteur.) Il utilise pinvoke pour appeler winmm.dll afin de lire le MP3. Je l'ai testé sur Windows Server 2008 et cela a 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);
         }
      }
}
10
Joe Doyle

il vous suffit d'ajouter une référence au composant COM de Windows Media Player. Vous devez ajouter la référence au fichier wmp.dll, que vous trouverez dans le répertoire System32.

8
Shaltiel Shmidman

Je ne suis pas sûr que cela soit toujours d'actualité, mais lorsque j'ai essayé, cela ne fonctionnait que si le code ne fonctionnait pas dans le fil principal, c'est-à-dire this.InvokeRequired == false

Donc, je vous conseillerais 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 car le lecteur est configuré pour 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.

4
AlonEl

vous pouvez essayer de supprimer votre code de l'événement "main" et de le placer dans "form_load" ou "button_click" ou quelque chose du genre. provoquer la façon dont il ressemble, cela devrait fonctionner. également, comme l'a suggéré Robert Seder, vous pouvez essayer d'écrire le chemin complet du fichier mp3. 

1
futile

Il y a plusieurs choses que je voudrais essayer:

1) Qualifiez complètement le chemin d'accès à ce fichier .mp3, juste au cas où. 2) Essayez a.Ctlcontrols.play (); au lieu.

En outre, je suis presque certain que c'est un Windows (contrôle ActiveX) que vous essayez de charger. Un contexte Windows peut être nécessaire pour charger et travailler. Je suis certain qu'il existe un autre moyen de lire un fichier .mp3, car je l'avais déjà utilisé auparavant, mais je n'ai pas trouvé le code. Cela faisait peut-être partie du SDK de DirectX. J'espère que cela pourra aider.

0
Robert Seder

La manière simple, nécessite le code suivant: 1.Dans le premier ajouter System.Runtime.InteropServices nomspase. 2.En classe créer:

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

        //some code

}

3. Ajoutez atribute dans la méthode principale:

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

Et puis créer une méthode de lecture, donc:

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

J'ai eu le même problème et j'ai résolu en réglant le lecteur comme Static , par exemple:

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