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 = "Select an OGG file";
// 设置文件选择对话框的初始目录
openFileDialog.InitialDirectory = @"C:\";
// 设置文件选择对话框的过滤器,只显示 OGG 文件
openFileDialog.Filter = "OGG Files|*.ogg";
// 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox2 中
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Add(openFileDialog.FileName);
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(openFileDialog.FileName);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
}
音量控制
将 WindowsMediaPlayer 控件的音量设置为 trackBar1 滑动条的当前值。
如果 WaveOutDevice 对象已经被初始化(即不为 null),则将其音量也设置为 trackBar1 滑动条的值除以 100,因为 WaveOutDevice.Volume 的范围是 0.0 到 1.0,而滑动条的值通常是 0 到 100 的整数。
这样,用户可以通过移动滑动条来统一控制两种播放设备的音量。
private void volume_trackBar_Scroll(object sender, EventArgs e)
{
// 将 WindowsMediaPlayer 控件的音量设置为滑动条的值
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
// 将 WaveOutDevice 控件的音量设置为滑动条的值
if (waveOutDevice != null)
{
waveOutDevice.Volume = trackBar1.Value / 100f;
}
}
进度控制
当 axWindowsMediaPlayer1 正在播放时,将其当前播放位置设置为 trackBar2 的值。
如果 waveOutDevice 不为空且正在播放,将 vorbisWaveReader 的当前时间设置为 trackBar2 的值对应的秒数。
timer1_Tick 方法:
使用 Timer 控件定期执行。
当 axWindowsMediaPlayer1 正在播放时,设置 trackBar2 的最大值为媒体的持续时间,并将当前值设置为播放器的当前位置。
如果 waveOutDevice 不为空且正在播放,设置 trackBar2 的最大值为 OGG 文件的总时长(秒),并将当前值设置为当前播放时间(秒)。
private void progress_trackBar_Scroll(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = trackBar2.Value;
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
vorbisWaveReader.CurrentTime = TimeSpan.FromSeconds(trackBar2.Value);
}
}
// 使用一个 Timer 控件定期更新滑动条的值
private void timer1_Tick(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
trackBar2.Value = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
trackBar2.Maximum = (int)vorbisWaveReader.TotalTime.TotalSeconds;
trackBar2.Value = (int)vorbisWaveReader.CurrentTime.TotalSeconds;
}
}
上一首
首先获取当前选中的歌曲的索引。并计算上一首歌的索引,确保循环播放。选中上一首歌,获取选中的歌曲的路径。检查歌曲文件是否存在:
- 如果是 .ogg 格式的文件,使用 NAudio.Vorbis 库来播放 OGG 文件。
- 如果不是 .ogg 格式的文件,停止当前正在播放的歌曲,设置播放器的 URL 为选中的歌曲路径,并播放。
如果歌曲文件不存在,则显示错误信息。
private void Previous_Click(object sender, EventArgs e)
{
// 获取当前选中的歌曲的索引
int currentIndex = listBox1.SelectedIndex;
// 计算上一首歌的索引
int previousIndex = (currentIndex - 1 + listBox1.Items.Count) % listBox1.Items.Count;
// 选中上一首歌
listBox1.SelectedIndex = previousIndex;
// 获取选中的歌曲
string previousSong = listBox1.SelectedItem.ToString();
// 检查歌曲文件是否存在
if (File.Exists(previousSong))
{
if (Path.GetExtension(previousSong) == ".ogg")
{
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(previousSong);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
else
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
// 设置播放器的URL为选中的歌曲路径,并播放
axWindowsMediaPlayer1.URL = previousSong;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
else
{
// 如果歌曲文件不存在,显示错误信息
MessageBox.Show($"The file {previousSong} does not exist.");
}
}
暂停
-
检查 Windows Media Player 状态:
如果 axWindowsMediaPlayer1 正在播放音乐(wmppsPlaying 状态),则调用 pause() 方法暂停播放。
如果 axWindowsMediaPlayer1 已经暂停(wmppsPaused 状态),则调用 play() 方法恢复播放。 -
检查 OGG 音乐播放状态:
如果 waveOutDevice 不为空且处于 Playing 状态,调用 Pause() 方法暂停播放。
如果 waveOutDevice 不为空且处于 Paused 状态,调用 Play() 方法恢复播放。
private void pause_Click(object sender, EventArgs e)
{
// 检查播放器的播放状态
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
// 如果当前正在播放音乐,就暂停播放
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
{
// 如果当前音乐已经暂停,就恢复播放
axWindowsMediaPlayer1.Ctlcontrols.play();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
// 如果当前正在播放 OGG 音乐,就暂停播放
waveOutDevice.Pause();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
{
// 如果当前 OGG 音乐已经暂停,就恢复播放
waveOutDevice.Play();
}
}
下一首
首先检查了 Windows Media Player 控件 (axWindowsMediaPlayer1) 的播放状态,如果正在播放音乐,则使用 Ctlcontrols.pause() 方法暂停播放;如果音乐已经暂停,则使用 Ctlcontrols.play() 方法恢复播放。接着检查了使用 NAudio.Vorbis 库播放的 OGG 音乐的播放状态,如果正在播放音乐,则使用 Pause() 方法暂停播放;如果音乐已经暂停,则使用 Play() 方法恢复播放。
private void pause_Click(object sender, EventArgs e)
{
// 检查播放器的播放状态
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
// 如果当前正在播放音乐,就暂停播放
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
{
// 如果当前音乐已经暂停,就恢复播放
axWindowsMediaPlayer1.Ctlcontrols.play();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
// 如果当前正在播放 OGG 音乐,就暂停播放
waveOutDevice.Pause();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
{
// 如果当前 OGG 音乐已经暂停,就恢复播放
waveOutDevice.Play();
}
}
完整代码
using System;
using System.Windows.Forms;
using NAudio.Vorbis;
using NAudio.Wave;
using WMPLib;
using System.IO; // 用于MP3播放
namespace MusicPlay
{
public partial class Form1 : Form
{
WindowsMediaPlayer player = new WindowsMediaPlayer();
private IWavePlayer waveOutDevice;
private AudioFileReader audioFileReader;
private VorbisWaveReader vorbisWaveReader; // 添加这一行
public Form1()
{
InitializeComponent();
timer1.Interval = 1000; // Set the timer interval to 1 second.
timer1.Tick += timer1_Tick; // Attach the Tick event handler.
timer1.Start(); // Start the timer.
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = 50;
}
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.");
}
}
}
private void label1_Click(object sender, EventArgs e)
{
}
private void Previous_Click(object sender, EventArgs e)
{
// 获取当前选中的歌曲的索引
int currentIndex = listBox1.SelectedIndex;
// 计算上一首歌的索引
int previousIndex = (currentIndex - 1 + listBox1.Items.Count) % listBox1.Items.Count;
// 选中上一首歌
listBox1.SelectedIndex = previousIndex;
// 获取选中的歌曲
string previousSong = listBox1.SelectedItem.ToString();
// 检查歌曲文件是否存在
if (File.Exists(previousSong))
{
if (Path.GetExtension(previousSong) == ".ogg")
{
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(previousSong);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
else
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
// 设置播放器的URL为选中的歌曲路径,并播放
axWindowsMediaPlayer1.URL = previousSong;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
else
{
// 如果歌曲文件不存在,显示错误信息
MessageBox.Show($"The file {previousSong} does not exist.");
}
}
private void next_Click(object sender, EventArgs e)
{
// 获取当前选中的歌曲的索引
int currentIndex = listBox1.SelectedIndex;
// 计算下一首歌的索引
int nextIndex = (currentIndex + 1) % listBox1.Items.Count;
// 选中下一首歌
listBox1.SelectedIndex = nextIndex;
// 获取选中的歌曲
string nextSong = listBox1.SelectedItem.ToString();
// 检查歌曲文件是否存在
if (File.Exists(nextSong))
{
if (Path.GetExtension(nextSong) == ".ogg")
{
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(nextSong);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
else
{
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
// 设置播放器的URL为选中的歌曲路径,并播放
axWindowsMediaPlayer1.URL = nextSong;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
else
{
// 如果歌曲文件不存在,显示错误信息
MessageBox.Show($"The file {nextSong} does not exist.");
}
}
private void pause_Click(object sender, EventArgs e)
{
// 检查播放器的播放状态
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
// 如果当前正在播放音乐,就暂停播放
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
{
// 如果当前音乐已经暂停,就恢复播放
axWindowsMediaPlayer1.Ctlcontrols.play();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
// 如果当前正在播放 OGG 音乐,就暂停播放
waveOutDevice.Pause();
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
{
// 如果当前 OGG 音乐已经暂停,就恢复播放
waveOutDevice.Play();
}
}
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;
}
}
private void select_ogg_Click(object sender, EventArgs e)
{
// 创建一个文件选择对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件选择对话框的标题
openFileDialog.Title = "Select an OGG file";
// 设置文件选择对话框的初始目录
openFileDialog.InitialDirectory = @"C:\";
// 设置文件选择对话框的过滤器,只显示 OGG 文件
openFileDialog.Filter = "OGG Files|*.ogg";
// 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox2 中
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Add(openFileDialog.FileName);
// 停止当前正在播放的歌曲
axWindowsMediaPlayer1.Ctlcontrols.stop();
if (waveOutDevice != null)
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
waveOutDevice = null;
}
if (vorbisWaveReader != null)
{
vorbisWaveReader.Dispose();
vorbisWaveReader = null;
}
// 使用 NAudio.Vorbis 来播放 OGG 文件
vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(openFileDialog.FileName);
waveOutDevice = new WaveOut();
waveOutDevice.Init(vorbisWaveReader);
waveOutDevice.Play();
}
}
private void volume_trackBar_Scroll(object sender, EventArgs e)
{
// 将 WindowsMediaPlayer 控件的音量设置为滑动条的值
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
// 将 WaveOutDevice 控件的音量设置为滑动条的值
if (waveOutDevice != null)
{
waveOutDevice.Volume = trackBar1.Value / 100f;
}
}
// 在滑动条的 Scroll 事件处理函数中,将 WindowsMediaPlayer 控件的播放位置设置为滑动条的值
private void progress_trackBar_Scroll(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = trackBar2.Value;
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
vorbisWaveReader.CurrentTime = TimeSpan.FromSeconds(trackBar2.Value);
}
}
// 使用一个 Timer 控件定期更新滑动条的值
private void timer1_Tick(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
trackBar2.Value = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
{
trackBar2.Maximum = (int)vorbisWaveReader.TotalTime.TotalSeconds;
trackBar2.Value = (int)vorbisWaveReader.CurrentTime.TotalSeconds;
}
}
private void label2_Click(object sender, EventArgs e)
{
}
}
}
小结
在本次实验中,我们使用了C#语言和Windows Forms框架来创建一个简单的音乐播放器。我们使用了Windows Media Player库和NAudio库来播放MP3、WAV和OGG格式的音乐文件。
以下是我们在实验中学习到的主要知识点:
- Windows Forms的使用:我们使用Windows Forms创建了一个图形用户界面,包括列表框(用于显示歌曲列表)、按钮(用于控制播放、暂停、选择歌曲等操作)和滑动条(用于控制音量和显示播放进度)。
- Windows Media Player库的使用:我们使用Windows Media Player库来播放MP3和WAV格式的音乐文件。我们学习了如何设置播放器的URL,如何控制播放、暂停和停止,以及如何获取和设置播放进度和音量。
- NAudio库的使用:我们使用NAudio库来播放OGG格式的音乐文件。我们学习了如何创建和初始化VorbisWaveReader和WaveOut对象,以及如何控制播放、暂停和停止。
- 文件操作:我们学习了如何使用OpenFileDialog来让用户选择文件,以及如何使用File.Exists来检查文件是否存在。
- 事件处理:我们学习了如何处理各种事件,如按钮点击事件、列表框选择改变事件、滑动条滚动事件和定时器滴答事件。
- 自动播放下一首歌曲:我们在定时器滴答事件处理函数中添加了代码,用于检查当前歌曲是否已经播放完毕,如果是,则自动播放下一首歌曲。
通过这次实验,我们对C#语言和Windows Forms框架有了更深入的理解,也学习了如何使用Windows Media Player库和NAudio库来播放音乐文件。这对我们今后开发更复杂的音频应用程序将非常有帮助。
GitHub仓库地址:https://github.com/CylioEllejour/MusicPlayer