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

14

我正在尝试使用这个指南在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文件夹中。


链接失效。 - user3791372
可能是在WinForm应用程序中播放MP3文件的重复问题。 - user
7个回答

11
我没有使用过Windows Media Player COM对象,但这里有一个链接提供了一种替代方法。(我不是作者。)它使用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);
         }
      }
}

8

您只需要添加对Windows Media Player COM组件的引用。您需要添加对文件wmp.dll的引用,该文件位于System32目录中。


4

我不确定这是否仍然相关,但当我尝试时,它只在代码运行而非主线程中工作,即this.InvokeRequired == false

因此,我建议您尝试类似以下的内容:

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

由于播放器已设置为自动播放,因此不需要使用player.controls.play()

我不确定为什么主线程无法正确播放,但希望这可以帮助解决问题。


1

你可以尝试将代码从"main"事件中移除,并放入"form_load"或"button_click"等事件中。因为看起来这样做应该可以工作。另外,就像Robert Seder建议的那样,你可以尝试编写mp3文件的完整路径。


0

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

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

0

我会尝试以下几件事情:

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

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


0
简单的方法,需要以下代码: 1.首先添加System.Runtime.InteropServices命名空间。 2.在类中创建:
 static class Program
{
        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand,
                                                 StringBuilder strReturn,
                                                 int iReturnLength,
                                                 IntPtr hwndCallback);

        //some code

}

3. 在主方法中添加属性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接