c#使用NAudio和WebClient构建一个多功能的音乐播放器

在这篇博客中,我们将介绍如何使用 C# 以及第三方库 NAudio 和 WebClient 来构建一个多功能的音乐播放器应用程序。该播放器不仅可以播放本地音乐文件,还可以通过提供的 URL 下载音乐文件。我们会详细讲解每个步骤,展示关键代码段,并解释其背后的逻辑和技术细节。

引言

现代音乐播放器不仅仅局限于播放本地文件,更多的是提供丰富的功能,例如在线下载、格式支持、播放列表管理等。在本教程中,我们将展示如何构建这样一个具有基本播放和下载功能的音乐播放器。

准备工作

在开始之前,确保你已经安装了 Visual Studio 2022。我们将使用 WinForms 来创建用户界面,并使用 NAudio 库来处理音频文件的播放。

所需库

创建项目

  1. 打开 Visual Studio 2022,创建一个新的 Windows Forms App (.NET Framework) 项目。
  2. 在项目中添加必要的控件,包括 TextBoxButtonListBoxProgressBarTrackBar 等。

设计用户界面

首先,我们设计用户界面。拖放以下控件到表单中,并设置它们的属性:

设计界面之后,我们开始编写代码。

  • TextBox (命名为 textBox1):用于输入下载 URL。
  • Button (命名为 button5):用于启动下载。
  • Button (命名为 button2):用于取消下载。
  • ListBox (命名为 listBox1):用于显示文件路径。
  • ProgressBar (命名为 progressBar1):用于显示下载进度。
  • Label (命名为 label1):用于显示当前播放的文件名。
  • TrackBar (命名为 trackBar1):用于调节音量。

代码实现

初始化组件

首先,在表单的构造函数中初始化组件和 WebClient 实例,并添加事件处理程序。

public Form1()
{
    InitializeComponent();
    webClient = new WebClient();
    webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;
    webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted;
    cancellationTokenSource = new CancellationTokenSource();
}

播放音乐文件

在我们的音乐播放器应用程序中,播放音乐是其中一个核心功能。我们使用了两种不同的方法来播放音乐文件:一种是使用 NAudio 库来播放 OGG 格式的音乐文件,另一种是通过 Windows Media Player 控件播放其他格式的音乐文件(如 MP3、FLAC、WAV 等)。

1. 播放 OGG 格式音乐文件

对于 OGG 格式的音乐文件,我们使用了 NAudio 库提供的 VorbisWaveReaderWaveOutEvent 类。下面是详细的实现步骤:

private void MusicPlay(string filename)
{
    string extension = Path.GetExtension(filename);

    if (extension.Equals(".ogg", StringComparison.OrdinalIgnoreCase))
    {
        Task.Run(() =>
        {
            using (var vorbis = new VorbisWaveReader(filename))
            using (var outputDevice = new WaveOutEvent())
            {
                outputDevice.Init(vorbis);
                outputDevice.Play();

                // 等待播放结束
                while (outputDevice.PlaybackState == PlaybackState.Playing)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
        });
    }
    else
    {
        // 播放其他格式的音乐文件
        axWindowsMediaPlayer1.URL = filename;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
}

解释:

  • MusicPlay 方法接收一个 filename 参数,表示要播放的音乐文件路径。
  • 我们首先获取文件的扩展名,并检查是否为 ".ogg" 格式。
  • 如果是 OGG 格式,我们使用 VorbisWaveReader 打开音频文件,然后将其与 WaveOutEvent 实例进行初始化,最后调用 Play 方法开始播放。
  • 这里使用了 Task.Run 来在后台线程中执行播放操作,以免阻塞主线程。
  • 在播放过程中,我们使用一个循环检查 outputDevice.PlaybackState 是否为 PlaybackState.Playing,如果是则等待 100 毫秒,直到播放结束。
使用 NAudio 播放器的优势

NAudio 提供了强大的音频处理功能,支持多种音频格式的读取和处理,包括 MP3、WAV、FLAC 和 OGG 等。VorbisWaveReader 类专门用于读取 OGG 格式的音频文件,并且可以通过 WaveOutEvent 或其他输出设备进行播放。

2.播放其他格式的音乐文件

对于除 OGG 外的其他音频格式,我们使用了 Windows Media Player 控件 (axWindowsMediaPlayer1) 来进行播放。

else
{
    axWindowsMediaPlayer1.URL = filename;
    axWindowsMediaPlayer1.Ctlcontrols.play();
}

下载文件

使用 WebClient 下载音乐文件

在应用程序中,用户可以通过输入 URL 来下载音乐文件,并自动播放下载完成的文件。这需要使用 WebClient 类来实现文件的下载功能,并且需要处理下载的进度和完成事件。

private async void button5_Click(object sender, EventArgs e)
{
    string url = textBox1.Text; // 获取输入的URL

    if (!string.IsNullOrEmpty(url))
    {
        button5.Enabled = false; // 禁用下载按钮,在下载完成后启用
        button2.Enabled = true;  // 启用取消下载按钮
        progressBar1.Value = 0;  // 重置进度条

        try
        {
            string fileName = Path.GetFileName(new Uri(url).LocalPath);
            string tempFilePath = Path.Combine(Path.GetTempPath(), fileName);

            await webClient.DownloadFileTaskAsync(new Uri(url), tempFilePath);

            listBox1.Items.Add(tempFilePath);
            localMusicList.Add(tempFilePath);

            MessageBox.Show("下载完成!");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"下载文件时出错: {ex.Message}");
        }
        finally
        {
            button5.Enabled = true;  // 启用下载按钮
            button2.Enabled = false; // 禁用取消下载按钮
        }
    }
    else
    {
        MessageBox.Show("请输入有效的URL。");
    }
}
  • 解释:
    • 当用户点击下载按钮 (button5_Click) 后,首先获取用户输入的 URL。
    • 如果 URL 不为空,禁用下载按钮并启用取消下载按钮,同时重置进度条。
    • 使用 webClient.DownloadFileTaskAsync 方法异步下载文件,并指定下载完成后的处理。
    • 下载完成后,将下载的文件路径添加到列表框和本地列表,并显示下载完成的消息框。
    • 如果下载过程中出现异常,捕获并显示错误消息。
    • 最终,无论下载成功或失败,都重新启用下载按钮并禁用取消下载按钮。

  下载进度更新和下载完成事件处理

private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

private void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("下载已取消");
    }
    else if (e.Error != null)
    {
        MessageBox.Show($"下载文件时出错: {e.Error.Message}");
    }

    button5.Enabled = true;  // 启用下载按钮
    button2.Enabled = false; // 禁用取消下载按钮
}
  • WebClient_DownloadProgressChanged 方法处理下载进度更新事件,更新进度条的当前值。
  • WebClient_DownloadFileCompleted 方法处理下载完成事件,根据下载是否取消或出错,显示相应的消息框,并重新启用下载按钮。

取消下载

我们添加一个取消下载的按钮,通过调用 WebClientCancelAsync 方法来实现。

private void button2_Click(object sender, EventArgs e)
{
    webClient.CancelAsync();
}

播放列表和音量调节

我们需要一个列表来管理本地音乐文件,并且可以通过 TrackBar 来调节音量。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    int selectedIndex = listBox1.SelectedIndex;
    if (selectedIndex >= 0)
    {
        string selectedFile = localMusicList[selectedIndex];
        MusicPlay(selectedFile);
        label1.Text = Path.GetFileNameWithoutExtension(selectedFile);
    }
}

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

播放下一首音乐

通过一个按钮实现播放下一首音乐的功能。

private void button3_Click(object sender, EventArgs e)
{
    int index = listBox1.SelectedIndex + 1;
    if (index >= localMusicList.Count)
    {
        index = 0;
    }
    string nextFile = localMusicList[index];
    MusicPlay(nextFile);
    label1.Text = Path.GetFileNameWithoutExtension(nextFile);
    listBox1.SelectedIndex = index;
}

总结

通过上述代码实现,我们展示了如何在 C# 环境下使用 NAudio 和 WebClient 实现音乐的播放和下载功能。这些功能不仅提升了用户体验,还展示了如何利用异步编程和后台任务来处理音频文件的读取、下载和播放操作,为应用程序增添了更多实用性和功能性。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值