我正在开发一个WinForm
应用程序。我想在用户单击按钮时播放 MP3 文件。
MP3 文件位于执行应用程序的计算机的文件系统中。
我用谷歌搜索了一段时间,我找到了有关该System.Media.SoundPlayer
课程的信息。但我读过SoundPlayer
该类只能用于播放 .wav 格式的文件。
哪些类可用于播放 .mp3 格式的文件?
任何帮助将不胜感激。
下面的链接提供了一个非常好的教程,关于使用 c# 从 windows 窗体播放 mp3 文件:
http://www.daniweb.com/software-development/csharp/threads/292695/playing-mp3-in-c
此链接将引导您进入一个主题,其中包含有关如何使用 Windows 窗体播放 mp3 歌曲的大量信息。它还包含许多其他项目,试图实现相同的目标:
例如,将此代码用于 .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 事件中,它将起作用。
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();
在 COM 对象下为窗口媒体播放器添加库,然后在需要的位置键入代码
资源:
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = @"C:\Users\Adil M\Documents\Visual Studio 2012\adil.mp3";
wplayer.controls.play();
您可以使用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);
您可以使用旧的 DirectShow 功能来做到这一点。
这个答案教你如何创建QuartzTypeLib.dll
:
运行 tlbimp 工具(在您的情况下路径会不同):
跑TlbImp.exe %windir%\system32\quartz.dll /out:QuartzTypeLib.dll
或者,这个项目包含库,它与步骤1.和2interop.QuartzTypeLib.dll
基本相同。以下步骤教如何使用这个库:
添加生成的 QuartzTypeLib.dll 作为项目的 COM 引用(在“解决方案资源管理器”中的项目名称上单击鼠标右键,然后选择“添加”菜单项,然后选择“引用”)
在您的项目中,展开“参考”,找到 QuartzTypeLib 参考。右键单击它并选择属性,然后将“嵌入互操作类型”更改为 false。(否则,您将无法在项目中使用 FilgraphManager 类(可能还有其他几个))。
在项目设置中,在构建选项卡中,我必须禁用首选 32 位标志,否则我会得到这个异常:System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80040266
使用这个类来播放你最喜欢的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"
重构:
new WindowsMediaPlayer() { URL = "MyMusic.mp3" }.controls.play();