一、内容要求
要求1:
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
要求2:
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
二、代码实现
1.基本实现步骤
- 导入所需的命名空间和类库。
using NAudio.Wave; using NAudio.Vorbis; using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms;
- 创建窗体应用程序并定义
MainForm
类。public partial class MainForm : Form { // 程序代码 }
- 定义文件列表和其他需要的变量。
List<string> fileList = new List<string>();
- 创建窗体的构造函数,并在其中进行初始化。
public MainForm() { InitializeComponent(); }
- 实现音乐播放的方法
MusicPlay
。private void MusicPlay(string filename) { string extension = Path.GetExtension(filename); if (extension == ".ogg") { MessageBox.Show("Playing OGG file: " + filename); using (var vorbis = new VorbisWaveReader(filename)) { using (var waveOut = new WaveOutEvent()) { waveOut.Init(vorbis); waveOut.Play(); while (waveOut.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(1000); } } } } else { axWindowsMediaPlayer1.URL = filename; axWindowsMediaPlayer1.Ctlcontrols.play(); } }
- 实现打开文件对话框按钮的点击事件处理方法
BtnOpen_Click
。private void BtnOpen_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Audio Files|*.mp3;*.ogg"; openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { foreach (string filename in openFileDialog.FileNames) { fileList.Add(filename); listBox1.Items.Add(Path.GetFileName(filename)); } } }
- 实现列表框选项改变事件处理方法
ListBox1_SelectedIndexChanged
。private void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedIndex >= 0 && listBox1.SelectedIndex < fileList.Count) { MusicPlay(fileList[listBox1.SelectedIndex]); label1.Text = Path.GetFileName(fileList[listBox1.SelectedIndex]); } }
- 实现音量调节滑动条的滚动事件处理方法
TrackBar1_Scroll
。private void TrackBar1_Scroll(object sender, EventArgs e) { axWindowsMediaPlayer1.settings.volume = trackBar1.Value; }
- 实现停止按钮的点击事件处理方法
BtnStop_Click
。private void BtnStop_Click(object sender, EventArgs e) { axWindowsMediaPlayer1.Ctlcontrols.stop(); }
- 实现下一曲按钮的点击事件处理方法
BtnNext_Click
。private void BtnNext_Click(object sender, EventArgs e) { int nextIndex = listBox1.SelectedIndex + 1; if (nextIndex >= 0 && nextIndex < fileList.Count) { listBox1.SelectedIndex = nextIndex; MusicPlay(fileList[nextIndex]); label1.Text = Path.GetFileName(fileList[nextIndex]); } }
2.难点分析
1.NAudio库的使用:
难点: NAudio是一个功能强大的音频处理库,需要添加。
2.Windows Media Player控件的集成:
难点: 集成Windows Media Player控件(AxWindowsMediaPlayer)可能需要熟悉其属性、方法和事件,以及在Windows窗体应用程序中的配置和使用方法。
3.异常处理:
难点: 需要考虑各种可能的异常情况,如文件不存在、格式不支持等,以确保程序的稳定性和健壮性。
3.完整代码
using NAudio.Wave;
using NAudio.Vorbis;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace AudioPlayerApp
{
public partial class MainForm : Form
{
List<string> fileList = new List<string>();
public MainForm()
{
InitializeComponent();
}
private void MusicPlay(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg")
{
MessageBox.Show("Playing OGG file: " + filename);
using (var vorbis = new VorbisWaveReader(filename))
{
using (var waveOut = new WaveOutEvent())
{
waveOut.Init(vorbis);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(1000);
}
}
}
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void BtnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Audio Files|*.mp3;*.ogg";
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
foreach (string filename in openFileDialog.FileNames)
{
fileList.Add(filename);
listBox1.Items.Add(Path.GetFileName(filename));
}
}
}
private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedIndex >= 0 && listBox1.SelectedIndex < fileList.Count)
{
MusicPlay(fileList[listBox1.SelectedIndex]);
label1.Text = Path.GetFileName(fileList[listBox1.SelectedIndex]);
}
}
private void TrackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
private void BtnStop_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
private void BtnNext_Click(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1;
if (nextIndex >= 0 && nextIndex < fileList.Count)
{
listBox1.SelectedIndex = nextIndex;
MusicPlay(fileList[nextIndex]);
label1.Text = Path.GetFileName(fileList[nextIndex]);
}
}
}
}
OpenFileDialog:用于选择音乐文件。
Button:用于基本功能。
ListBox:用于展示用户选择的歌曲列表。
Label:用于显示当前正在播放的歌曲。
AxWindowsMediaPlayer:用于播放常见音乐格式(不支持ogg)。
三、实验小结
在本次实验中,我们创建了一个音乐播放器应用程序。
(1)音频文件处理:学习如何使用C#处理不同格式的音频文件,包括常见的MP3和WAV格式,以及OGG格式。通过使用NAudio库和Vorbis解码器,可以实现对OGG格式文件的播放。
(2)用户界面:通过 ListBox 和 Label 控件,提供了良好的用户界面,以显示当前播放的歌曲和歌曲列表;添加了按钮来实现播放器的操作,如选择歌曲文件、停止播放和播放下一首。
(3)代码结构:代码采用了面向对象的设计思想,将功能封装在不同的方法中,提高了代码的可读性和可维护性;使用了 NAudio.Wave 和 NAudio.Vorbis 库来处理音频文件的播放,兼容性较好。
(4)功能要求:实现了音乐播放器的基本功能,包括选择音乐文件、播放、停止和播放下一首;
使用了 OpenFileDialog 控件来选择音乐文件,并将选择的文件显示在 ListBox 控件中;
使用了 AxWindowsMediaPlayer 控件来播放常见音乐格式的音乐文件,如MP3和WAV。