C#实现音乐播放器(包括ogg文件的播放和停止、在线播放音乐)

在本篇文章中,我们将学习如何使用C#和Windows Forms创建一个简单的音乐播放器。我们的播放器将支持播放多种音频格式,如MP3、WAV、FLAC,甚至包括OGG文件,并且能够实现异步播放。

一、环境设置

首先确保已经安装了Visual Studio。创建一个新的Windows Forms应用程序项目,并确保你的开发环境中安装了以下必要的库和组件:

  • NAudio库:一个开源的音频和MIDI处理库,它允许我们处理各种音频格式,包括Ogg Vorbis。
  • AxWMPLib:ActiveX Windows Media Player控件的包装器,用于在Windows Forms应用程序中嵌入Windows Media Player。

二、添加组件

从工具箱中拖拽以下组件到窗体上:

  • ListBox: 用于显示音乐文件列表。
  • Label: 显示当前播放歌曲的名称。
  • TrackBar: 用于调整音量。
  • 按钮: 实现添加文件、播放、停止、跳转以及播放OGG文件等功能。

此外,我们还需要一个AxWindowsMediaPlayer控件来播放Windows Media Player支持的音频格式(如MP3、WAV、FLAC)。但请注意,这个控件不支持OGG格式,因此我们需要额外的逻辑来处理它。 

三、代码实现

1.变量声明

Form1类中,我们声明了几个字段来存储音乐文件列表、当前播放的音频设备以及文件路径数组。

public partial class Form1 : Form  
{  
    string[] files;  
    List<string> localmusiclist = new List<string>();  
    WaveOutEvent outputDevice; // 用于Ogg播放  
  
    // ... 其他代码 ...  
}

2.打开音乐文件

button1_Click方法中,我们使用OpenFileDialog来让用户选择音乐文件,并将选定的文件添加到ListBoxlocalmusiclist列表中。

private void button1_Click(object sender, EventArgs e)
{
    openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.flac";
    openFileDialog1.Multiselect = true;

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        listBox1.Items.Clear();// 清空,便于把新的文件导入
        if (files != null)
        {
            Array.Clear(files, 0, files.Length);// 用array做泛类的约束
        }
        files = openFileDialog1.FileNames;// 需要一个数组变量

        string[] array = files;

        foreach (string x in array)
        {
            listBox1.Items.Add(x);
            localmusiclist.Add(x);
        }
    }
}

3.播放控制

当用户从ListBox中选择一个文件时,listBox1_SelectedIndexChanged事件将被触发。我们检查localmusiclist列表是否有音乐文件被选中,并使用AxWindowsMediaPlayer控件播放它。对于OGG文件,我们目前只是简单地打印一条消息,但稍后将添加专门的播放逻辑。

private void musicplay(string filename)
{
    string extension = Path.GetExtension(filename);
    if (extension == ".ogg")
    {
        Console.WriteLine("this is ogg file.");
        // 可以添加特别的播放逻辑,这里先简单打印一条消息
    }
    else
    {
        Console.WriteLine("this is not ogg file.");
        axWindowsMediaPlayer1.Ctlcontrols.play();// 控制按钮的实现
    }
}

注意:在本文中,我们没有实际实现Ogg文件的播放逻辑,因为AxWMPLib控件不支持Ogg格式。为了播放Ogg文件,你可能需要使用NAudio库或其他支持Ogg的库。

4.选中列表项时触发播放

listBox1_SelectedIndexChanged事件中,我们可以检查是否选中了音乐文件,并调用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]);
    }
    else
    {
        Console.WriteLine("no music file");
    }
}

5.音量调节

trackBar1_Scroll事件用于处理音量调节。我们简单地将TrackBar的值设置为AxWindowsMediaPlayer的音量。

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

6.停止和下一首

button2_Click事件用于停止当前音乐的播放,而button3_Click事件则用于切换到下一首音乐。

//停止音乐播放
private void button2_Click(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.Ctlcontrols.stop();
}

//播放下一首
private void button3_Click(object sender, EventArgs e)
{
    int nextIndex = listBox1.SelectedIndex + 1;
    if (nextIndex >= localmusiclist.Count)
    {
        nextIndex = 0;
    }
    axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];// 需要的返回类型为int
    musicplay(axWindowsMediaPlayer1.URL);
    label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
    listBox1.SelectedIndex = nextIndex;
}

7.添加Ogg格式支持

为了播放Ogg格式的音频文件,我们需要使用NAudio库中的VorbisWaveReader类。我们将创建一个新的按钮(button4)来打开一个文件对话框,允许用户选择Ogg文件,并使用PlayOggFileAsync方法来异步播放这些文件。

private async void button4_Click(object sender, EventArgs e)
{
    string oggFilePath = ""; // 替换为你的Ogg文件路径
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "播放音频|*.ogg";

    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        oggFilePath = openFileDialog.FileName;
    }

    if (!string.IsNullOrEmpty(oggFilePath))
    {
        await PlayOggFileAsync(oggFilePath); // 使用异步调用播放Ogg文件  
    }
}

private async Task PlayOggFileAsync(string oggFilePath)
{
    if (File.Exists(oggFilePath))
    {
        using (var vorbisReader = new VorbisWaveReader(oggFilePath))
        {
            outputDevice = new WaveOutEvent();
            outputDevice.Init(vorbisReader);
            outputDevice.Play();

            // 使用异步等待而不是轮询
            await Task.Run(() =>
            {
                while (outputDevice.PlaybackState == PlaybackState.Playing)
                {
                    Thread.Sleep(100); // 减少轮询频率
                }
            });

            // 清理资源
            outputDevice.Stop();
            outputDevice.Dispose();
        }
    }
    else
    {
        Console.WriteLine("文件不存在");// 处理文件不存在的情况
    }
}

注意,我们在PlayOggFileAsync方法中使用Task.Run来在后台线程中轮询播放状态,并使用Thread.Sleep来减少CPU的占用。

8.停止Ogg播放

我们还需要一个按钮(button5)来停止当前播放的Ogg文件。这可以通过检查outputDevice的播放状态并调用其StopDispose方法来实现。

private void button5_Click(object sender, EventArgs e)  
{  
    if (outputDevice != null && outputDevice.PlaybackState == PlaybackState.Playing)  
    {  
        outputDevice.Stop();  
        outputDevice.Dispose();  
        outputDevice = null; // 重置字段以便下次使用  
    }  
}

9.播放在线音乐

为了支持在线音乐的播放,我们可以使用AxWindowsMediaPlayer控件来播放网络上的音频流。我们将创建一个新的按钮(button6)来设置AxWindowsMediaPlayerURL属性并播放在线音乐。

private void button6_Click(object sender, EventArgs e)
{
     string url = "https://webfs.hw.kugou.com/202406221451/96c18d31c2d43c19b533d65f16e74a55/part/0/960139/KGTX/CLTX001/clip_d1269e952df939cf44b3eaadf383f07c.mp3"; //暮色回响-吉星出租
     // 替换为你的在线音乐URL

     axWindowsMediaPlayer1.URL = url;
     axWindowsMediaPlayer1.Ctlcontrols.play();
}

四、界面展示

 

五、分析总结

       通过结合Windows Forms和NAudio库,我们成功地创建了一个简单的音乐播放器。它支持多种音频格式,并提供了基本的播放控制、音量调节和文件选择功能。通过添加对Ogg格式的支持和在线音乐的播放功能,我们的音乐播放器变得更加完善和灵活。用户现在可以播放多种格式的本地音频文件,以及从网络上流式传输音乐。这些改进使得播放器更加用户友好,并增加了其实用性。

       在开发过程中,我们还学习了如何使用异步编程和NAudio库来处理音频数据。这些技能对于构建更复杂的音频应用程序非常有用。希望这篇博客文章对你有所帮助,并激发你进一步探索音频编程的兴趣!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值