目录
1. 作业内容
请编写一个C#程序,实现音乐文件的播放功能。
要求1:
程序应能够读取MP3文件,并播放其中的音频。
程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
程序应具有良好的用户界面,方便用户进行操作。
程序应具有良好的兼容性,能在不同版本的C#中正常运行。提示:此功能可以使用WindowsMediaPlayer控件
要求2:程序应能够播放ogg文件。
程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
程序应具有良好的用户界面,方便用户进行操作。
程序应具有良好的兼容性,能在不同版本的C#中正常运行。提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
2. 设计思路
2.1 架构选择
考虑到需求中的界面友好和跨版本兼容性,我们可以选择选择Windows Forms作为开发平台,Windows Forms提供了一个简单而强大的方法来创建桌面应用程序,并且与C#高度兼容,在开发过程,我们选择.NETFramework 4.8.0进行程序设计。
2.2 设计思路
(1). 界面设计: 使用Windows Forms工具箱中的控件,如按钮、标签和文件对话框构建UI界面。
(2). 功能编码: 使用OpenFileDialog允许用户选择音频文件。 根据文件扩展名调用相应的播放器对象进行播放。 播放控制,包括开始和停止。
(3). 异常处理: 捕获并响应各种可能的运行时错误,如文件读取失败、文件格式不支持等。
3. 窗体设计
4. 代码实现
4.1 播放音乐
// 播放音乐
private void PlayMusic(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg")
{
// 播放Ogg文件
PlayOggFile(filename);
}
else
{
// 使用Windows Media Player播放其他格式的音乐文件
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
label1.Text = Path.GetFileNameWithoutExtension(filename);
}
}
// 播放Ogg文件
private void PlayOggFile(string oggFilePath)
{
// 使用NAudio解码和播放Ogg文件
using (var vorbisReader = new VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new WaveOutEvent())
{
outputDevice.Init(vorbisReader);
outputDevice.Play();
// 等待播放完毕
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(1000);
}
}
}
}
首先使用
Path.GetExtension
方法获取文件的扩展名,以确定文件的类型。如果不是
.ogg
文件,使用 Windows Media Player 控件(axWindowsMediaPlayer1
)来播放该文件。注:在播放前,其会将文件的 URL 设置为该文件的路径,并启动播放,同时更新
label1
的文本,显示正在播放的音频文件的文件名。如果文件扩展名是
.ogg
,则调用PlayOggFile
方法来播放该文件:使用
VorbisWaveReader
类来读取和解码.ogg
文件。创建一个
WaveOutEvent
对象,用于播放音频。使用
Init
方法将vorbisReader
初始化为outputDevice
的输入源。调用
Play
方法开始播放音频。
4.2 浏览文件(选择歌曲)
// 浏览文件
private void BrowseFiles()
{
openFileDialog1.Filter = "选择音频|*.mp3;*.wav;*.flac;*.ogg";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();
foreach (var file in openFileDialog1.FileNames)
{
listBox1.Items.Add(file);
}
}
}
openFileDialog1.Multiselect = true;
这行代码将允许用户在文件对话框中同时选择多个文件。
4.3 音量控制
// 音量滑动条
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
label2.Text = trackBar1.Value + "%";
}
trackBar1.Value
获取了滚动条当前的值,然后直接用这个值来设置媒体播放器的音量。
4.4 播放下一首
// “下一首”按钮
private void button3_Click(object sender, EventArgs e)
{
if (listBox1.Items.Count > 0)
{
int nextIndex = (listBox1.SelectedIndex + 1) % listBox1.Items.Count;
listBox1.SelectedIndex = nextIndex;
}
}
当点击
button3
时,它会循环地选中listBox1
列表框中的下一个项目。如果当前已经是最后一个项目,那么再次点击会选中第一个项目,从而实现循环选择的效果。
4.5 停止播放
private void button2_Click(object sender, EventArgs e)
{
// 停止播放音乐
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
当点击
button2
时,其会停止axWindowsMediaPlayer1
控件中正在播放的音乐。
5. 完整代码
代码仓库:https://github.com/Liquor12345/MusicPlayer1.git
6. 小结
6.1 收获
通过本次练习,我初步了解了如何通过导入第三方库辅助自己的程序设计,并且掌握了如何使用最基本的C#控件来进行UI设计。
6.2 不足及改进
软件可以支持mp3、wav及ogg等音频文件的播放,对于非Ogg格式的文件,程序使用Windows Media Player控件进行播放,而对于Ogg格式的文件,程序使用了NAudio库进行解码和播放。但其并不支持aac等格式的音频文件且目前的用户界面较为简单,只有文件列表、播放控制按钮和正在播放的歌曲名显示。