一.作业内容
请编写一个C#程序,实现音乐文件的播放功能。
要求1:
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
要求2:
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
二.整体的设计
1.工具:vs2022窗体开发功能
2.设计思路:使用vs强大的开发功能使用windows form中的多种控件功能实现音乐播放器
3.整体的功能设计分析:在这个实验中我们需要实现以下功能:打开对应的MP3文件和ogg文件,显示当前播放的音乐,显示音乐列表,控制实现选择歌曲,停止播放,下一首和切换ogg文件歌曲等操作(需要使用button,label等控件实现)
4.文件处理分析:由于需要对于MP3和ogg两种不同的音乐文件进行处理我们需要nuget程序包中的Naudio.Vorbis控件和Naudio的使用
三.窗体设计
整体设计如下图:
图中使用了button,label,listbox,trackbar,openfiledialog等控件实现音乐播放器的功能。
四.具体的代码实现
1.首先为了实现对于ogg的文件处理使用nuget程序添加控件如下图:
blog.csdnimg.cn/direct/bb4eef903ce54d0c8f5c7755edaf7628.png)
2.然后需要对于变量进行定义:
string[] files;
List<string> localmusic = new List<string> { };
` private void musicplay(string filename)
{//播放,以文件名为参数
axWindowsMediaPlayer1.URL = filename;//初始化变量
string extension = Path.GetExtension(filename);//传递文件
axWindowsMediaPlayer1.Ctlcontrols.play();//播放
}
3.对于歌曲文件的选取及播放
首先是对于歌曲的选取利用openfiledoalog控件实现用filter进行筛选同时使用button按键实现 :
private void button1_Click(object sender, EventArgs e)
{
//选择歌曲
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";//格式选择
openFileDialog1.Multiselect = true;//允许多选
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{//用户确定
localmusic.Clear();//清除上一次装载的音乐
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);
localmusic.Add(x);
}
}
}
然后利用listbox控件中的SelectedIndexChanged 选择歌曲的编码SelectedIndex ,并通过SelectedIndex与localmusiclist 进行选择歌曲的播放:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//歌曲列表显示区
if (localmusic.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusic[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(axWindowsMediaPlayer1.URL);
}
}
4. 其他控件的功能实现
比如trackbar实现音量控制,停止播放和下一首歌曲选择:
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 (localmusic.Count > 0)
{
int index = listBox1.SelectedIndex + 1;//下一曲
if (index >= localmusic.Count())
{//实现从最后一曲到第一曲的循环
index = 0;
}
axWindowsMediaPlayer1.URL = localmusic[index];
//播放
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusic[index]);
listBox1.SelectedIndex = index;
}
}
5..对于不同于MP3的ogg文件歌曲播放
对于ogg文件歌曲播放调用naudio第三方库实现:
private void button4_Click(object sender, EventArgs e)
{
//ogg播放
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "打开ogg文件|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openFileDialog.FileName;
using (var vorbis = new VorbisWaveReader(oggFilePath))
{
using (var waveOut = new WaveOutEvent())
{
waveOut.Init(vorbis);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(1000);
}
}
}
}
}
五.最终的运行结果图
六.实验心得体会
编写这个C#音乐播放程序的过程中,我深刻体会到了软件开发中的细致与严谨。在实现MP3和ogg文件播放功能时,我学习并应用了多种技术来处理音频文件和异常。良好的用户界面设计不仅提升了用户体验,也锻炼了我的UI设计能力。通过这次实践,我更加理解了软件开发中用户需求的重要性,以及编写健壮、易用程序所需的技术和策略。
七.最终代码实现
using NAudio.Vorbis;
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusic = new List<string> { };
public Form1()
{
InitializeComponent();
}
private void musicplay(string filename)
{//播放,以文件名为参数
axWindowsMediaPlayer1.URL = filename;//初始化变量
string extension = Path.GetExtension(filename);//传递文件
axWindowsMediaPlayer1.Ctlcontrols.play();//播放
}
private void button1_Click(object sender, EventArgs e)
{
//选择歌曲
openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";//格式选择
openFileDialog1.Multiselect = true;//允许多选
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{//用户确定
localmusic.Clear();//清除上一次装载的音乐
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);
localmusic.Add(x);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
//显示进度条
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//歌曲列表显示区
if (localmusic.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusic[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(axWindowsMediaPlayer1.URL);
}
}
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 (localmusic.Count > 0)
{
int index = listBox1.SelectedIndex + 1;//下一曲
if (index >= localmusic.Count())
{//实现从最后一曲到第一曲的循环
index = 0;
}
axWindowsMediaPlayer1.URL = localmusic[index];
//播放
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusic[index]);
listBox1.SelectedIndex = index;
}
}
private void button4_Click(object sender, EventArgs e)
{
//ogg播放
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "打开ogg文件|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openFileDialog.FileName;
using (var vorbis = new VorbisWaveReader(oggFilePath))
{
using (var waveOut = new WaveOutEvent())
{
waveOut.Init(vorbis);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(1000);
}
}
}
}
}
}
}