使用C#编写程序,实现音乐播放功能

一.实验目的

要求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 方法来初始化和播放选定的音频文件。同时,为了在播放完成后能够关闭播放器,我们使用了一个循环来等待音频播放完成,然后释放相关资源,并且我还设计了一些按钮交互以便让用户知道自己的操作有效。

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值