一、作业内容
请编写一个C#程序,实现音乐文件的播放功能。
要求1:
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
要求2:
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
二、代码设计
2.1设计思路
- 使用Windows Forms设计用户界面,包括一个ListBox用于显示选中的音频文件列表,一个AxWindowsMediaPlayer控件用于播放MP3、FLAC和WAV文件,一个TrackBar用于控制音量,以及一个Label用于显示当前播放文件的名称。
- 支持通过文件对话框选择多个音频文件,并将它们添加到ListBox中显示。区分不同的音频文件格式,并使用不同的方法或控件来播放它们。
- 对于MP3、FLAC和WAV文件,使用AxWindowsMediaPlayer控件进行播放,因为该控件内置了对这些格式的支持。对于Ogg Vorbis格式(.ogg),由于AxWindowsMediaPlayer不支持,因此使用NAudio库中的VorbisWaveStream和WaveOutEvent类来实现音频的解码和播放。
- 当用户点击“选择文件”按钮时,触发
button1_Click
事件处理程序,打开文件对话框让用户选择音频文件,并将选中的文件添加到ListBox和内部列表中。当ListBox中的选中项改变时,触发listBox1_SelectedIndexChanged
事件处理程序,根据文件的扩展名决定使用哪种方式播放音频,并更新Label以显示当前播放文件的名称。当TrackBar的值改变时,触发trackBar1_Scroll
事件处理程序,更新AxWindowsMediaPlayer的音量设置。
2.2难点
不同音频格式可能需要不同的播放技术或库。例如,MP3、WAV 和 FLAC 可以通过 Windows Media Player 控件轻松播放,但 Ogg Vorbis(.ogg)等格式则需要额外的库(如 NAudio)进行解码和播放。
三、代码实现
1.设计界面
2.定义mp3音乐文件的播放按钮(选择歌曲)
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择歌曲|*.mp3;*.flac;*.wav";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
3.定义音乐显示界面listbox1
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]);
}
4.定义音量调节按钮
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
5.定义暂停音乐按钮
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
6.定义播放下一曲按钮
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.定义播放进度条
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
8.定义播放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;
}
using (var oggReader = new VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new WaveOutEvent())
{
outputDevice.Init(oggReader);
outputDevice.Play();
// 等待播放完成或你可以在这里添加其他逻辑
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100);
}
}
}
}
四、运行结果
1.播放MP3音乐文件
2.播放ogg音乐文件
五、总结
该Windows Forms应用程序,主要功能是支持多种音频格式的播放,特别是包括了对Ogg Vorbis(.ogg)格式的支持。通过使用NAudio库,该项目能够解码和播放Ogg Vorbis音频文件,同时保持了与其他更常见音频格式(如MP3、WAV等)的兼容性。
关键功能:
-
音频文件支持:该项目支持多种音频格式的播放,包括通过Windows Media Player控件播放的MP3、FLAC、WAV等格式,以及使用NAudio库播放的Ogg Vorbis格式。
-
用户界面:提供了一个简洁的Windows Forms界面,允许用户通过文件对话框选择音频文件,并在ListBox中显示选中的文件列表。还包含了一些基本的播放控制元素,如播放/暂停/停止按钮(尽管在给定的代码片段中未显示)。
-
音频播放:使用Windows Media Player控件和NAudio库分别处理不同格式的音频播放。对于Ogg Vorbis格式,特别使用了NAudio库中的VorbisWaveReader和WaveOutEvent类来实现音频的解码和播放。
六、完整代码
using NAudio;
using NAudio.Vorbis;
using AxWMPLib;
using NAudio.Wave;
namespace WinFormsApp2
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string>();
public Form1()
{
InitializeComponent();
}
private void musicplay(string filename)
{
axWindowsMediaPlayer1.URL = filename;
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("这是ogg文件。"); }
else
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择歌曲|*.mp3;*.flac;*.wav";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
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 trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
private void button2_Click(object sender, EventArgs e)
{
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 button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "打开音频|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openFileDialog.FileName;
}
using (var oggReader = new VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new WaveOutEvent())
{
outputDevice.Init(oggReader);
outputDevice.Play();
// 等待播放完成或你可以在这里添加其他逻辑
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100);
}
}
}
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
}
}