文章目录
一、windows程序设计课程作业二
1.作业内容
请编写一个C#程序,实现音乐文件的播放功能。
2.作业要求
要求1:
- 程序应能够读取 MP3 文件,并播放其中的音频。
- 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
- 程序应具有良好的用户界面,方便用户进行操作。
- 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
要求2:
- 程序应能够播放 ogg 文件。
- 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
- 程序应具有良好的用户界面,方便用户进行操作。
- 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
请确保你的代码是完整且可运行的,并附上必要的注释和说明。
二、设计思路
1.窗体设计
这里使用WindowsForms来设计播放器的界面。
运用的控件:
Listbox
:显示所有歌曲。
Lable
:显示正在播放的歌曲。
Button
:选择歌曲,控制播放,切换下一首。
TrackBar
:控制音量
WindowsMediaPlayer
:播放音乐控制音量(不支持ogg音乐)。
OpenFileDialog
:获取音乐文件。
2.代码思路
要设计支持播放MP3、ogg格式的音乐文件,并且支持显示音乐列表、当前音乐、停止、下一首、调节音量的功能。
三、难点及注意事项
1.音乐文件格式
至少应支持MP3、ogg这两种格式的音乐文件,需要使用不同的库来进行相关处理,代码难度更高更复杂。要注意对音乐文件调用合适恰当的库来进行处理。
2.异常处理
对于支持多种文件格式播放的音乐播放器,可能出现格式不支持、文件读取失败、音乐播放失败等异常。要及时针对出现的异常进行判断并修改相关代码。
四、代码实现
1.前期准备
注意对于ogg格式的音乐文件,需要用到Nuget程序包中的Naudi.Vorbis控件。
2.定义相关变量
定义了一些相关变量,files
用于存储选择的音乐文件路径,localmusiclist
用于存储选择的音乐文件路径的列表,waveOutEvent
用于播放音乐文件,vorbisReader
用于读取 ogg 格式的音乐文件。
string[] files;
List<string> localmusiclist = new List<string> { };
private WaveOutEvent waveOutEvent = new WaveOutEvent();
private VorbisWaveReader vorbisReader;
3.选择音乐文件
该部分实现了选择要播放的音乐文件的功能。使用 OpenFileDialog
打开文件选择对话框,允许用户选择多个文件。选择后,将文件路径存储在 files
数组和 localmusiclist
列表中,并在 listBox1
中显示选择的文件。
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
openFileDialog1.Multiselect = true;
//判断是否接收到文件
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
localmusiclist.Clear();
listBox1.Items.Clear();
//清空files
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
//添加选中的歌曲
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string file in array)
{
listBox1.Items.Add(file);
localmusiclist.Add(file);
}
}
}
4.选择要播放的音乐
当用户在 listBox1
中选择一首音乐时,该部分代码会将选择的音乐路径传递给 axWindowsMediaPlayer1
进行播放,并调用 musicplay
方法进行相应处理。同时,还会更新 label1
中显示的正在播放的音乐名称。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)//判断歌单中是否有歌曲
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];//选择歌曲进行播放
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]); //更新正播放的歌曲
}
}
5.异常处理
该部分实现了 musicplay 方法,用于播放选择的音乐文件。根据文件扩展名判断文件类型,对于 ogg 格式的文件,使用 VorbisWaveReader
进行播放;对于其他格式的文件,使用 axWindowsMediaPlayer1
进行播放。同时,还捕获了可能出现的异常,如文件不存在、文件读取错误等,并输出相应的错误信息。
也要先检测当前是否有正在进行播放或者是暂停播放的ogg音乐,防止同时初始化两次WaveOut产生播放异常。
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename);
try
{
if (extension == ".ogg")//判断文件类型
{
if (vorbisReader != null)
{
if (waveOutEvent.PlaybackState != PlaybackState.Stopped)//确保播放是否停止再释放资源
{
waveOutEvent.Stop();
}
vorbisReader.Dispose();
}
//播放ogg音乐文件
vorbisReader = new VorbisWaveReader(filename);
waveOutEvent.Init(vorbisReader);
waveOutEvent.Play();
}
else//播放其他类型文件
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
catch (FileNotFoundException ex)//文件不存在
{
Console.WriteLine(ex.Message);
}
catch (IOException ex)//文件读取错误
{
Console.WriteLine("读取文件时发生错误: " + ex.Message);
}
catch (Exception ex)//其他异常
{
Console.WriteLine("发生未知错误: " + ex.Message);
}
}
6.切换下一首
该部分实现了切换到下一首音乐的功能。通过获取当前选择的音乐在列表中的索引,找到下一首音乐的索引,然后播放下一首音乐,并更新 label1
中显示的正在播放的音乐名称。
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[listBox1.SelectedIndex]);//更新正播放的歌曲
listBox1.SelectedIndex = index;
}
}
7.控制音量
该部分实现了使用 trackBar1
控制音量的功能。当 trackBar1
的值发生变化时,会将 axWindowsMediaPlayer1
的音量设置为相应的值。
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
五、完整代码
using System.Windows.Forms;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
using System.IO;
namespace musicplayer
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string> { };
private WaveOutEvent waveOutEvent = new WaveOutEvent();
private VorbisWaveReader vorbisReader;
public Form1()
{
InitializeComponent();
}
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename);
try
{
if (extension == ".ogg")
{
if (vorbisReader != null)
{
if (waveOutEvent.PlaybackState != PlaybackState.Stopped)
{
waveOutEvent.Stop();
}
vorbisReader.Dispose();
}
vorbisReader = new VorbisWaveReader(filename);
waveOutEvent.Init(vorbisReader);
waveOutEvent.Play();
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
catch (IOException ex)
{
Console.WriteLine("读取文件时发生错误: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("发生未知错误: " + ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
localmusiclist.Clear();
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string file in array)
{
listBox1.Items.Add(file);
localmusiclist.Add(file);
}
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (waveOutEvent.PlaybackState == PlaybackState.Playing)
{
waveOutEvent.Stop();
}
else
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
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[listBox1.SelectedIndex]);
listBox1.SelectedIndex = index;
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
}
}