How to play mp3 files in C#?

走远了吗. 提交于 2019-12-17 18:28:43

问题


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.


回答1:


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



回答2:


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.




回答3:


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.




回答4:


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.




回答5:


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.




回答6:


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



回答7:


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


来源:https://stackoverflow.com/questions/3129361/how-to-play-mp3-files-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!