在WinForm应用程序中播放MP3文件

60
我正在开发一个WinForm应用程序。 我想在用户单击按钮时播放MP3文件。
该MP3文件位于执行应用程序的计算机的文件系统中。 我已经谷歌搜寻了一段时间,并找到了关于System.Media.SoundPlayer类的信息。 但我已经读到,SoundPlayer类只能用于播放.wav格式的文件。
哪些类可以用来播放.mp3格式的文件?
非常感谢您的帮助。

1
您是否需要额外的信息,或者您已经满足了您的需求? - Max
6个回答

45
以下链接提供了一个非常好的教程,介绍如何使用C#从Windows表单播放mp3文件:

http://www.daniweb.com/software-development/csharp/threads/292695/playing-mp3-in-c

这个链接会带您进入一个主题,其中包含有关如何使用Windows表单播放mp3歌曲的大量信息。它还包含了许多其他项目,试图实现相同的目标:

http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/3dbfb9a3-4e14-41d1-afbb-1790420706fe

例如,对于 .mp3 文件,请使用此代码:
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

wplayer.URL = "My MP3 file.mp3";
wplayer.Controls.Play();

您只需将wplayer.Controls.Play();放在Button_Click事件中。

例如,对于.wav文件,请使用以下代码:

System.Media.SoundPlayer player = new System.Media.SoundPlayer();

player.SoundLocation = "Sound.wav";
player.Play();

在Button_Click事件中添加player.Play();,它就可以工作了。

7
虽然很可能已安装Windows Media Player在目标系统上,但您无法百分之百确定。 - Odys
我同意,请参考以下问题进行检查:http://stackoverflow.com/questions/3718152/how-to-check-what-version-of-windows-media-player-is-installed-on-the-machine,因为我认为这与本问题无关。 - Max
这并不像你想象的那样可能。在英国,它甚至是赔率。微软曾被起诉并被迫发布一个没有它的Windows版本,而我现在正在使用它。它不仅缺少媒体播放器,整个媒体命名空间也无法工作,并且会破坏很多媒体播放器。 - John Lord
mp3示例的最后一行应该是: wplayer.controls.play(); // 小写字母。 确保在windows\system32目录中添加对wmp.dll的引用。 - astrosteve

41

1) 最简单的方法是使用WMPLib

WMPLib.WindowsMediaPlayer Player;

private void PlayFile(String url)
{
    Player = new WMPLib.WindowsMediaPlayer();
    Player.PlayStateChange += Player_PlayStateChange;
    Player.URL = url;
    Player.controls.play();
}

private void Player_PlayStateChange(int NewState)
{
    if ((WMPLib.WMPPlayState)NewState == WMPLib.WMPPlayState.wmppsStopped)
    {
        //Actions on stop
    }
}

2) 或者您可以使用开源库 NAudio。它可以使用不同的方法播放 mp3 文件,并且实际上提供了比仅仅播放文件更多的功能。

这很简单,只需要:

using NAudio;
using NAudio.Wave;

IWavePlayer waveOutDevice = new WaveOut();
AudioFileReader audioFileReader = new AudioFileReader("Hadouken! - Ugly.mp3");

waveOutDevice.Init(audioFileReader);
waveOutDevice.Play();

停止后不要忘记处理

waveOutDevice.Stop();
audioFileReader.Dispose();
waveOutDevice.Dispose();

3
因为NAudio的建议而投票支持。这是一个不错的库,正好满足了我的需求。我无法让ClickOnce在我的清单中包含WMP程序集。 - RameyRoad
1
太棒了!正是我所需要的,非常感谢你提供这个图书馆建议! - undefined

11
  1. 首先进入您的项目属性
  2. 点击添加引用
  3. 在“窗口媒体播放器”的COM对象下添加库,然后在您想要的位置输入代码


    来源:

    WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

    wplayer.URL = @"C:\Users\Adil M\Documents\Visual Studio 2012\adil.mp3";
    wplayer.controls.play();

1
该库可以在Windows/System32中找到,名称为wmp.dll。 - Leandro Bardelli

2
您可以使用mciSendString API来播放MP3或WAV文件:
[DllImport("winmm.dll")]
public static extern uint mciSendString( 
    string lpstrCommand,
    StringBuilder lpstrReturnString,
    int uReturnLength,
    IntPtr hWndCallback
);

mciSendString(@"close temp_alias", null, 0, IntPtr.Zero);
mciSendString(@"open ""music.mp3"" alias temp_alias", null, 0, IntPtr.Zero);
mciSendString("play temp_alias repeat", null, 0, IntPtr.Zero);

1
这种方法还支持 .mid、.wav 和 .wma 格式。 - Silent Sojourner
不知道评论只能在5分钟内编辑。无论如何,这个链接值得一提:https://stackoverflow.com/questions/3905732/how-do-i-repeat-a-midi-file-in-c - Silent Sojourner
还要注意文件路径长度的限制:https://dev59.com/v6Pia4cB1Zd3GeqP1J3C - jonyfries
这不是异步的 :'( - Ch'nycos

0

您可以使用旧的 DirectShow 功能来完成它。

这个 答案 教你如何创建 QuartzTypeLib.dll

  1. 运行 tlbimp 工具(在您的情况下路径将不同):

  2. 运行 TlbImp.exe %windir%\system32\quartz.dll /out:QuartzTypeLib.dll

或者,这个项目 包含库 interop.QuartzTypeLib.dll,基本上与步骤1.2.相同。以下步骤教您如何使用此库:

  1. 将生成的QuartzTypeLib.dll作为COM引用添加到您的项目中(在“解决方案资源管理器”中单击项目名称,然后选择“添加”菜单项,再选择“引用”)

  2. 在您的项目中,展开“引用”,找到QuartzTypeLib引用。右键单击它并选择属性,将“嵌入互操作类型”更改为false。(否则,您将无法在项目中使用FilgraphManager类(以及可能还有其他几个类))。

  3. 在项目设置中,在构建选项卡中,我必须禁用Prefer 32-bit标志,否则我会收到此异常:System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80040266

  4. 使用此类播放您喜欢的MP3文件:

    using QuartzTypeLib;
    
    public sealed class DirectShowPlayer
    {
        private FilgraphManager FilterGraph;
    
        public void Play(string path)
        {
            FilgraphManager = new FilgraphManager();
            FilterGraph.RenderFile(path);
            FilterGraph.Run();
        }
    
        public void Stop()
        {
            FilterGraph?.Stop();
        }
    }
    

注意: TlbImp.exe 可以在以下位置找到: "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin" 或者 "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools"


-3

代码重构:

new WindowsMediaPlayer() { URL = "MyMusic.mp3" }.controls.play();

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