一.实验目的
要求1:
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
要求2:
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
二.代码详解
主要功能
WindowsMediaPlayer控件的添加
由于需要在播放MP3文件的时候,需要用到Windows media player控件来实现,因此我们需要在设计视图中使用这个控件:
添加工具箱之后在常规中即可找到并拖入设计视图
选择歌曲按钮的添加以及代码编写
在控件中找到button控件,并且将其拖入设计视图,通过左下角小闪电组件将名字改名为选择歌曲,并双击进入代码编写
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);
}
}
}
编写出以上代码,这个按钮实现了文件对话框过滤功能,通过这个来筛选出MP3,falc,wav文件来实现音乐的播放,并且让用户可以选择多个项目来装载进listbox 中,选择完成后再清除listbox1中内容,这个按钮可以让我们选择多个歌曲来播放
listbox的添加及代码编写
实现了歌曲添加按钮后需要把添加的歌曲装入listbox中,因此在工具箱中使用listbox控件并添加,双击后完成以下代码:
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]);
}
}
该代码实现将 Windows Media Player 控件的 URL 属性设置为当前选择的音频文件的路径,使该控件开始播放所选的音频文件调用一个名为 musicplay 的方法,并将当前选择的音频文件的路径作为参数传递给该方法。完成上述内容程序已经可以正常运行,但我们可以增加一些功能使这个音乐播放器更加完善。
label控件的添加
添加一个labelbox来显示目前正在播放的歌曲,代码实现已经在上一步中实现
可以将这个label控件更改为自己喜欢的颜色
ogg音乐格式的播放
实现ogg音乐格式的播放需要使用Nuget来安装Naudi.Vorbis控件,右键依赖项进入后安装
完成后在程序的最前面调用这些库
using NAudio;
using NAudio.Wave;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using Un4seen.Bass;
using NAudio.Vorbis;
调用完成后在设计视图中添加button命名为播放ogg音乐后双击进入代码编辑
private void button5_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "OGG音频文件 (*.ogg)|*.ogg";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string oggFilePath = openFileDialog.FileName;
using (var oggReader = new NAudio.Vorbis.VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new NAudio.Wave.WaveOutEvent())
{
outputDevice.Init(oggReader);
outputDevice.Play();
while (outputDevice.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100);
}
}
}
}
}
创建一个 OpenFileDialog 对象,用于打开文件对话框以选择音频文件,并且设置文件对话框的过滤器,只允许选择 OGG 格式的音频文件 ,点击确定后获取用户选择的 OGG 音频文件的完整路径,使用 NAudio 库创建一个 VorbisWaveReader 对象来读取选定的 OGG 音频文件,然后创建一个 WaveOutEvent 对象作为音频输出设备。开始播放之后使用一个循环来等待音频播放完成,在播放状态为 Playing 时,程序会暂停执行 100 毫秒,然后再次检查播放状态,直到播放完成。
增加功能
下一曲按钮功能实现
添加botton控件改名为下一曲,双击进入代码编写
private void button3_Click(object sender, EventArgs e)
{
int index = listBox1.SelectedIndex + 1;
if (index >= localmusiclist.Count) { index = 0; }
axWindowsMediaPlayer1.URL = localmusiclist[index];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);
listBox1.SelectedIndex = index;
}
使用 Windows Media Player 控件的 URL 属性设置为下一首音频文件的路径,使得该控件开始播放下一首音频文件调用一个名为 musicplay 的方法,并将下一首音频文件的路径作为参数传递给该方法,并将listBox1中的选定项索引设置为下一首音频文件的索引,以确保在列表框中正确显示当前播放的音频文件
暂停播放按钮功能实现
添加button控件改名为暂停播放,双击进入代码编写
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
使用 Windows Media Player 控件的 URL 属性设置为播放暂停
继续播放按钮功能实现
添加button控件改名为继续播放,双击进入代码编写
private void button4_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
使用 Windows Media Player 控件的 URL 属性设置为播放继续
实现音量控制拖动条
添加一个控件名为trackBar,将拖动条的方向样式调试成自己喜欢的样子,双击进入代码编写
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
将Windows Meida Player自己的音量调节与刚刚设置的控件之间进行绑定,以此来实现音量控制功能
完整代码
using NAudio;
using NAudio.Wave;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using Un4seen.Bass;
using NAudio.Vorbis;
namespace WinFormsApp3
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string> { };
public Form1()
{
InitializeComponent();
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
private void musicplay(string filename)
{
axWindowsMediaPlayer1.URL = filename;
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("这是ogg文件。"); }
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
}
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 label1_Click(object sender, EventArgs e)
{
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
private void button3_Click(object sender, EventArgs e)
{
int index = listBox1.SelectedIndex + 1;
if (index >= localmusiclist.Count) { index = 0; }
axWindowsMediaPlayer1.URL = localmusiclist[index];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);
listBox1.SelectedIndex = index;
}
private void button4_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
private void button5_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "OGG音频文件 (*.ogg)|*.ogg";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string oggFilePath = openFileDialog.FileName;
using (var oggReader = new NAudio.Vorbis.VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new NAudio.Wave.WaveOutEvent())
{
outputDevice.Init(oggReader);
outputDevice.Play();
while (outputDevice.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100);
}
}
}
}
}
}
}
三.代码实现音乐播放效果
总结
使用了 NAudio 库来实现音频文件的播放,提供了包括音频文件的读取和播放功能。我使用了 NAudio.Vorbis.VorbisWaveReader 类来读取 OGG 格式的音频文件,并使用 NAudio.Wave.WaveOutEvent 类作为音频输出设备来播放音频。
使用 WaveOutEvent 类的 Init 和 Play 方法来初始化和播放选定的音频文件。同时,为了在播放完成后能够关闭播放器,我们使用了一个循环来等待音频播放完成,然后释放相关资源,并且我还设计了一些按钮交互以便让用户知道自己的操作有效。