it-swarm.com.de

Wie kann ich MP3-Dateien in C # abspielen?

Ich versuche, eine MP3-Datei mit dieser Anleitung in C # abzuspielen: http://www.crowsprogramming.com/archives/58

Und ich mache alles, was aufgelistet ist, aber ich kann immer noch keine Musik in meinem C # -Programm abspielen. Kann mir jemand sagen, was ich falsch mache?

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

Die Musikdatei "Song" befindet sich im Bin-Ordner.

13
Waffles

Ich habe das Windows Media Player-COM-Objekt nicht verwendet, aber hier ist ein Link zu einer alternativen Methode. (Ich bin nicht der Autor.) Es verwendet Pinvoke, um winmm.dll aufzurufen und die MP3 abzuspielen. Ich habe es unter Windows Server 2008 getestet und es hat einwandfrei funktioniert.

Hier ist eine Beispielklasse, die den Code aus dem Link verwendet.

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

sie müssen lediglich einen Verweis auf die Windows Media Player-COM-Komponente hinzufügen. Sie müssen den Verweis auf die Datei wmp.dll hinzufügen, die Sie im Verzeichnis System32 finden.

8

Ich bin mir nicht sicher, ob es immer noch relevant ist, aber als ich es ausprobierte, funktionierte es nur, wenn der Code nicht im Haupt-Thread lief, d. H. this.InvokeRequired == false

Also, ich würde dir raten, etwas auszuprobieren wie:

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

player.controls.play() wird nicht benötigt, da der Player auf automatische Wiedergabe eingestellt ist.

Ich bin mir nicht sicher, warum der Haupt-Thread nicht korrekt abgespielt wird, aber ich hoffe, das wird helfen.

4
AlonEl

sie können versuchen, Ihren Code aus dem "main" -Ereignis zu entfernen und ihn in "form_load" oder "button_click" oder so ähnlich abzulegen. Denn wie es aussieht, sollte es funktionieren. Auch wie von Robert Seder vorgeschlagen, können Sie versuchen, den gesamten Pfad für die MP3-Datei zu schreiben.

1
futile

Es gibt ein paar Dinge, die ich versuchen würde:

1) Geben Sie den Pfad zu dieser .mp3-Datei für alle Fälle vollständig an. 2) Versuchen Sie es mit a.Ctlcontrols.play (); stattdessen.

Außerdem bin ich mir fast sicher, dass es sich um ein Windows (ActiveX-Steuerelement) handelt, das Sie laden möchten. Zum Laden und Arbeiten ist möglicherweise ein Windows-Kontext erforderlich. Ich bin mir sicher, dass es eine andere Möglichkeit gibt, eine .mp3-Datei abzuspielen, da ich sie bereits verwendet habe, aber den Code nicht gefunden habe. Möglicherweise war es jedoch Teil des DirectX SDK. Hoffentlich hilft das.

0
Robert Seder

Auf einfache Weise benötigen Sie folgenden Code: 1. Fügen Sie in der ersten Namespase System.Runtime.InteropServices hinzu. 2.In der Klasse erstellen Sie:

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

        //some code

}

3. Fügen Sie atribute in die Hauptmethode ein:

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

Und dann erstelle eine Spielermethode, also:

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

Ich hatte das gleiche Problem und löste es, indem ich den Player auf Statisch stellte, zum Beispiel:

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