56

我正在开发一个WinForm应用程序。我想在用户单击按钮时播放 MP3 文件。

MP3 文件位于执行应用程序的计算机的文件系统中。
我用谷歌搜索了一段时间,我找到了有关该System.Media.SoundPlayer课程的信息。但我读过SoundPlayer该类只能用于播放 .wav 格式的文件。

哪些类可用于播放 .mp3 格式的文件?

任何帮助将不胜感激。

4

6 回答 6

43

下面的链接提供了一个非常好的教程,关于使用 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();

放播放器.Play(); 在 Button_Click 事件中,它将起作用。

于 2013-02-22T13:56:36.183 回答
36

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();
于 2013-02-22T13:54:44.170 回答
9
  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();
    
于 2015-02-07T16:54:44.447 回答
2

您可以使用mciSendStringAPI 播放 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);
于 2016-06-24T06:20:50.483 回答
0

您可以使用旧的 DirectShow 功能来做到这一点。

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

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

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

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

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

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

  3. 在项目设置中,在构建选项卡中,我必须禁用首选 32 位标志,否则我会得到这个异常: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();
        }
    }
    

PS: 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"

于 2019-10-03T00:46:35.223 回答
-3

重构:

new WindowsMediaPlayer() { URL = "MyMusic.mp3" }.controls.play();
于 2017-09-18T00:08:53.603 回答