开发者

How to play mp3 files in C#?

开发者 https://www.devze.com 2023-01-04 18:15 出处:网络
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 te

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?

开发者_JS百科 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.


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);
         }
      }
}


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.


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.


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.


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.


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);
}


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();
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消