14

I'm trying to play an MP3 file in C# using this guide: http://www.crowsprogramming.com/archives/58

And I'm doing everything listed, but I still can't play any music in my C# program. Can anyone tell me what I'm doing wrong?

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

The music file "Song" is in the bin folder.

3Dave
  • 28,657
  • 18
  • 88
  • 151
Waffles
  • 151
  • 1
  • 2
  • 6

7 Answers7

11

I haven't used the Windows Media Player COM object, but here's a link to an alternative method. (I am not the author.) It uses pinvoke to call winmm.dll to play the MP3. I tested it out on Windows Server 2008 and it worked just fine.

Here's a sample class using the code form the link.

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);
         }
      }
}
Joe Doyle
  • 6,363
  • 3
  • 42
  • 45
8

all you need to do is add a reference to the Window Media Player COM component. You need to add the reference to the file wmp.dll, which you can find in the System32 directory.

4

I'm not sure it's still relevant but when I tried it, it only worked when the code ran not in the main thread, i.e., this.InvokeRequired == false

So, I would advice you try something like:

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

player.controls.play() is not needed since the player is set to auto play.

I'm not sure as to why the main thread won't play correctly but I hope this will help.

AlonEl
  • 81
  • 7
1

you may try to remove your code from the "main" event and put it into "form_load" or "button_click" or something like it. cause the way it looks, it should work. also like Robert Seder suggested, you can try to write the whole path for the mp3 file.

0

I had the same problem and I solved by setting the player as Static, for example:

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

There are a couple of things I would try:

1) Fully-qualify the path to that .mp3 file, just in case. 2) Try a.Ctlcontrols.play(); instead.

Also, I'm nearly certain that is a Windows (ActiveX control) that you are trying to load. It may need a windows context in order to load and work. I'm certain there is another way to play an .mp3, because I've used it before, but I couldn't find the code. It may have been part of the DirectX SDK though. Hope that helps.

Robert Seder
  • 1,390
  • 1
  • 9
  • 19
0

The simple way, need following code: 1.In the first add System.Runtime.InteropServices namespase. 2.In class create:

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

        //some code

}

3. Add atribute in the main method:

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

And then create player method, so:

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