构建一个简单的音乐播放器:Windows Forms 应用程序与 NAudio 库的完美结合

在当今的数字化时代,音乐已成为我们日常生活中不可或缺的一部分。随着技术的不断进步,构建自己的音乐播放器变得越来越简单。在本文中,我将向您展示如何使用 C# 和 Windows Forms 应用程序,结合强大的 NAudio 库,来构建一个基础但功能齐全的音乐播放器。

一、项目设置与初始化

首先,创建一个新的 Windows Forms 应用程序项目,并为其命名,例如“WindowsFormsApp4”。接下来,通过 NuGet 包管理器安装 NAudio 库,这是一个开源的音频处理库,它将帮助我们处理各种音频格式。

二、界面设计

在 Windows Forms 设计器中,拖拽并放置所需的控件,如 ListBox 用于显示歌曲列表,Button 用于控制播放、停止和下一曲等操作,Label 用于显示当前播放的歌曲名,以及 TrackBar 用于控制音量。

三、功能实现

  1. 加载音乐文件

当用户点击“加载音乐”按钮时,我们打开一个 OpenFileDialog,允许用户选择多个 MP3 文件。选定的文件路径将存储在字符串数组中,并同时添加到 ListBox 和一个本地音乐列表(localmusiclist)中。


  1. 播放音乐

当用户从 ListBox 中选择一个歌曲时,或者点击“下一曲”按钮时,我们将使用 Windows Media Player 控件(axWindowsMediaPlayer1)来播放选定的歌曲。此外,我们还使用了一个名为 musicplay 的辅助函数来处理不同格式的文件。

 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]);
     }
 }
  1. 支持 OGG 格式

为了支持 OGG 格式的音乐文件,我们使用了 NAudio 库中的 VorbisWaveReader 类。当用户点击一个专门为 OGG 文件设计的播放按钮时,我们将使用 NAudio 来播放选定的 OGG 文件。

private void button4_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "打开音频|*.ogg";
    string oggFilePath = "";
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        oggFilePath = openFileDialog.FileName;
    }
    using (var reader = new VorbisWaveReader(oggFilePath))
    {
        using (var outputDevice = new WaveOutEvent())
        {
            outputDevice.Init(reader);
            outputDevice.Play();

            while (outputDevice.PlaybackState == PlaybackState.Playing)
            {
                System.Threading.Thread.Sleep(100);
            }
        }
    }

}

  1. 音量控制

通过 TrackBar 控件,用户可以轻松地调整播放音量。当 TrackBar 的值改变时,我们将更新 Windows Media Player 控件的音量设置。

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

四、总结

通过结合 Windows Forms 和 NAudio 库,我们能够创建一个简单但功能强大的音乐播放器。这个播放器支持多种音频格式,提供了基本的播放控制,以及音量调节功能。这个项目不仅展示了如何使用 C# 和 Windows Forms 构建 GUI 应用程序,还演示了如何集成第三方库来扩展应用程序的功能。希望这个项目能激发您对音频处理和桌面应用程序开发的兴趣!

代码运行结果:

完整代码:

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.Tasks;
using System.Windows.Forms;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        string[] files;

        List<string> localmusiclist = new List<string> { };
        public Form1()
        {
            InitializeComponent();
        }
        private void musicplay(string filename)
        {
            axWindowsMediaPlayer1.URL = filename;
            string extension = Path.GetExtension(filename);

            if (extension == ".ogg") { Console.WriteLine("这是.ogg文件"); }
            else if (extension == ".mp3")
            {
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
            else
            {
                Console.WriteLine("无法识别的文件格式");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
                openFileDialog1.Filter = "选择音频|*.mp3";
                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 x in array)
                    {
                        listBox1.Items.Add(x);
                        localmusiclist.Add(x);
                    }
                }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

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

        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 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 button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "打开音频|*.ogg";
            string oggFilePath = "";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                oggFilePath = openFileDialog.FileName;
            }
            using (var reader = new VorbisWaveReader(oggFilePath))
            {
                using (var outputDevice = new WaveOutEvent())
                {
                    outputDevice.Init(reader);
                    outputDevice.Play();

                    while (outputDevice.PlaybackState == PlaybackState.Playing)
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }

        }

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

clone地址:GitHub - niyuhan666/windows-

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想要我讲解如何使用 C# WinForm 和 NAudio 制作一个音频播放器,并且能够调节音频进度,对吧? 首先,你需要在你的 WinForm 窗口中添加一个 `MediaPlayer` 控件和一个 `TrackBar` 控件。然后在你的代码中引用 NAudio 。 接下来,你需要使用 NAudio 中的 `WaveOut` 类来播放音频文件。你可以使用 `WaveFileReader` 类来读取音频文件,并将其传递给 `WaveOut` 对象进行播放。同时,你需要创建一个计时器来定期更新音频进度条的位置。 以下是示例代码: ```csharp using NAudio.Wave; private WaveOut waveOut; private WaveFileReader audioFile; private Timer timer; private void PlayAudio(string filePath) { audioFile = new WaveFileReader(filePath); waveOut = new WaveOut(); waveOut.Init(audioFile); waveOut.Play(); // 设置计时器 timer = new Timer(); timer.Interval = 100; // 100ms 更新一次 timer.Tick += new EventHandler(timer_Tick); timer.Start(); } private void timer_Tick(object sender, EventArgs e) { if (audioFile != null && waveOut != null) { // 更新进度条位置 trackBar.Value = (int)(audioFile.Position / (double)audioFile.Length * trackBar.Maximum); } } private void trackBar_Scroll(object sender, EventArgs e) { // 跳转到指定位置 if (audioFile != null && waveOut != null) { audioFile.Position = (long)(audioFile.Length * trackBar.Value / (double)trackBar.Maximum); } } private void StopAudio() { if (waveOut != null) { waveOut.Stop(); waveOut.Dispose(); waveOut = null; } if (audioFile != null) { audioFile.Dispose(); audioFile = null; } if (timer != null) { timer.Stop(); timer.Dispose(); timer = null; } } ``` 在上面的代码中,`PlayAudio` 方法接受音频文件的路径作为参数,并使用 `WaveFileReader` 类读取文件。然后,它创建一个 `WaveOut` 对象并使用 `Init` 方法初始化它,最后调用 `Play` 方法开始播放音频。 计时器的 `Tick` 事件处理程序定期更新进度条的位置。它使用 `audioFile.Position` 属性获取当前播放位置,并将其转换为百分比形式,以便更新进度条。 `TrackBar` 控件的 `Scroll` 事件处理程序允许用户手动调整音频进度。它使用 `audioFile.Position` 属性设置音频文件的位置。 最后,`StopAudio` 方法停止播放并释放所有资源。 希望这个示例能帮助你创建一个能够调节音频进度的播放器!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值