C#实现音乐文件的播放功能

 

目录

一、项目设置

二、变量声明

三、音乐播放功能

四、文件选择功能

五、播放列表和音量控制功能

六、停止播放功能

七、播放下一首功能

八、播放ogg格式文件

九、界面展示

十、总结

     在这篇文章中,我将分享一个基于Windows Forms和Windows Media Player控件的音乐播放器应用的开发过程。这个应用旨在提供一个简单的用户界面,允许用户选择本地音乐文件并播放它们。下面是我创建这个应用的主要步骤和代码实现。

一、项目设置

       首先,我创建了一个新的Windows Forms项目,并在其中添加了一个Form(我将其命名为Form1)。然后,我通过工具箱添加了必要的控件,包括ListBox(用于显示音乐列表)、Button(用于打开文件对话框)、TrackBar(用于控制音量)和Label(用于显示当前播放音乐的名称)。

二、变量声明

       在Form1的类中,我声明了两个变量:一个字符串数组files用于存储用户选择的文件路径,和一个List<string>类型的localmusiclist用于在程序中跟踪这些文件。

namespace 音乐播放器
{
    public partial class Form1 : Form
    {
        string[] files;
        List<string> localmusiclist = new List<string> { };
        public Form1()
        {
            InitializeComponent();
        }
        ...//其他代码行
    }
}

三、音乐播放功能

       我创建了一个名为musicplay的私有方法,用于处理音乐文件的播放。根据文件的扩展名,这个方法可以判断是否为.ogg格式(这需要特殊的播放方法),否则它将使用Windows Media Player控件播放音乐。

private void musicplay(string filename)
{
    string extension = Path.GetExtension(filename);
    if (extension == ".ogg") { Console.WriteLine("this is ogg file."); }//ogg需要特别的播放方法
    else
    {
        Console.WriteLine("this is not ogg file.");
        axWindowsMediaPlayer1.Ctlcontrols.play();//控制按钮的实现
    }
}

注意:由于这个示例中没有实际处理.ogg文件的播放,所以这里只是简单地打印了一条消息。

       如果需要实现ogg文件格式的播放,则在此新增一个方法用于播放ogg文件。首先,确保你已经安装了NAudio库。你可以通过NuGet包管理器来安装它。以下是方法的创建:

private async Task PlayOggFileAsync(string oggFilePath)
{
    if (File.Exists(oggFilePath))
    {
        using (var vorbisReader = new VorbisWaveReader(oggFilePath))
        using (var 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("文件不存在");//处理文件不存在的情况  
    }
}

四、文件选择功能

       当用户点击“添加音乐”按钮时,我使用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;

        //添加新选择的文件到ListBox和localmusiclist 
        foreach (string x in array)
        {
            listBox1.Items.Add(x);
            localmusiclist.Add(x);
        }
    }
}

五、播放列表和音量控制功能

       当用户从ListBox中选择一个音乐文件时,我使用SelectedIndexChanged事件来更新Windows Media Player控件的URL并调用musicplay方法。同时,我还更新了Label以显示当前播放音乐的名称。

       音量控制是通过TrackBar控件实现的。当用户滚动滑块时,我使用Scroll事件来更新Windows Media Player控件的音量设置。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (localmusiclist.Count > 0)//保证有音乐文件被选中
    {
        axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
        musicplay(axWindowsMediaPlayer1.URL);
        //更新Windows Media Player控件的URL并播放音乐  
        //更新Label以显示当前播放音乐的名称 

        label1.Text = 
     Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
    }
}

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

六、停止播放功能

       首先,我们为“停止”按钮(假设其名为button2)添加了一个点击事件处理器。当用户点击该按钮时,将调用Windows Media Player控件的stop方法来停止当前正在播放的音乐。

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

七、播放下一首功能

       接下来,我们为“下一曲”按钮(假设其名为button3)添加了一个点击事件处理器。当用户点击该按钮时,应用将停止当前播放的音乐(如果需要的话),并播放列表中的下一首歌曲。如果当前是列表中的最后一首歌曲,则循环到第一首。

private void button3_Click(object sender, EventArgs e)
{
    int nextIndex = listBox1.SelectedIndex + 1;//获取下一曲的索引
 
    if (nextIndex >= localmusiclist.Count)
    {
        nextIndex = 0;//如果是最后一首,则回到第一首
    }

    //更新播放器和UI
    axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];//需要的返回类型为int
    musicplay(axWindowsMediaPlayer1.URL);
    label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
    listBox1.SelectedIndex = nextIndex;
}

八、播放ogg格式文件

       由于Windows Media Player控件不支持Ogg格式的文件,我们需要使用额外的库来播放这些文件。在以下代码行中,button4_Click事件处理器展示了如何使用VorbisWaveReader(来自NAudio库)和WaveOutEvent来播放Ogg文件。

private async void button4_Click(object sender, EventArgs e)
{
    string oggFilePath = ""; // 替换为你的Ogg文件路径
    OpenFileDialog openfiledialog = new OpenFileDialog();
    openFileDialog1.Filter = "播放音频|*.ogg";
    if (openfiledialog.ShowDialog() == DialogResult.OK)
    {
        oggFilePath = openfiledialog.FileName;
    }
    if (!string.IsNullOrEmpty(oggFilePath))
    {
        await PlayOggFileAsync(oggFilePath); // 使用异步调用播放Ogg文件  
    }
    using (var vorbisReader = new VorbisWaveReader(oggFilePath))
    {
        using (var outputDevice = new WaveOutEvent())
        {
            outputDevice.Init(vorbisReader);
            outputDevice.Play();

            // 等待播放完成或用户输入
            while (outputDevice.PlaybackState == PlaybackState.Playing)
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
}

       请注意,我使用了Task.Run来在后台线程中执行轮询,这样UI线程就不会被阻塞。然而,更好的做法是使用NAudio提供的事件机制来异步地检测播放何时完成。但是,由于NAudio的WaveOutEvent类没有直接提供这样的事件,我们可能需要自己实现或使用其他库。

       另外,由于PlayOggFileAsync是一个异步方法,我们在调用它时使用了await关键字,这意味着调用它的方法(在这个例子中是button4_Click)也需要是异步的,并且返回Taskvoid(对于事件处理程序)。

九、界面展示

十、总结

       音乐播放器功能通过结合内置的axWindowsMediaPlayer1控件和NAudio库,成功实现了对多种音频格式的支持,特别是扩展了对Ogg Vorbis格式的播放能力。播放器利用异步处理技术,保证了在播放音频时用户界面的流畅性,并通过using语句有效管理了非托管资源。

       此外,播放器提供了文件选择对话框,方便用户选择并播放音频文件,增强了用户体验。同时,通过分离不同音频格式的播放逻辑,提高了代码的可维护性和扩展性,使得未来支持更多音频格式变得更加容易。

       然而,音乐播放器功能仍然有进一步完善的空间,比如增加播放控制按钮、音量调节功能、播放列表管理等,以提供更加全面和丰富的用户体验。此外,对于多线程环境中的资源处理也需要格外注意,确保线程安全和避免潜在的问题。总之,上述音乐播放器功能为实现一个完整、多功能的音乐播放器打下了坚实的基础。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值