C#音乐播放器(WinForm简约小项目)

C#音乐播放器(WinForm简约小项目)

程序内容

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

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

控件介绍

Windows Media Player COM组件

为什么使用Windows Media Player COM组件

Windows Media Player控件可以播放当前最流行的音频、视频文件和大多数混合型的多媒体文件。

Windows Media Player COM组件功能丰富,适配windows

Windows Media Player 控件的对象模型在 .NET Framework 与非托管代码和脚本中的对象模型基本相同,这为开发者提供了丰富的 API 来控制媒体播放和管理媒体库2。

NAudio

为什么使用NAudio

NAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio截至今日,已有约5.3k的stars。

NAudio功能强大,且其入门容易。

NAudio强大在于:它支持许多音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等(详细介绍可以看Github readme)。
入门容易在于:对C#的语法、结构友好,且对于一个仅仅是播放声音的需求,几行即可搞定:

using(var audioFile = new AudioFileReader(audioFile))
using(var outputDevice = new WaveOutEvent())
{
    outputDevice.Init(audioFile);
    outputDevice.Play(); // 异步执行
    
    while (outputDevice.PlaybackState == PlaybackState.Playing)
    {
        Thread.Sleep(1000);
    }
}

WinForm界面介绍

在这里插入图片描述

  1. OGG:用于读取OGG后缀的音乐文件,并载入右侧的列表
  2. Select:用于读取MP3后缀的音乐文件,并载入右侧的列表
  3. Previous:播放列表中当前歌曲的上一首歌曲
  4. Pause:
  5. Next:播放列表中当前歌曲的下一首歌曲
  6. 音量:可通过调整推子来调整歌曲的播放音量
  7. 进度:可通过调整推子来调整歌曲的播放进度

上述功能已经对接到Windows Media Player组件中,MP3文件也可通过Windows Media Player组件来播放歌曲,而OGG文件只能通过上述Buttom来播放歌曲。

代码解析

播放列表

用户在 ListBox 控件中选择一个项目时,这段代码会检查所选的歌曲文件是否存在,并根据文件类型决定如何播放它。

如果所选的歌曲是 .ogg 格式的,代码将使用 NAudio.Vorbis 库来播放它。否则,它将使用 axWindowsMediaPlayer 控件来播放其他格式的音乐文件。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    // 获取选中的歌曲
    if (listBox1.SelectedItem != null)
    {
        string selectedSong = listBox1.SelectedItem.ToString();

        // 检查歌曲文件是否存在
        if (File.Exists(selectedSong))
        {
            if (Path.GetExtension(selectedSong) == ".ogg")
            {
                // 停止当前正在播放的歌曲
                axWindowsMediaPlayer1.Ctlcontrols.stop();
                if (waveOutDevice != null)
                {
                    waveOutDevice.Stop();
                    waveOutDevice.Dispose();
                    waveOutDevice = null;
                }
                if (vorbisWaveReader != null)
                {
                    vorbisWaveReader.Dispose();
                    vorbisWaveReader = null;
                }

                // 清理播放状态
                axWindowsMediaPlayer1.URL = string.Empty;

                // 使用 NAudio.Vorbis 来播放 OGG 文件
                vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(selectedSong);
                waveOutDevice = new WaveOut();
                waveOutDevice.Init(vorbisWaveReader);
                waveOutDevice.Play();
            }
            else
            {
                // 停止当前正在播放的歌曲
                axWindowsMediaPlayer1.Ctlcontrols.stop();

                if (waveOutDevice != null)
                {
                    waveOutDevice.Stop();
                    waveOutDevice.Dispose();
                    waveOutDevice = null;
                }
                if (vorbisWaveReader != null)
                {
                    vorbisWaveReader.Dispose();
                    vorbisWaveReader = null;
                }

                // 清理播放状态
                axWindowsMediaPlayer1.URL = string.Empty;

                // 设置播放器的URL为选中的歌曲路径
                axWindowsMediaPlayer1.URL = selectedSong;
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
        }
        else
        {
            // 如果歌曲文件不存在,显示错误信息
            MessageBox.Show($"The file {selectedSong} does not exist.");
        }
    }
}

通常音乐格式载入

select_Click 方法为用户提供了一个文件选择对话框,用于选择通常格式的音乐文件,并将其添加到播放列表中。这个方法还负责停止当前正在播放的音乐,释放相关资源,并更新 axWindowsMediaPlayer 控件以播放新选择的文件。

private void select_Click(object sender, EventArgs e)
{
    // 创建一个文件选择对话框
    OpenFileDialog openFileDialog = new OpenFileDialog();

    // 设置文件选择对话框的标题
    openFileDialog.Title = "Select a song";

    // 设置文件选择对话框的初始目录
    openFileDialog.InitialDirectory = @"C:\";

    // 设置文件选择对话框的过滤器,只显示 MP3 和 WAV 文件
    openFileDialog.Filter = "MP3 Files|*.mp3|WAV Files|*.wav|OGG Files|*.ogg";

    // 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox1 中
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {

        // 停止当前正在播放的歌曲
        axWindowsMediaPlayer1.Ctlcontrols.stop();
        if (waveOutDevice != null)
        {
            waveOutDevice.Stop();
            waveOutDevice.Dispose();
            waveOutDevice = null;
        }
        if (vorbisWaveReader != null)
        {
            vorbisWaveReader.Dispose();
            vorbisWaveReader = null;
        }

        listBox1.Items.Add(openFileDialog.FileName);
        axWindowsMediaPlayer1.URL = openFileDialog.FileName;

        // 设置 TrackBar 控件的 Minimum 和 Maximum 属性
        trackBar1.Minimum = 0;
        trackBar1.Maximum = 100;

        // 设置 progress_trackBar 控件的 Minimum 和 Maximum 属性
        trackBar2.Minimum = 0;
        trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
    }
}

OGG音乐格式音乐载入

使用NAudio 库来创建一个播放 OGG 音频文件的应用程序。预先设置文件对话框,并且在用户选择文件后,您使用 NAudio.Vorbis 来播放音频。

private void select_ogg_Click(object sender, EventArgs e)
{
    // 创建一个文件选择对话框
    OpenFileDialog openFileDialog = new OpenFileDialog();

    // 设置文件选择对话框的标题
    openFileDialog.Title = "Select an OGG file";

    // 设置文件选择对话框的初始目录
    openFileDialog.InitialDirectory = @"C:\";

    // 设置文件选择对话框的过滤器,只显示 OGG 文件
    openFileDialog.Filter = "OGG Files|*.ogg";

    // 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox2 中
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        listBox1.Items.Add(openFileDialog.FileName);

        // 停止当前正在播放的歌曲
        axWindowsMediaPlayer1.Ctlcontrols.stop();
        if (waveOutDevice != null)
        {
            waveOutDevice.Stop();
            waveOutDevice.Dispose();
            waveOutDevice = null;
        }
        if (vorbisWaveReader != null)
        {
            vorbisWaveReader.Dispose();
            vorbisWaveReader = null;
        }

        // 使用 NAudio.Vorbis 来播放 OGG 文件
        vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(openFileDialog.FileName);
        waveOutDevice = new WaveOut();
        waveOutDevice.Init(vorbisWaveReader);
        waveOutDevice.Play();
    }
}

音量控制

将 WindowsMediaPlayer 控件的音量设置为 trackBar1 滑动条的当前值。
如果 WaveOutDevice 对象已经被初始化(即不为 null),则将其音量也设置为 trackBar1 滑动条的值除以 100,因为 WaveOutDevice.Volume 的范围是 0.0 到 1.0,而滑动条的值通常是 0 到 100 的整数。
这样,用户可以通过移动滑动条来统一控制两种播放设备的音量。

private void volume_trackBar_Scroll(object sender, EventArgs e)
{
    // 将 WindowsMediaPlayer 控件的音量设置为滑动条的值
    axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
    // 将 WaveOutDevice 控件的音量设置为滑动条的值
    if (waveOutDevice != null)
    {
        waveOutDevice.Volume = trackBar1.Value / 100f;
    }
}

进度控制

当 axWindowsMediaPlayer1 正在播放时,将其当前播放位置设置为 trackBar2 的值。
如果 waveOutDevice 不为空且正在播放,将 vorbisWaveReader 的当前时间设置为 trackBar2 的值对应的秒数。
timer1_Tick 方法:

使用 Timer 控件定期执行。
当 axWindowsMediaPlayer1 正在播放时,设置 trackBar2 的最大值为媒体的持续时间,并将当前值设置为播放器的当前位置。
如果 waveOutDevice 不为空且正在播放,设置 trackBar2 的最大值为 OGG 文件的总时长(秒),并将当前值设置为当前播放时间(秒)。

private void progress_trackBar_Scroll(object sender, EventArgs e)
{
    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        axWindowsMediaPlayer1.Ctlcontrols.currentPosition = trackBar2.Value;
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
    {
        vorbisWaveReader.CurrentTime = TimeSpan.FromSeconds(trackBar2.Value);
    }
}

// 使用一个 Timer 控件定期更新滑动条的值
private void timer1_Tick(object sender, EventArgs e)
{
    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
        trackBar2.Value = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
    {
        trackBar2.Maximum = (int)vorbisWaveReader.TotalTime.TotalSeconds;
        trackBar2.Value = (int)vorbisWaveReader.CurrentTime.TotalSeconds;
    }
}

上一首

首先获取当前选中的歌曲的索引。并计算上一首歌的索引,确保循环播放。选中上一首歌,获取选中的歌曲的路径。检查歌曲文件是否存在:

  1. 如果是 .ogg 格式的文件,使用 NAudio.Vorbis 库来播放 OGG 文件。
  2. 如果不是 .ogg 格式的文件,停止当前正在播放的歌曲,设置播放器的 URL 为选中的歌曲路径,并播放。

如果歌曲文件不存在,则显示错误信息。

private void Previous_Click(object sender, EventArgs e)
{
    // 获取当前选中的歌曲的索引
    int currentIndex = listBox1.SelectedIndex;

    // 计算上一首歌的索引
    int previousIndex = (currentIndex - 1 + listBox1.Items.Count) % listBox1.Items.Count;

    // 选中上一首歌
    listBox1.SelectedIndex = previousIndex;

    // 获取选中的歌曲
    string previousSong = listBox1.SelectedItem.ToString();

    // 检查歌曲文件是否存在
    if (File.Exists(previousSong))
    {
        if (Path.GetExtension(previousSong) == ".ogg")
        {
            if (waveOutDevice != null)
            {
                waveOutDevice.Stop();
                waveOutDevice.Dispose();
                waveOutDevice = null;
            }
            if (vorbisWaveReader != null)
            {
                vorbisWaveReader.Dispose();
                vorbisWaveReader = null;
            }

            // 使用 NAudio.Vorbis 来播放 OGG 文件
            vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(previousSong);
            waveOutDevice = new WaveOut();
            waveOutDevice.Init(vorbisWaveReader);
            waveOutDevice.Play();
        }
        else
        {
            // 停止当前正在播放的歌曲
            axWindowsMediaPlayer1.Ctlcontrols.stop();

            // 设置播放器的URL为选中的歌曲路径,并播放
            axWindowsMediaPlayer1.URL = previousSong;
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }
    else
    {
        // 如果歌曲文件不存在,显示错误信息
        MessageBox.Show($"The file {previousSong} does not exist.");
    }
}

暂停

  1. 检查 Windows Media Player 状态:
    如果 axWindowsMediaPlayer1 正在播放音乐(wmppsPlaying 状态),则调用 pause() 方法暂停播放。
    如果 axWindowsMediaPlayer1 已经暂停(wmppsPaused 状态),则调用 play() 方法恢复播放。

  2. 检查 OGG 音乐播放状态:
    如果 waveOutDevice 不为空且处于 Playing 状态,调用 Pause() 方法暂停播放。
    如果 waveOutDevice 不为空且处于 Paused 状态,调用 Play() 方法恢复播放。

private void pause_Click(object sender, EventArgs e)
{
    // 检查播放器的播放状态
    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        // 如果当前正在播放音乐,就暂停播放
        axWindowsMediaPlayer1.Ctlcontrols.pause();
    }
    else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
    {
        // 如果当前音乐已经暂停,就恢复播放
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
    {
        // 如果当前正在播放 OGG 音乐,就暂停播放
        waveOutDevice.Pause();
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
    {
        // 如果当前 OGG 音乐已经暂停,就恢复播放
        waveOutDevice.Play();
    }
}

下一首

首先检查了 Windows Media Player 控件 (axWindowsMediaPlayer1) 的播放状态,如果正在播放音乐,则使用 Ctlcontrols.pause() 方法暂停播放;如果音乐已经暂停,则使用 Ctlcontrols.play() 方法恢复播放。接着检查了使用 NAudio.Vorbis 库播放的 OGG 音乐的播放状态,如果正在播放音乐,则使用 Pause() 方法暂停播放;如果音乐已经暂停,则使用 Play() 方法恢复播放。

private void pause_Click(object sender, EventArgs e)
{
    // 检查播放器的播放状态
    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        // 如果当前正在播放音乐,就暂停播放
        axWindowsMediaPlayer1.Ctlcontrols.pause();
    }
    else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
    {
        // 如果当前音乐已经暂停,就恢复播放
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
    {
        // 如果当前正在播放 OGG 音乐,就暂停播放
        waveOutDevice.Pause();
    }
    else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
    {
        // 如果当前 OGG 音乐已经暂停,就恢复播放
        waveOutDevice.Play();
    }
}

完整代码

using System;
using System.Windows.Forms;
using NAudio.Vorbis;
using NAudio.Wave;
using WMPLib;
using System.IO; // 用于MP3播放

namespace MusicPlay
{
    public partial class Form1 : Form
    {
        WindowsMediaPlayer player = new WindowsMediaPlayer();
        private IWavePlayer waveOutDevice;
        private AudioFileReader audioFileReader;
        private VorbisWaveReader vorbisWaveReader; // 添加这一行

        public Form1()
        {
            InitializeComponent();

            timer1.Interval = 1000; // Set the timer interval to 1 second.
            timer1.Tick += timer1_Tick; // Attach the Tick event handler.
            timer1.Start(); // Start the timer.
        }

        private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.settings.volume = 50;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 获取选中的歌曲
            if (listBox1.SelectedItem != null)
            {
                string selectedSong = listBox1.SelectedItem.ToString();

                // 检查歌曲文件是否存在
                if (File.Exists(selectedSong))
                {
                    if (Path.GetExtension(selectedSong) == ".ogg")
                    {
                        // 停止当前正在播放的歌曲
                        axWindowsMediaPlayer1.Ctlcontrols.stop();
                        if (waveOutDevice != null)
                        {
                            waveOutDevice.Stop();
                            waveOutDevice.Dispose();
                            waveOutDevice = null;
                        }
                        if (vorbisWaveReader != null)
                        {
                            vorbisWaveReader.Dispose();
                            vorbisWaveReader = null;
                        }

                        // 清理播放状态
                        axWindowsMediaPlayer1.URL = string.Empty;

                        // 使用 NAudio.Vorbis 来播放 OGG 文件
                        vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(selectedSong);
                        waveOutDevice = new WaveOut();
                        waveOutDevice.Init(vorbisWaveReader);
                        waveOutDevice.Play();
                    }
                    else
                    {
                        // 停止当前正在播放的歌曲
                        axWindowsMediaPlayer1.Ctlcontrols.stop();

                        if (waveOutDevice != null)
                        {
                            waveOutDevice.Stop();
                            waveOutDevice.Dispose();
                            waveOutDevice = null;
                        }
                        if (vorbisWaveReader != null)
                        {
                            vorbisWaveReader.Dispose();
                            vorbisWaveReader = null;
                        }

                        // 清理播放状态
                        axWindowsMediaPlayer1.URL = string.Empty;

                        // 设置播放器的URL为选中的歌曲路径
                        axWindowsMediaPlayer1.URL = selectedSong;
                        axWindowsMediaPlayer1.Ctlcontrols.play();
                    }
                }
                else
                {
                    // 如果歌曲文件不存在,显示错误信息
                    MessageBox.Show($"The file {selectedSong} does not exist.");
                }
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Previous_Click(object sender, EventArgs e)
        {
            // 获取当前选中的歌曲的索引
            int currentIndex = listBox1.SelectedIndex;

            // 计算上一首歌的索引
            int previousIndex = (currentIndex - 1 + listBox1.Items.Count) % listBox1.Items.Count;

            // 选中上一首歌
            listBox1.SelectedIndex = previousIndex;

            // 获取选中的歌曲
            string previousSong = listBox1.SelectedItem.ToString();

            // 检查歌曲文件是否存在
            if (File.Exists(previousSong))
            {
                if (Path.GetExtension(previousSong) == ".ogg")
                {
                    if (waveOutDevice != null)
                    {
                        waveOutDevice.Stop();
                        waveOutDevice.Dispose();
                        waveOutDevice = null;
                    }
                    if (vorbisWaveReader != null)
                    {
                        vorbisWaveReader.Dispose();
                        vorbisWaveReader = null;
                    }

                    // 使用 NAudio.Vorbis 来播放 OGG 文件
                    vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(previousSong);
                    waveOutDevice = new WaveOut();
                    waveOutDevice.Init(vorbisWaveReader);
                    waveOutDevice.Play();
                }
                else
                {
                    // 停止当前正在播放的歌曲
                    axWindowsMediaPlayer1.Ctlcontrols.stop();

                    // 设置播放器的URL为选中的歌曲路径,并播放
                    axWindowsMediaPlayer1.URL = previousSong;
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                }
            }
            else
            {
                // 如果歌曲文件不存在,显示错误信息
                MessageBox.Show($"The file {previousSong} does not exist.");
            }
        }

        private void next_Click(object sender, EventArgs e)
        {
            // 获取当前选中的歌曲的索引
            int currentIndex = listBox1.SelectedIndex;

            // 计算下一首歌的索引
            int nextIndex = (currentIndex + 1) % listBox1.Items.Count;

            // 选中下一首歌
            listBox1.SelectedIndex = nextIndex;

            // 获取选中的歌曲
            string nextSong = listBox1.SelectedItem.ToString();

            // 检查歌曲文件是否存在
            if (File.Exists(nextSong))
            {
                if (Path.GetExtension(nextSong) == ".ogg")
                {
                    if (waveOutDevice != null)
                    {
                        waveOutDevice.Stop();
                        waveOutDevice.Dispose();
                        waveOutDevice = null;
                    }
                    if (vorbisWaveReader != null)
                    {
                        vorbisWaveReader.Dispose();
                        vorbisWaveReader = null;
                    }

                    // 使用 NAudio.Vorbis 来播放 OGG 文件
                    vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(nextSong);
                    waveOutDevice = new WaveOut();
                    waveOutDevice.Init(vorbisWaveReader);
                    waveOutDevice.Play();
                }
                else
                {
                    // 停止当前正在播放的歌曲
                    axWindowsMediaPlayer1.Ctlcontrols.stop();

                    // 设置播放器的URL为选中的歌曲路径,并播放
                    axWindowsMediaPlayer1.URL = nextSong;
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                }
            }
            else
            {
                // 如果歌曲文件不存在,显示错误信息
                MessageBox.Show($"The file {nextSong} does not exist.");
            }
        }
        private void pause_Click(object sender, EventArgs e)
        {
            // 检查播放器的播放状态
            if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
            {
                // 如果当前正在播放音乐,就暂停播放
                axWindowsMediaPlayer1.Ctlcontrols.pause();
            }
            else if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPaused)
            {
                // 如果当前音乐已经暂停,就恢复播放
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
            else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
            {
                // 如果当前正在播放 OGG 音乐,就暂停播放
                waveOutDevice.Pause();
            }
            else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Paused)
            {
                // 如果当前 OGG 音乐已经暂停,就恢复播放
                waveOutDevice.Play();
            }
        }
        private void select_Click(object sender, EventArgs e)
        {
            // 创建一个文件选择对话框
            OpenFileDialog openFileDialog = new OpenFileDialog();

            // 设置文件选择对话框的标题
            openFileDialog.Title = "Select a song";

            // 设置文件选择对话框的初始目录
            openFileDialog.InitialDirectory = @"C:\";

            // 设置文件选择对话框的过滤器,只显示 MP3 和 WAV 文件
            openFileDialog.Filter = "MP3 Files|*.mp3|WAV Files|*.wav|OGG Files|*.ogg";

            // 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox1 中
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {

                // 停止当前正在播放的歌曲
                axWindowsMediaPlayer1.Ctlcontrols.stop();
                if (waveOutDevice != null)
                {
                    waveOutDevice.Stop();
                    waveOutDevice.Dispose();
                    waveOutDevice = null;
                }
                if (vorbisWaveReader != null)
                {
                    vorbisWaveReader.Dispose();
                    vorbisWaveReader = null;
                }

                listBox1.Items.Add(openFileDialog.FileName);
                axWindowsMediaPlayer1.URL = openFileDialog.FileName;

                // 设置 TrackBar 控件的 Minimum 和 Maximum 属性
                trackBar1.Minimum = 0;
                trackBar1.Maximum = 100;

                // 设置 progress_trackBar 控件的 Minimum 和 Maximum 属性
                trackBar2.Minimum = 0;
                trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
            }
        }

        private void select_ogg_Click(object sender, EventArgs e)
        {
            // 创建一个文件选择对话框
            OpenFileDialog openFileDialog = new OpenFileDialog();

            // 设置文件选择对话框的标题
            openFileDialog.Title = "Select an OGG file";

            // 设置文件选择对话框的初始目录
            openFileDialog.InitialDirectory = @"C:\";

            // 设置文件选择对话框的过滤器,只显示 OGG 文件
            openFileDialog.Filter = "OGG Files|*.ogg";

            // 显示文件选择对话框,如果用户选择了一个文件,就将这个文件添加到 listBox2 中
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                listBox1.Items.Add(openFileDialog.FileName);

                // 停止当前正在播放的歌曲
                axWindowsMediaPlayer1.Ctlcontrols.stop();
                if (waveOutDevice != null)
                {
                    waveOutDevice.Stop();
                    waveOutDevice.Dispose();
                    waveOutDevice = null;
                }
                if (vorbisWaveReader != null)
                {
                    vorbisWaveReader.Dispose();
                    vorbisWaveReader = null;
                }

                // 使用 NAudio.Vorbis 来播放 OGG 文件
                vorbisWaveReader = new NAudio.Vorbis.VorbisWaveReader(openFileDialog.FileName);
                waveOutDevice = new WaveOut();
                waveOutDevice.Init(vorbisWaveReader);
                waveOutDevice.Play();
            }
        }

        private void volume_trackBar_Scroll(object sender, EventArgs e)
        {
            // 将 WindowsMediaPlayer 控件的音量设置为滑动条的值
            axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
            // 将 WaveOutDevice 控件的音量设置为滑动条的值
            if (waveOutDevice != null)
            {
                waveOutDevice.Volume = trackBar1.Value / 100f;
            }
        }

        // 在滑动条的 Scroll 事件处理函数中,将 WindowsMediaPlayer 控件的播放位置设置为滑动条的值
        private void progress_trackBar_Scroll(object sender, EventArgs e)
        {
            if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
            {
                axWindowsMediaPlayer1.Ctlcontrols.currentPosition = trackBar2.Value;
            }
            else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
            {
                vorbisWaveReader.CurrentTime = TimeSpan.FromSeconds(trackBar2.Value);
            }
        }

        // 使用一个 Timer 控件定期更新滑动条的值
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
            {
                trackBar2.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
                trackBar2.Value = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
            }
            else if (waveOutDevice != null && waveOutDevice.PlaybackState == PlaybackState.Playing)
            {
                trackBar2.Maximum = (int)vorbisWaveReader.TotalTime.TotalSeconds;
                trackBar2.Value = (int)vorbisWaveReader.CurrentTime.TotalSeconds;
            }
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }
    }
}

小结

在本次实验中,我们使用了C#语言和Windows Forms框架来创建一个简单的音乐播放器。我们使用了Windows Media Player库和NAudio库来播放MP3、WAV和OGG格式的音乐文件。
以下是我们在实验中学习到的主要知识点:

  1. Windows Forms的使用:我们使用Windows Forms创建了一个图形用户界面,包括列表框(用于显示歌曲列表)、按钮(用于控制播放、暂停、选择歌曲等操作)和滑动条(用于控制音量和显示播放进度)。
  2. Windows Media Player库的使用:我们使用Windows Media Player库来播放MP3和WAV格式的音乐文件。我们学习了如何设置播放器的URL,如何控制播放、暂停和停止,以及如何获取和设置播放进度和音量。
  3. NAudio库的使用:我们使用NAudio库来播放OGG格式的音乐文件。我们学习了如何创建和初始化VorbisWaveReader和WaveOut对象,以及如何控制播放、暂停和停止。
  4. 文件操作:我们学习了如何使用OpenFileDialog来让用户选择文件,以及如何使用File.Exists来检查文件是否存在。
  5. 事件处理:我们学习了如何处理各种事件,如按钮点击事件、列表框选择改变事件、滑动条滚动事件和定时器滴答事件。
  6. 自动播放下一首歌曲:我们在定时器滴答事件处理函数中添加了代码,用于检查当前歌曲是否已经播放完毕,如果是,则自动播放下一首歌曲。
    通过这次实验,我们对C#语言和Windows Forms框架有了更深入的理解,也学习了如何使用Windows Media Player库和NAudio库来播放音乐文件。这对我们今后开发更复杂的音频应用程序将非常有帮助。

GitHub仓库地址:https://github.com/CylioEllejour/MusicPlayer

  • 48
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值