如何在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文件夹中。

我没有使用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); } } } 

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

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

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

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

因为播放器设置为自动播放,所以不需要player.controls.play()

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

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

我会尝试一些事情:

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

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

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

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

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

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