如何在C#中播放mp3文件?

时间:2010-06-27 23:51:51

标签: c# mp3

我正在尝试使用本指南在C#中播放MP3文件: http://www.crowsprogramming.com/archives/58

我正在列出所有内容,但我仍然无法在我的C#程序中播放任何音乐。谁能告诉我我做错了什么?

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

音乐文件“Song”位于bin文件夹中。

7 个答案:

答案 0 :(得分:10)

我没有使用Windows Media Player COM对象,而是使用here's a link替代方法。 (我不是作者。)它使用pinvoke调用winmm.dll来播放MP3。我在Windows Server 2008上对它进行了测试,结果很好。

以下是使用链接代码的示例类。

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

答案 1 :(得分:8)

您需要做的就是添加对Window Media Player COM组件的引用。您需要添加对文件wmp.dll的引用,您可以在System32目录中找到它。

答案 2 :(得分:4)

我不确定它是否仍然相关但是当我尝试它时,只有当代码不在主线程中运行时才会起作用,即this.InvokeRequired == false

所以,我会建议你尝试类似的东西:

ThreadPool.QueueUserWorkItem(
             delegate(object param)
             {
                 WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer();
                 player.URL = "song.mp3";                     
             });
由于播放器设置为自动播放,因此不需要

player.controls.play()

我不确定为什么主线程无法正常播放,但我希望这会有所帮助。

答案 3 :(得分:1)

你可能会尝试从“main”事件中删除你的代码并将其放入“form_load”或“button_click”或类似的东西。导致它的外观,它应该工作。也像Robert Seder建议的那样,你可以尝试编写mp3文件的整个路径。

答案 4 :(得分:0)

我会尝试一些事情:

1)完全限定.mp3文件的路径,以防万一。 2)尝试a.Ctlcontrols.play();代替。

此外,我几乎可以肯定,您正在尝试加载Windows(ActiveX控件)。它可能需要一个Windows上下文才能加载和工作。我确定还有另一种方法可以播放.mp3,因为我之前使用过它,但我找不到代码。它可能是DirectX SDK的一部分。希望有所帮助。

答案 5 :(得分:0)

简单的方法,需要以下代码: 1.在第一个添加System.Runtime.InteropServices namespase。 2.在班级创建:

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

        //some code

}

3。在main方法中添加属性:

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

然后创建播放器方法,所以:

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

答案 6 :(得分:0)

我遇到了同样的问题,我通过将播放器设置为静态来解决,例如:

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