目录
一、前言
1、功能设计要求1
1). 程序应能够读取MP3文件,并播放其中的音频。
2). 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3). 程序应具有良好的用户界面,方便用户进行操作。
4). 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
2、功能设计要求2
1). 程序应能够播放ogg文件。
2). 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3). 程序应具有良好的用户界面,方便用户进行操作。
4). 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
二、设计思路
通过调用 Windows Media Player 控件和 NAudio 库提供的功能来实现音频文件的播放,同时在用户界面上提供了一些基本的控制功能,如选择文件、调节音量等。
代码的主要步骤和功能:
1)引入所需的命名空间,包括 NAudio.Vorbis 和 NAudio.Wave,用于处理音频文件。
2)创建了一个 Windows 窗体应用程序,其中包含了一些控件,如按钮、列表框、标签和滑块,用于用户交互和显示信息。
3)实现了一个 musicplay 方法,用于根据音频文件的扩展名选择合适的播放方式。
4)实现了按钮点击事件,用于选择音频文件、播放选定的音频文件、停止播放、播放下一首音频 文件以及播放指定的 OGG 文件。
5)实现了列表框选中项改变事件,用于在用户选择不同的音频文件时更新播放器的 URL 标签示。
6)实现了滑块滚动事件,用于调节播放器的音量。
7)实现了文件对话框的打开事件,用于选择音频文件。
8)实现了使用 NAudio.Vorbis 库播放 OGG 文件的功能。
三、窗体设计
1、样式设计
2、控件介绍
1)、Windows Media Player 控件: 这是一个 ActiveX 控件,用于播放音频和视频文件。在 Windows 窗体应用程序中,可以将其添加到窗体中,并通过其属性和方法控制媒体文件的播放、暂停、停止等操作。
2)、按钮控件 (Button): 按钮控件用于在用户单击时触发特定的事件或执行特定的操作。在代码中,有几个按钮用于选择音频文件、播放、停止、播放下一首音频等操作。
3)、列表框控件 (ListBox): 列表框用于显示一列项,并允许用户从中选择一个或多个项。在代码中,列表框用于显示选定的音频文件,并允许用户选择其中一项以播放相应的音频。
4)、标签控件 (Label): 标签控件用于显示文本或图像,通常用于显示静态文本或标识其他控件。在代码中,标签用于显示当前播放的音频文件名和音量值。
5)、滑块控件 (TrackBar): 滑块控件用于允许用户通过拖动滑块来选择值,通常用于调节音量、亮度等参数。在代码中,滑块控件用于调节播放器的音量。
6)、文件对话框 (OpenFileDialog): 文件对话框用于在用户选择文件时打开一个对话框,允许用户浏览文件系统并选择文件。在代码中,文件对话框用于选择要播放的音频文件。
四、功能设计
1、定义变量
存储选定的音频文件路径数组,存储本地音乐文件路径列表
string[] files; // 存储选定的音频文件路径数组
List<string> localmusiclist = new List<string> { }; // 存储本地音乐文件路径列表
2、播放音乐的方法
这段代码定义了一个名为 musicplay 的方法,用于根据音频文件的扩展名来决定如何播放音乐。使用 Path.GetExtension 方法获取文件的扩展名,并将其存储在名为 extension 的字符串变量中。如果文件的扩展名是 ".ogg",则输出 "this is ogg file" 到控制台。这表示文件是 OGG 格式的音频文件。如果文件的扩展名不是 ".ogg",则输出 "this is not ogg" 到控制台,并使用 Windows Media Player 控件播放音乐。这意味着对于不是 OGG 格式的音频文件,程序将使用 Windows Media Player 控件来播放。
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("this is ogg file"); }
else
{
Console.WriteLine("this is not ogg");
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
3、添加音乐
这段代码的主要功能是打开文件对话框,允许用户选择音频文件,并将选定的文件路径添加到列表框和本地音乐列表中。设置文件对话框的筛选条件,只显示扩展名为 ".mp3"、".wav" 和 ".flac" 的音频文件。设置文件对话框允许多选,允许用户同时选择多个文件。如果用户点击了对话框的确定按钮,清空列表框中的项,以便显示新选择的文件。
// 点击按钮1时触发的事件,用于选择音频文件
private void button1_Click_1(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.flac"; // 设置文件对话框的筛选条件
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); // 将选定的文件路径添加到本地音乐列表中
}
}
}
4、播放列表
这段代码的主要功能是根据用户在列表框中选择的音乐文件,将其路径传递给 Windows Media Player 控件,并在界面上显示当前播放的音乐文件的名称。将标签1的文本设置为当前播放的音乐文件的文件名(不含扩展名)。这样可以在界面上显示当前正在播放的音乐文件的名称。
private void label1_Click_1(object sender, EventArgs e)
{
// 这是显示当前播放音乐的标签,点击后触发的事件
}
// 当列表框选中项改变时触发的事件
private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex]; // 设置Windows Media Player的URL为选定项的音乐文件路径
musicplay(axWindowsMediaPlayer1.URL); // 调用musicplay方法播放音乐
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]); // 设置标签显示当前播放的音乐文件名(不含扩展名)
}
}
5、暂停音乐
// 点击按钮2时触发的事件,用于停止播放音乐
private void button2_Click_1(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止Windows Media Player控件的播放
}
6、下一首
将 Windows Media Player 控件的 URL 属性设置为下一首音乐文件的路径。这样可以让 Windows Media Player 播放下一首音乐。将标签1的文本设置为当前播放的音乐文件的文件名(不含扩展名)。这样可以在界面上显示当前正在播放的音乐文件的名称。将列表框的选中项设置为下一首音乐的索引。这样可以在列表框中突出显示当前正在播放的音乐。
// 点击按钮3时触发的事件,用于播放下一首音乐
private void button3_Click_1(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1; // 获取下一首音乐的索引
if (nextIndex >= localmusiclist.Count)
{
nextIndex = 0; // 如果已经是最后一首音乐,则播放第一首音乐
}
axWindowsMediaPlayer1.URL = localmusiclist[nextIndex]; // 设置Windows Media Player的URL为下一首音乐文件路径
musicplay(axWindowsMediaPlayer1.URL); // 调用musicplay方法播放音乐
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]); // 设置标签显示当前播放的音乐文件名(不含扩展名)
listBox1.SelectedIndex = nextIndex; // 设置列表框选中项为下一首音乐的索引
}
7、调节音量
将滑块控件的当前值(即音量值)赋值给 Windows Media Player 控件的音量设置。这样可以通过滑动滑块来调节 Windows Media Player 的音量。将滑块控件的当前值转换为百分比格式,并将其赋值给标签2的文本属性。这样可以在界面上显示当前音量值的百分比。
private void label2_Click_1(object sender, EventArgs e)
{
// 这是音量调节的标签,点击后触发的事件
}
// 滑动音量调节滑块时触发的事件
private void trackBar1_Scroll_1(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value; // 设置Windows Media Player的音量
label2.Text = trackBar1.Value + "%"; // 显示当前音量值
}
8、播放ogg音乐
1)、安装库
2)、播放ogg
这段代码的主要功能是通过使用 NAudio.Vorbis 库来读取并播放指定的 OGG 文件。
// 点击按钮4时触发的事件,用于播放指定的OGG文件
private void button4_Click_1(object sender, EventArgs e)
{
string oggFilePath = "\"C:\\Users\\北极爆爆\\Desktop\\我不存在的世界 - 潘韵淇.ogg\""; // 替换为您的OGG文件路径
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "我不存在的世界 - 潘韵淇|*.ogg"; // 设置文件对话框的筛选条件
if (openFileDialog.ShowDialog() == DialogResult.OK) // 如果用户点击了对话框的确定按钮
{
oggFilePath = openFileDialog.FileName; // 获取用户选定的OGG文件路径
}
using (var vorbisReader = new VorbisWaveReader(oggFilePath)) // 使用NAudio.Vorbis库读取OGG文件
{
using (var outputDevice = new WaveOutEvent()) // 创建音频输出设备
{
outputDevice.Init(vorbisReader); // 初始化输出设备
outputDevice.Play(); // 播放音频
// 等待播放完成,或者您可以在这里添加其他逻辑
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(1000); // 暂停1秒钟
}
}
}
}
五、完整代码
using NAudio.Vorbis;
using NAudio.Wave; // 导入NAudio库
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace WinFormsApp4
{
public partial class Form1 : Form
{
string[] files; // 存储选定的音频文件路径数组
List<string> localmusiclist = new List<string> { }; // 存储本地音乐文件路径列表
public Form1()
{
InitializeComponent();
}
// 播放音乐的方法
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename); // 获取文件扩展名
if (extension == ".ogg") { Console.WriteLine("this is ogg file"); } // 如果是ogg文件,控制台输出提示信息
else
{
Console.WriteLine("this is not ogg"); // 如果不是ogg文件,控制台输出提示信息
axWindowsMediaPlayer1.Ctlcontrols.play(); // 使用Windows Media Player控件播放音乐
}
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
// 在这里可以添加文件对话框选定文件后的处理逻辑
}
// 当列表框选中项改变时触发的事件
private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex]; // 设置Windows Media Player的URL为选定项的音乐文件路径
musicplay(axWindowsMediaPlayer1.URL); // 调用musicplay方法播放音乐
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]); // 设置标签显示当前播放的音乐文件名(不含扩展名)
}
}
// 点击按钮1时触发的事件,用于选择音频文件
private void button1_Click_1(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.flac"; // 设置文件对话框的筛选条件
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); // 将选定的文件路径添加到本地音乐列表中
}
}
}
// 点击按钮2时触发的事件,用于停止播放音乐
private void button2_Click_1(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止Windows Media Player控件的播放
}
// 点击按钮3时触发的事件,用于播放下一首音乐
private void button3_Click_1(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1; // 获取下一首音乐的索引
if (nextIndex >= localmusiclist.Count)
{
nextIndex = 0; // 如果已经是最后一首音乐,则播放第一首音乐
}
axWindowsMediaPlayer1.URL = localmusiclist[nextIndex]; // 设置Windows Media Player的URL为下一首音乐文件路径
musicplay(axWindowsMediaPlayer1.URL); // 调用musicplay方法播放音乐
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]); // 设置标签显示当前播放的音乐文件名(不含扩展名)
listBox1.SelectedIndex = nextIndex; // 设置列表框选中项为下一首音乐的索引
}
// 点击按钮4时触发的事件,用于播放指定的OGG文件
private void button4_Click_1(object sender, EventArgs e)
{
string oggFilePath = "\"C:\\Users\\北极爆爆\\Desktop\\我不存在的世界 - 潘韵淇.ogg\""; // 替换为您的OGG文件路径
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "我不存在的世界 - 潘韵淇|*.ogg"; // 设置文件对话框的筛选条件
if (openFileDialog.ShowDialog() == DialogResult.OK) // 如果用户点击了对话框的确定按钮
{
oggFilePath = openFileDialog.FileName; // 获取用户选定的OGG文件路径
}
using (var vorbisReader = new VorbisWaveReader(oggFilePath)) // 使用NAudio.Vorbis库读取OGG文件
{
using (var outputDevice = new WaveOutEvent()) // 创建音频输出设备
{
outputDevice.Init(vorbisReader); // 初始化输出设备
outputDevice.Play(); // 播放音频
// 等待播放完成,或者您可以在这里添加其他逻辑
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(1000); // 暂停1秒钟
}
}
}
}
private void label2_Click_1(object sender, EventArgs e)
{
// 这是音量调节的标签,点击后触发的事件
}
private void label1_Click_1(object sender, EventArgs e)
{
// 这是显示当前播放音乐的标签,点击后触发的事件
}
// 滑动音量调节滑块时触发的事件
private void trackBar1_Scroll_1(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value; // 设置Windows Media Player的音量
label2.Text = trackBar1.Value + "%"; // 显示当前音量值
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
// 这是Windows Media Player控件进入时触发的事件
}
}
}
六、总结
1、功能概述:
- 程序提供了一个用户界面,包含了按钮、列表框、标签、滑块等控件,用于选择音频文件、控制播放、调节音量等操作。
- 用户可以通过点击按钮来选择音频文件,程序支持多选,并将选定的文件路径显示在列表框中。
- 用户可以通过点击按钮来播放选定的音频文件,或者停止当前的播放,也可以播放下一首音频文件。
- 程序支持播放 MP3、WAV、FLAC 格式的音频文件,并使用 Windows Media Player 控件来播放这些文件。
- 程序支持播放 OGG 格式的音频文件,并使用 NAudio.Vorbis 库中的控件来播放这些文件。
2、重要功能点:
- 使用了 Windows Media Player 控件 (
axWindowsMediaPlayer1
) 来播放 MP3、WAV、FLAC 格式的音频文件。 - 使用了 NAudio.Vorbis 库中的
VorbisWaveReader
控件来播放 OGG 格式的音频文件。 - 实现了对音频文件的选择和多选功能,通过文件对话框 (
OpenFileDialog
) 来实现。 - 实现了通过滑块来调节音量的功能,通过
TrackBar
控件来实现。 - 实现了播放下一首音频文件的功能,通过列表框 (
ListBox
) 来显示选定的音频文件,并通过索引来切换下一首音频文件。
3、代码结构:
- 代码结构清晰,使用了事件处理方法来处理用户的交互操作,每个事件处理方法都实现了特定的功能。
- 代码中使用了注释,对关键代码进行了说明,提高了代码的可读性和可维护性。
4、改进空间:
- 可以考虑增加一些额外的功能,如播放上一首音频文件、添加播放列表、显示音频文件的元数据等,以提升用户体验。
- 可以优化界面布局和美观度,增加一些图标或美化控件样式,使界面更加吸引人。
- 可以增加异常处理机制,对文件读取错误、播放错误等异常进行捕获和处理,提高程序的稳定性和健壮性。
综上所述,这段代码实现了基本的音频播放功能,并提供了一个简单而功能完善的用户界面,可以满足用户对音频文件播放的基本需求。