基于C#实现简单的音乐播放器

 更新时间:2024年05月09日 14:13:09   作者:不会写前端的小鱼  
这篇文章主要介绍了如何基于C#实现简单的音乐播放器,考虑到需求中的界面友好和跨版本兼容性,我们可以选择选择Windows Forms作为开发平台,Windows Forms提供了一个简单而强大的方法来创建桌面应用程序,文中通过代码示例给大家讲解的非常详细,需要的朋友可以参考下

一、功能需求

  • 播放MP3文件:可播放MP3文件
  • 播放OGG文件:可播放OGG文件
  • 用户界面:一个简单的窗口,包含播放和暂停按钮及文件选择功能
  • 异常处理:程序能处理可能处理可能出现的异常,如文件不存在、文件读取错误等
  • 兼容性:确保代码能在多个c#版本上运行

二、设计思路分析

  • 架构选择

    考虑到需求中的界面友好和跨版本兼容性,我们可以选择选择Windows Forms作为开发平台,Windows Forms提供了一个简单而强大的方法来创建桌面应用程序,并且与C#高度兼容,在开发过程,我们选择.NETFramework 4.8.0进行程序设计。

  • 设计思路

    界面设计: 使用Windows Forms工具箱中的控件如按钮、标签和文件对话框构建用户界面。

    功能编码: 使用OpenFileDialog允许用户选择音频文件。 根据文件扩展名调用相应的播放器对象进行播放。 播放控制,包括开始、暂停和停止。

    异常处理: 捕获并响应各种可能的运行时错误,如文件读取失败、文件格式不支持等,为用户提供清晰的错误信息。

  • 难点分析

    文件格式支持: 处理多种音频格式(MP3,OGG等)要求使用不同的库,这可能导致代码复杂度增加。

    异常处理: 音频文件的播放中可能遇到多种异常情况,如文件损坏、编解码器不支持等。

三、窗体设计

按照需求设计窗体,并进行一定的美化

  • Label:展示当前播放的歌曲
  • Listbox:展示歌曲列表
  • AxWindowsMediaPlayer:播放常规音乐
  • Button:选择歌曲文件、停止播放、下一曲
  • TraceBarl:用于音量控制

四、代码实现

头文件引入

using AxWMPLib;
using NAudio.Vorbis;
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

类成员变量定义

List<string> localmusiclist = new List<string> { };
private WaveOutEvent waveOut = new WaveOutEvent();
private VorbisWaveReader currentVorbisReader;

在类中,localmusiclist在音乐播放时用来追踪和管理用户加载的音乐文件集合,waveOut用于播放ogg文件,currentVorbisReader为当前播放ogg文件的状态

  • 按钮控件

    • 歌曲文件选择

private void button1_Click(object sender, EventArgs e)
{
    string[] files = { };


    openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
    //同时打开多个文件
    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;
        foreach (string file in array)
        {
            string extension = Path.GetExtension(file).ToLower();
            if (extension == ".mp3" || extension == ".flac" || extension == ".wav" || extension == ".ogg")
            {
                listBox1.Items.Add(file);
                localmusiclist.Add(file);
            }
            else
            {
                MessageBox.Show($"不支持的文件格式:{file}", "文件错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
    }
}

这里我们通过Filter方法来限制用户选择的音乐文件,防止后续播放功能报错,并在选择文件之后将选择的音乐列表放置到ListBox中,同时逻辑判断删除已有的列表,并将歌曲播放列表放入localmusiclist中,再通过openFileDialog来判断文件是否读取成功。

  • 暂停播放按钮

private void button2_Click(object sender, EventArgs e)
{
    if (waveOut.PlaybackState == PlaybackState.Playing)
    {
        waveOut.Pause(); // 暂停播放OGG
    }

    axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止其他格式的播放
}

if条件判断,如果在播放ogg就停止播放ogg,如果播放的是普通文件就停止普通播放器就行

  • 播放下一首按钮

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[index]);

       listBox1.SelectedIndex = index;
   }

}

判断Count是否大于0,以此来判断是否能执行下一首播放的逻辑,如果index大于localmusiclist的长度,就将index置0,以此来循环播放列表,在播放时调用musicplay函数来播放音乐,同时用Label来显示当前播放音乐的信息。

  • 音乐选择控件

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]);
    }
}

当listBox1中的音乐选择发生改变时,会触发该事件函数,若localmusiclist.Count > 0,就用musicplay播放选择中的音乐,并更新label1的值

  • 音乐播放函数

private void musicplay(string filename)
{
    string extension = Path.GetExtension(filename).ToLower();
    try
    {
        if (extension == ".ogg")
        {
            if (currentVorbisReader != null)
            {
                // 确保先停止当前播放再释放资源
                if (waveOut.PlaybackState != PlaybackState.Stopped)
                {
                    waveOut.Stop();
                }
                currentVorbisReader.Dispose();
            }

            currentVorbisReader = new VorbisWaveReader(filename);
            waveOut.Init(currentVorbisReader);
            waveOut.Play();
        }
        else
        {
            if (currentVorbisReader != null)
            {
                // 确保先停止当前播放再释放资源
                if (waveOut.PlaybackState != PlaybackState.Stopped)
                {
                    waveOut.Stop();
                }
                currentVorbisReader.Dispose();
            }
            axWindowsMediaPlayer1.URL = filename;
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }
    catch (Exception ex) 
    {
        MessageBox.Show($"无法播放文件:{filename}\n\n错误信息:{ex.Message}", "播放错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

首先获取文件后缀名,然后判断后缀名是否为ogg,若为普通文件,则用c#自带的内置播放器即可完成播放,否则则需要下载安装NAudio的第三方库中的Vorbis和Wave类来实现播放音乐,在播放时要检查是否正在播放ogg音乐,若是则停止播放当前音乐再播放其他音乐,同时这里使用try捕获播放错误来防止读取文件产生的错误导致程序卡死。

  • 音量控制组件

private void trackBar1_Scroll(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}

这里将axWindowsMediaPlayer1的按钮联动到traceBar1上,实现用traceBar1来控制音量。

五、完整代码

```c#
using AxWMPLib;
using NAudio.Vorbis;
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace _4._23上课code
{
    public partial class Form1 : Form
    {
        List<string> localmusiclist = new List<string> { };
        private WaveOutEvent waveOut = new WaveOutEvent();
        private VorbisWaveReader currentVorbisReader;

        public Form1()
        {
            InitializeComponent();
        }

        private void musicplay(string filename)
        {
            string extension = Path.GetExtension(filename).ToLower();
            try
            {
                if (extension == ".ogg")
                {
                    if (currentVorbisReader != null)
                    {
                        // 确保先停止当前播放再释放资源
                        if (waveOut.PlaybackState != PlaybackState.Stopped)
                        {
                            waveOut.Stop();
                        }
                        currentVorbisReader.Dispose();
                    }

                    currentVorbisReader = new VorbisWaveReader(filename);
                    waveOut.Init(currentVorbisReader);
                    waveOut.Play();
                }
                else
                {
                    if (currentVorbisReader != null)
                    {
                        // 确保先停止当前播放再释放资源
                        if (waveOut.PlaybackState != PlaybackState.Stopped)
                        {
                            waveOut.Stop();
                        }
                        currentVorbisReader.Dispose();
                    }
                    axWindowsMediaPlayer1.URL = filename;
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                }
            }
            catch (Exception ex) 
            {
                MessageBox.Show($"无法播放文件:{filename}\n\n错误信息:{ex.Message}", "播放错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {

        }


        private void button1_Click(object sender, EventArgs e)
        {
            string[] files = { };


            openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
            //同时打开多个文件
            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;
                foreach (string file in array)
                {
                    string extension = Path.GetExtension(file).ToLower();
                    if (extension == ".mp3" || extension == ".flac" || extension == ".wav" || extension == ".ogg")
                    {
                        listBox1.Items.Add(file);
                        localmusiclist.Add(file);
                    }
                    else
                    {
                        MessageBox.Show($"不支持的文件格式:{file}", "文件错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            }
        }


        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)
        {
            if (waveOut.PlaybackState == PlaybackState.Playing)
            {
                waveOut.Pause(); // 暂停播放OGG
            }

            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[index]);

                listBox1.SelectedIndex = index;
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}
```

六、总结

以上就是基于C#实现简单的音乐播放器的详细内容,更多关于C#音乐播放器的资料请关注脚本之家其它相关文章!

相关文章

  • 用Linq从一个集合选取几列得到一个新的集合(可改列名)

    用Linq从一个集合选取几列得到一个新的集合(可改列名)

    这篇文章主要介绍了用Linq从一个集合选取几列得到一个新的集合(可改列名),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C# 设计模式系列教程-观察者模式

    C# 设计模式系列教程-观察者模式

    将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
    2016-06-06
  • C#实现基于IE内核的简单浏览器完整实例

    C#实现基于IE内核的简单浏览器完整实例

    这篇文章主要介绍了C#实现基于IE内核的简单浏览器,较为详细的分析了C#实现浏览器的原理与主要功能实现方法,并附带完整实例供大家下载,需要的朋友可以参考下
    2015-07-07
  • C# 实例化接口对象的方法

    C# 实例化接口对象的方法

    下面小编就为大家带来一篇C# 实例化接口对象的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 深入学习C#网络编程之HTTP应用编程(下)

    深入学习C#网络编程之HTTP应用编程(下)

    这篇文章主要介绍了深入学习C#网络编程之HTTP应用编程的相关知识,文中讲解的非常详细,帮助大家更好的学习c#网络编程,感兴趣的朋友可以了解下
    2020-06-06
  • Unity Shader实现翻书效果

    Unity Shader实现翻书效果

    这篇文章主要为大家详细介绍了Unity Shader实现翻书效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • c#生成随机数示例分享

    c#生成随机数示例分享

    这篇文章主要介绍了c#生成随机数示例分享,需要的朋友可以参考下
    2014-03-03
  • C#实现客户端弹出消息框封装类实例

    C#实现客户端弹出消息框封装类实例

    这篇文章主要介绍了C#实现客户端弹出消息框封装类,实例分析了C#弹出窗口的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#读写INI文件的方法

    C#读写INI文件的方法

    这篇文章主要介绍了C#读写INI文件的方法,涉及C#读写ini文件的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • C#中使用jieba.NET、WordCloudSharp制作词云图的步骤

    C#中使用jieba.NET、WordCloudSharp制作词云图的步骤

    之前一篇文章介绍的是使用Python的jieba、wordcloud的库生成词云图,本文则介绍在C#中如何使用jieba.NET、WordCloudSharp库生成词云图,感兴趣的朋友一起看看吧
    2021-07-07

最新评论