6000字详解-C#的WindowsForm开发,实现音乐文件的播放功能,包括mp3文件和ogg文件-Windows程序设计作业2

要求

要求一

  1. 程序应能够读取MP3文件,并播放其中的音频。
  2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
  3. 程序应具有良好的用户界面,方便用户进行操作。
  4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。

要求二

  1. 程序应能够播放ogg文件。
  2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
  3. 程序应具有良好的用户界面,方便用户进行操作。
  4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。

效果展示

效果展示

具体实现

前期准备

首先,你需要有vs里面的.NET framework框架,本文使用的环境是vs 2022的.NET framework 4.7.2的框架。
第一步创建项目(选择带.NET Framework的Windows窗体应用):
在这里插入图片描述
得到如下页面则创建成功,可以开始继续下一步:
在这里插入图片描述

完成设计简单的UI界面

根据自己喜欢,随意设置想要的背景颜色,选中背景在右下角的属性框内找到BackColor属性,我这里用的是LightGoldenrodYellow,然后从工具栏拖动一个listBox和四个button和一个label过来,设置其属性,得到如下:在这里插入图片描述
label里面放自己想要给你的播放器起的名字,四个按钮对应四个功能,配色随便配OK的。

选择歌曲

先从工具栏拖动一个openFileDialog进来,再双击选择歌曲这个button创造一个button1_Click事件,首先创造一个字符串数组files来存放输入的文件,再创建一个localmusiclist来展现导入的音乐列表,用openFileDialog1.Filter来提示用户应输入.mp3、.flac、.wav的文件。
如果DialogResult.OK,清空原先的列表然后把用户选择的导入的加载进行,这里用了一个try-catch来捕获异常并反馈给用户,具体代码如下:

		string[] files;
		List<string> localmusiclist = new List<string> { };
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";
            openFileDialog1.Multiselect = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                listBox1.Items.Clear();
                localmusiclist.Clear();
                if (files != null)
                {
                    Array.Clear(files, 0, files.Length);
                }
                files = openFileDialog1.FileNames;
                string[] array = files;
                try
                {
                    foreach (string filePath in array)
                    {
                        // 检查文件是否存在  
                        if (File.Exists(filePath))
                        {
                            listBox1.Items.Add(filePath);
                            localmusiclist.Add(filePath);
                        }
                        else
                        {
                            // 文件不存在,可以记录日志或通知用户  
                            MessageBox.Show($"文件 {filePath} 不存在。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                catch (Exception ex)
                {
                    // 捕获并处理异常  
                    MessageBox.Show($"发生了一个错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

实现播放

导入Naudi.Vorbis控件

使用Nuget程序包导入Naudi.Vorbis控件:
第一步,在上方工具栏找到项目,找到里面的管理NuGet程序包
在这里插入图片描述
第二步,搜索安装NAudio.Vorbis
在这里插入图片描述
第三步,搜索安装NAudio
在这里插入图片描述
第四步,在.cs文件最前面加上其调用语句

using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;

实现播放

  1. 先定义两个私有成员,播放器和读取器
private WaveOutEvent waveOut;
private VorbisWaveReader reader;
  1. 播放之前要取消前面的播放的内容,所以需要先写怎么取消前面的播放,再开始我们的播放,不然会导致同时播放,所以定义了一个StopAndDisposeWaveOut()函数,代码如下:
private void StopAndDisposeWaveOut()
{
    // 停止和释放WaveOutEvent
    if (waveOut != null)
    {
        waveOut.Stop();
        waveOut.Dispose();
        waveOut = null;
    }

    // 停止和释放VorbisWaveReader
    if (reader != null)
    {
        reader.Dispose();
        reader = null;
    }
}
  1. 接下来进入播放ogg文件的具体实现,在实现播放的过程中,先停止和释放之前的播放器和读取器资源,然后加载OGG文件,最后设置音频数据源并开始播放。也需要使用一个try-catch,捕获反馈异常,提升程序的健壮性,代码如下:
private void PlayOgg(string filePath)
{
    try
    {
        axWindowsMediaPlayer1.Ctlcontrols.stop();
        StopAndDisposeWaveOut(); // 停止和释放之前的播放器和读取器资源
        // 初始化音频输出设备
        waveOut = new WaveOutEvent();

        // 加载OGG文件
        reader = new VorbisWaveReader(filePath);

        // 设置音频数据源并开始播放
        waveOut.Init(reader);
        waveOut.Play();
    }
    catch (Exception ex)
    {
        MessageBox.Show($"播放失败: {ex.Message}");
    }
}
  1. 最后,为了代码的更加的可读性和间接性,把播放ogg和播放mp3集成到一个方法里面,所以这个的musicplay函数的代码如下:
private void musicPlay(string filename)
{
    string extension = Path.GetExtension(filename);
    if (extension == ".ogg")
    {
        PlayOgg(filename);
    }
    else
    {
        StopAndDisposeWaveOut();
        // 对于非OGG文件,使用axWindowsMediaPlayer控件播放
        axWindowsMediaPlayer1.URL = filename;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
}
  1. 到目前为止,我们可以成功把选中的mp3文件或者ogg导入到这个listbox了,但是我们还缺少一个listBox1_SelectedIndexChanged方法,能让我们在listbox里面选中我们想要播放的音乐,也就是需要在里面对我们选中的音乐调用musicplay这个方法即可。
    需要再拖动一个label进来,用来展示正在播放的音乐,我把它命名为labelplaying,代码如下:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (localmusiclist.Count > 0)
    {
        string selectedFile = localmusiclist[listBox1.SelectedIndex];
        string extension = Path.GetExtension(selectedFile).ToLowerInvariant();

        // 更新UI显示当前选中的曲目名
        labelplaying.Text = Path.GetFileNameWithoutExtension(selectedFile);

        // 根据音频文件类型选择播放方式
        if (extension == ".ogg")
        {
            // 对于OGG格式的音频文件,使用NAudio进行播放
            PlayOgg(selectedFile);
        }
        else
        {
            // 对于其他格式的音频文件,使用Windows Media Player控件进行播放
            axWindowsMediaPlayer1.URL = selectedFile;
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }
}
  1. 大家如果加上这代码之后没有任何变化。去选中listbox1控件的事件里面,找到SelectedindexChanged,把自己写的代码对应上去:
    在这里插入图片描述
  2. 把ogg播放的控件与事件绑定,插入以下代码:
private void button4_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog
    {
        Filter = "打开音频|*.ogg"
    };

    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        string oggFilePath = openFileDialog.FileName;

        // 添加文件到列表并更新界面
        listBox1.Items.Add(oggFilePath);
        localmusiclist.Add(oggFilePath);

        // 选中新添加的歌曲
        listBox1.SelectedIndex = listBox1.Items.Count - 1;

        // 播放选中的OGG文件
        PlayOgg(oggFilePath);

        // 更新正在播放的曲目信息
        labelplaying.Text = Path.GetFileNameWithoutExtension(oggFilePath);
    }
}

这样就可以了,点击播放ogg即可实现播放功能,但是播放进度不会在底部显示出来,因为底部的是axWindowsMediaPlayer控件,显示不了ogg播放进度,如果要实现这个功能,需要自己写个来模拟进度,这里我就不展示了。

暂停播放

这个的实现就非常简单了,直接调用控件的stop即可。

private void button2_Click(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.Ctlcontrols.stop();
}

下一首

这个就需要判断,listbox里面还有没有可以下一首的,直接改变这个的index就行,要是想要实现循环播放呢,这个可以用取模实现,但是也还是有点麻烦,不如直接在超出索引之后,直接把index赋值为0,让他回到第一首播放,就形成了一个这样的循环播放。

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);
        labelplaying.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);

        listBox1.SelectedIndex = index;
    }
}

git仓库地址

github仓库地址
https://github.com/CWJ10242048/WindowsCourseHomeworkCode

总结

用的C#的WindowsForm程序里面的,创建的一个HubuMusicPlayer,里面可以播放mp3文件和ogg文件,用的是WindowsMediaPlayer控件和Naudi.Vorbis控件。
我自认为还有很多可以优化的地方,里面的UI设计也可能不够精美,大家可以随性发挥,不过大家也可以使用这个当做一个入门,希望能给大家带来帮助,希望您给我点个赞,谢谢!

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值