实现播放mp3和ogg的WindowsForm程序
要求
要求一
- 程序应能够读取MP3文件,并播放其中的音频。
- 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
- 程序应具有良好的用户界面,方便用户进行操作。
- 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
要求二
- 程序应能够播放ogg文件。
- 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
- 程序应具有良好的用户界面,方便用户进行操作。
- 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
效果展示
效果展示
具体实现
前期准备
首先,你需要有vs里面的.NET framework框架,本文使用的环境是vs 2022的.NET framework 4.7.2的框架。
第一步创建项目(选择带.NET Framework的Windows窗体应用):
得到如下页面则创建成功,可以开始继续下一步:
完成设计简单的UI界面
根据自己喜欢,随意设置想要的背景颜色,选中背景在右下角的属性框内找到BackColor属性,我这里用的是LightGoldenrodYellow,然后从工具栏拖动一个listBox和四个button和一个label过来,设置其属性,得到如下:
label里面放自己想要给你的播放器起的名字,四个按钮对应四个功能,配色随便配OK的。
选择歌曲
先从工具栏拖动一个openFileDialog进来,再双击选择歌曲这个button创造一个button1_Click事件,首先创造一个字符串数组files来存放输入的文件,再创建一个localmusiclist来展现导入的音乐列表,用openFileDialog1.Filter来提示用户应输入.mp3、.flac、.wav的文件。
如果DialogResult.OK,清空原先的列表然后把用户选择的导入的加载进行,这里用了一个try-catch来捕获异常并反馈给用户,具体代码如下:
string[] files;
List<string> localmusiclist = new List<string> { };
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();
localmusiclist.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
string[] array = files;
try
{
foreach (string filePath in array)
{
// 检查文件是否存在
if (File.Exists(filePath))
{
listBox1.Items.Add(filePath);
localmusiclist.Add(filePath);
}
else
{
// 文件不存在,可以记录日志或通知用户
MessageBox.Show($"文件 {filePath} 不存在。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
// 捕获并处理异常
MessageBox.Show($"发生了一个错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
实现播放
导入Naudi.Vorbis控件
使用Nuget程序包导入Naudi.Vorbis控件:
第一步,在上方工具栏找到项目,找到里面的管理NuGet程序包
第二步,搜索安装NAudio.Vorbis
第三步,搜索安装NAudio
第四步,在.cs文件最前面加上其调用语句
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
实现播放
- 先定义两个私有成员,播放器和读取器
private WaveOutEvent waveOut;
private VorbisWaveReader reader;
- 播放之前要取消前面的播放的内容,所以需要先写怎么取消前面的播放,再开始我们的播放,不然会导致同时播放,所以定义了一个StopAndDisposeWaveOut()函数,代码如下:
private void StopAndDisposeWaveOut()
{
// 停止和释放WaveOutEvent
if (waveOut != null)
{
waveOut.Stop();
waveOut.Dispose();
waveOut = null;
}
// 停止和释放VorbisWaveReader
if (reader != null)
{
reader.Dispose();
reader = null;
}
}
- 接下来进入播放ogg文件的具体实现,在实现播放的过程中,先停止和释放之前的播放器和读取器资源,然后加载OGG文件,最后设置音频数据源并开始播放。也需要使用一个try-catch,捕获反馈异常,提升程序的健壮性,代码如下:
private void PlayOgg(string filePath)
{
try
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
StopAndDisposeWaveOut(); // 停止和释放之前的播放器和读取器资源
// 初始化音频输出设备
waveOut = new WaveOutEvent();
// 加载OGG文件
reader = new VorbisWaveReader(filePath);
// 设置音频数据源并开始播放
waveOut.Init(reader);
waveOut.Play();
}
catch (Exception ex)
{
MessageBox.Show($"播放失败: {ex.Message}");
}
}
- 最后,为了代码的更加的可读性和间接性,把播放ogg和播放mp3集成到一个方法里面,所以这个的musicplay函数的代码如下:
private void musicPlay(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg")
{
PlayOgg(filename);
}
else
{
StopAndDisposeWaveOut();
// 对于非OGG文件,使用axWindowsMediaPlayer控件播放
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
- 到目前为止,我们可以成功把选中的mp3文件或者ogg导入到这个listbox了,但是我们还缺少一个listBox1_SelectedIndexChanged方法,能让我们在listbox里面选中我们想要播放的音乐,也就是需要在里面对我们选中的音乐调用musicplay这个方法即可。
需要再拖动一个label进来,用来展示正在播放的音乐,我把它命名为labelplaying,代码如下:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
string selectedFile = localmusiclist[listBox1.SelectedIndex];
string extension = Path.GetExtension(selectedFile).ToLowerInvariant();
// 更新UI显示当前选中的曲目名
labelplaying.Text = Path.GetFileNameWithoutExtension(selectedFile);
// 根据音频文件类型选择播放方式
if (extension == ".ogg")
{
// 对于OGG格式的音频文件,使用NAudio进行播放
PlayOgg(selectedFile);
}
else
{
// 对于其他格式的音频文件,使用Windows Media Player控件进行播放
axWindowsMediaPlayer1.URL = selectedFile;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
}
- 大家如果加上这代码之后没有任何变化。去选中listbox1控件的事件里面,找到SelectedindexChanged,把自己写的代码对应上去:
- 把ogg播放的控件与事件绑定,插入以下代码:
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "打开音频|*.ogg"
};
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string oggFilePath = openFileDialog.FileName;
// 添加文件到列表并更新界面
listBox1.Items.Add(oggFilePath);
localmusiclist.Add(oggFilePath);
// 选中新添加的歌曲
listBox1.SelectedIndex = listBox1.Items.Count - 1;
// 播放选中的OGG文件
PlayOgg(oggFilePath);
// 更新正在播放的曲目信息
labelplaying.Text = Path.GetFileNameWithoutExtension(oggFilePath);
}
}
这样就可以了,点击播放ogg即可实现播放功能,但是播放进度不会在底部显示出来,因为底部的是axWindowsMediaPlayer控件,显示不了ogg播放进度,如果要实现这个功能,需要自己写个来模拟进度,这里我就不展示了。
暂停播放
这个的实现就非常简单了,直接调用控件的stop即可。
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
下一首
这个就需要判断,listbox里面还有没有可以下一首的,直接改变这个的index就行,要是想要实现循环播放呢,这个可以用取模实现,但是也还是有点麻烦,不如直接在超出索引之后,直接把index赋值为0,让他回到第一首播放,就形成了一个这样的循环播放。
private void button3_Click(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
int index = listBox1.SelectedIndex + 1;
if (index >= localmusiclist.Count()) { index = 0; }
axWindowsMediaPlayer1.URL = localmusiclist[index];
musicPlay(axWindowsMediaPlayer1.URL);
labelplaying.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);
listBox1.SelectedIndex = index;
}
}
git仓库地址
github仓库地址
https://github.com/CWJ10242048/WindowsCourseHomeworkCode
总结
用的C#的WindowsForm程序里面的,创建的一个HubuMusicPlayer,里面可以播放mp3文件和ogg文件,用的是WindowsMediaPlayer控件和Naudi.Vorbis控件。
我自认为还有很多可以优化的地方,里面的UI设计也可能不够精美,大家可以随性发挥,不过大家也可以使用这个当做一个入门,希望能给大家带来帮助,希望您给我点个赞,谢谢!