C#音乐播放器(WinForm简约小项目)
文章目录
程序内容
要求1:
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
要求2:
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
控件介绍
Windows Media Player COM组件
为什么使用Windows Media Player COM组件
Windows Media Player控件可以播放当前最流行的音频、视频文件和大多数混合型的多媒体文件。
Windows Media Player COM组件功能丰富,适配windows
Windows Media Player 控件的对象模型在 .NET Framework 与非托管代码和脚本中的对象模型基本相同,这为开发者提供了丰富的 API 来控制媒体播放和管理媒体库2。
NAudio
为什么使用NAudio
NAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio截至今日,已有约5.3k的stars。
NAudio功能强大,且其入门容易。
NAudio强大在于:它支持许多音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等(详细介绍可以看Github readme)。
入门容易在于:对C#的语法、结构友好,且对于一个仅仅是播放声音的需求,几行即可搞定:
using(var audioFile = new AudioFileReader(audioFile))
using(var outputDevice = new WaveOutEvent())
{
outputDevice.Init(audioFile);
outputDevice.Play(); // 异步执行
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(1000);
}
}
WinForm界面介绍
- OGG:用于读取OGG后缀的音乐文件,并载入右侧的列表
- Select:用于读取MP3后缀的音乐文件,并载入右侧的列表
- Previous:播放列表中当前歌曲的上一首歌曲
- Pause:
- Next:播放列表中当前歌曲的下一首歌曲
- 音量:可通过调整推子来调整歌曲的播放音量
- 进度:可通过调整推子来调整歌曲的播放进度
上述功能已经对接到Windows Media Player组件中,MP3文件也可通过Windows Media Player组件来播放歌曲,而OGG文件只能通过上述Buttom来播放歌曲。
代码解析
播放列表
用户在 ListBox 控件中选择一个项目时,这段代码会检查所选的歌曲文件是否存在,并根据文件类型决定如何播放它。
如果所选的歌曲是 .ogg 格式的,代码将使用 NAudio.Vorbis 库来播放它。否则,它将使用 axWindowsMediaPlayer 控件来播放其他格式的音乐文件。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// 获取选中的歌曲
if (listBox1.SelectedItem != null)
{
string selectedSong = listBox1.SelectedItem.ToString();
// 检查歌曲文件是否存在
if (File.Exists(selectedSong))
{
if (Path.GetExtension(selectedSong) == ".ogg")
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 清理播放状态
axWindowsMediaPlayer1.URL = string.Empty;
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(selectedSong);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
else
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 清理播放状态
axWindowsMediaPlayer1.URL = string.Empty;
// 设置播放器的URL为选中的歌曲路径
axWindowsMediaPlayer1.URL = selectedSong;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
else
{
// 如果歌曲文件不存在,显示错误信息
MessageBox.Show($"The file {
selectedSong} does not exist.");
}
}
}
通常音乐格式载入
select_Click 方法为用户提供了一个文件选择对话框,用于选择通常格式的音乐文件,并将其添加到播放列表中。这个方法还负责停止当前正在播放的音乐,释放相关资源,并更新 axWindowsMediaPlayer 控件以播放新选择的文件。
private void select_Click(object sender, EventArgs e)
{
// 创建一个文件选择对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件选择对话框的标题
openFileDialog.Title = "Select a song";
// 设置文件选择对话框的初始目录
openFileDialog.InitialDirectory = @"C:\";
// 设置文件选择对话框的过滤器,只显示 MP3 和 WAV 文件
openFileDialog.Filter = "MP3 Files|*.mp3|WAV Files|*.wav|OGG Files|*.ogg";
// 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox1 中
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
listBox1.Items.Add(openFileDialog.FileName);
axWindowsMediaPlayer1.URL = openFileDialog.FileName;
// 设置 TrackBar 控件的 Minimum 和 Maximum 属性
trackBar1.Minimum = 0;
trackBar1.Maximum = 100;
// 设置 progress_trackBar 控件的 Minimum 和 Maximum 属性
trackBar2.Minimum = 0;
trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
}
}
OGG音乐格式音乐载入
使用NAudio 库来创建一个播放 OGG 音频文件的应用程序。预先设置文件对话框,并且在用户选择文件后,您使用 NAudio.Vorbis 来播放音频。
private void select_ogg_Click(object sender, EventArgs e)
{
// 创建一个文件选择对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件选择对话框的标题
openFileDialog.Title =