目录
1.作业内容
编写一个C#程序,实现音乐文件的播放功能
要求1
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
要求2
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
2.设计思路分析与难点
2.1搭建环境
使用vs2022中的Windows窗体应用(.NET Framework)框架来进行项目的实现。
2.2设计思路
1.窗体界面设计:使用vs2022工具箱中的控件来对构建使用界面。
2.代码功能编写:使用openFileDialog来选择歌曲,然后对具体功能进行编写。
3.异常处理:捕获并响应各种可能出现的错误,如文件不存在、文件读取错误等。
2.3设计难点
1.不同格式文件的播放不同:mp3格式的文件和ogg格式的文件所使用的播放方式不同,所以需要使用两个不同的方法来实现。
2.播放列表的循环播放:播放列表中最后一首歌结束之后应该从第一首重新播放,需要使用恰当的方法来进行歌曲播放的循环。
3.窗体设计
根据需求和功能分析,窗体布局应如下:
窗体中每个控件所实现的功能如下:
label:用来显示当前播放歌曲的名字。
ListBox:用来展示歌曲的播放列表。
axWindowsMediaPlayer:用来对当前播放的歌曲进行调控。
Button:用来进行选择歌曲,停止播放,下一曲和播放ogg文件的操作。
trackBar:用来调节音量。
4.代码实现
调用NAudio.Vorbis控件
当创建好的框架后,我们点击编译器最上方的项目选项,找到管理NuGet程序包选项。
然后搜索并安装NAudio
搜索并安装NAudio.Vorbis
在.cs文件的头文件中添加其调用语句。
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
全局变量
string[] files;
List<string> localmusicList = new List<string> { };
private WaveOutEvent outputDevice;
这里我定义了三个全局变量,作用如下:
files:暂时存储选取音乐名
localmusicList:存储歌单列表
outputDevice:定义一个WaveOutEvent类型的变量,便与后续ogg文件的播放
选择歌曲
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
openFileDialog1.Multiselect = true;
这里使用openFileDialog来打开我们所需要选取的文件,并且文件的类型限定为mp3,flac,wav,ogg类型。
localmusicList.Clear();
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
在将歌单载入之前,先将原先的列表进行清空处理,以便我们在后续切换歌单(再次选择文件)的时候,旧歌单和新歌单不会叠加。
files = openFileDialog1.FileNames;
string[] array = files;
try
{
foreach (string x in array)
{
if (File.Exists(x))
{
listBox1.Items.Add(x);
localmusicList.Add(x);
}
else
{
// 文件不存在,可以记录日志或通知用户
MessageBox.Show($"文件 {x} 不存在。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch(Exception ex)
{
//捕获异常
MessageBox.Show("发生了一个错误: "+ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
添加音乐名,并且将音乐名用遍历的方式存储到localmusic
和listbox
中。在添加的过程中使用try_catch来捕获异常并反馈给用户。
播放音乐
private void musicplay(string filesname)
{
string extention=Path.GetExtension(filesname);
if(extention==".ogg")
{
PlayOgg(filesname);
}
else
{
axWindowsMediaPlayer1.URL= filesname;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
ogg文件的播放使用函数PlayOgg播放(后面会说明),如果播放的音乐不是ogg类型的文件,我们只需要将单个文件名filename赋值给axWindowsMediaPlayer1中的URL属性,然后调用axWindowsMediaPlayer1中的方法播放就行。
暂停播放
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
暂停播放比较简单,只需要调用axWindowsMediaPlayer1中的方法进行停止播放即可。
下一曲
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);
label1.Text = Path.GetFileNameWithoutExtension(localmusicList[index]);
listBox1.SelectedIndex = index;
}
}
当播放列表中没有下一首音乐时,需要重新从第一首音乐播放,这里使用的方法是当检查到当前索引超出范围时,直接将它赋值为0,即可播放第一首音乐。
声音控制
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
这里将trackBar1与axWindowsMediaPlayer1的音量控制连接,从而通过trackBar1来进行音量调节。
播放ogg文件
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "选择音频|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openFileDialog.FileName;
listBox1.Items.Add(oggFilePath);
localmusicList.Add(oggFilePath);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
PlayOgg(oggFilePath);
label1.Text = Path.GetFileNameWithoutExtension(oggFilePath);
}
}
这里使用第四个控件来对ogg文件进行播放,但是播放进度无法显示,因为底部的是axWindowsMediaPlayer控件,显示不了ogg播放进度。如果需要显示ogg文件的播放进度则需要通过其他方式来进行展示,这里就不做演示了。
private void PlayOgg(string filename)
{
try
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
outputDevice = new WaveOutEvent();
// 加载OGG文件
VorbisWaveReader reader = new VorbisWaveReader(filename);
// 设置音频数据源并开始播放
outputDevice.Init(reader);
outputDevice.Play();
}
catch (Exception ex)
{
MessageBox.Show("播放失败"+ex.Message);
};
}
这里是函数PlayOgg的实现,也通过了try_catch的模块进行异常处理。
5.完整代码
6.总结
使用C#创建的一个简易的音乐播放器,可以播放mp3和ogg类型的文件。总的来说,功能还是比较简单的,而且播放的文件类型也比较有限。通过这次作业,我觉得还是有很多值得学习的地方。