【C#】实现基本音乐播放功能——Windows程序设计作业2

一.功能说明

请编写一个C#程序,实现音乐文件的播放功能,要求如下:

      1)  程序应能够读取MP3文件,并播放其中的音频
      2) 应能够播放ogg文件

       3)程序应具有良好的用户界面,方便用户进行操作

       4)程序应具有良好的兼容性,能在不同版本的C#中正常运行。

二. 窗体设计:

如图所示:

   其中,各控件实现功能如下:
    Label:展示当前播放的歌曲。
    ListBox:展示选择的歌曲列表。
    AxWindowsMediaPlayer:用于播放常规格式音乐(ogg无法用此播放)。
    OpenFileDialog:用于选择音乐文件。
    Button:用于选择歌曲文件、停止播放、下一曲的功能实现。
    TrackBarl:用于音量控制。

三.代码实现

文件选择功能:

 private void button1_Click(object sender, EventArgs e)
 {
     string[] files = { };


     openFileDialog1.Filter = "Select Audio|*.mp3;*.flac;*.wav;*.ogg";
     // Open multiple files simultaneously
     openFileDialog1.Multiselect = true;

     if (openFileDialog1.ShowDialog() == DialogResult.OK)
     {
         // Clear the existing list
         listBox1.Items.Clear();
         localMusicList.Clear();

         if (files !=  null)
         {
             Array.Clear(files, 0, files.Length);
         }

         files = openFileDialog1.FileNames;
         string[] fileList = files;
         foreach (string file in fileList)
         {
             listBox1.Items.Add(file);
             localMusicList.Add(file);
         }
     }
 }

button1_Click 事件处理程序在用户点击按钮时触发。它的功能是允许用户选择多个音频文件,将它们显示在列表框中,并将它们的路径存储起来,以便后续处理。

列表框选项改变事件处理:

     private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
     {
         if (localMusicList.Count > 0)
         {
             axWindowsMediaPlayer1.URL = localMusicList[listBox1.SelectedIndex];
             PlayMusic(axWindowsMediaPlayer1.URL);
             label1.Text = Path.GetFileNameWithoutExtension(localMusicList[listBox1.SelectedIndex]);
         }
     }
  • 检查 localMusicList 中是否有音乐文件。
  • 如果列表框中有选定的项目:
    • 将选定项目的路径赋给 axWindowsMediaPlayer1.URL,以便播放。
    • 调用 PlayMusic 方法播放选定的音乐。
    • 将选定的音乐文件名(不含扩展名)显示在 label1.Text

音乐选择功能:

    private void PlayMusic(string filename)
    {
        string extension = Path.GetExtension(filename).ToLower();
        if (extension == ".ogg")
        {
            if (currentVorbisReader != null)
            {
                // Ensure to stop current playback before disposing resources
                if (waveOut.PlaybackState != PlaybackState.Stopped)
                {
                    waveOut.Stop();
                }
                currentVorbisReader.Dispose();
            }

            currentVorbisReader = new VorbisWaveReader(filename);
            waveOut.Init(currentVorbisReader);
            waveOut.Play();
        }
        else
        {
            axWindowsMediaPlayer1.URL = filename;
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }

这段代码定义了一个名为 PlayMusic 的方法,用于根据文件的扩展名来播放音乐文件。

  • 如果文件扩展名为 ".ogg",则创建一个新的 VorbisWaveReader 对象来读取指定的 OGG 文件,并使用 WaveOutEvent 对象来播放该文件。
  • 如果文件扩展名不是 ".ogg",则将文件路径赋值给 Windows Media Player 控件的 URL 属性,并开始播放该文件。

暂停播放:

     private void button2_Click(object sender, EventArgs e)
     {
         if (waveOut.PlaybackState == PlaybackState.Playing)
         {
             waveOut.Pause(); // Pause playing OGG
         }

         axWindowsMediaPlayer1.Ctlcontrols.stop(); // Stop playing other formats
     }

这段代码定义了一个名为 button2_Click 的方法,它在用户点击按钮(假设命名为 "button2")时触发。

  • 如果正在播放 OGG 格式音频,则暂停播放。
  • 无论是否正在播放 OGG 格式音频,都停止播放其他格式的音频。

循环播放下一首音乐:

 它在用户点击按钮(假设命名为 "button3")时触发。

  • 如果有音乐文件:
    • 计算下一个要播放的音乐文件的索引,如果当前索引加1后超出了列表的范围,则将索引重置为0,实现循环播放。
    • 将下一个音乐文件的路径赋值给 Windows Media Player 控件的 URL 属性,并开始播放该文件。
    • 调用 PlayMusic 方法播放下一个音乐文件。
    • 更新 label1 控件显示下一个音乐文件的文件名(不含扩展名)。
    • 将列表框 listBox1 中的选中项设置为下一个音乐文件的索引,以便在列表框中高亮显示。

音量控制:

 private void trackBar1_Scroll(object sender, EventArgs e)
 {
     axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
 }
  • 当用户滚动滑动条时,它将滑动条的值赋给 Windows Media Player 控件的音量属性,以实现音量的调节。

四.完整代码:

作业代码

五.总结:

通过本次作业,我通过导入第三方库,加深了对C#控件的使用和控件之间联系的理解。尽管当前程序可以播放多种音乐文件格式,但它并不能解析最新的音乐文件格式,比如ape和aac。此外,还缺少一些高级音频功能,比如音频效果处理(如均衡器、声音增强等)以及支持音频流的直接下载和播放。虽然还有改进的空间,但这个作业让我更深入地了解了音乐播放器的设计和开发,为我未来的学习和实践奠定了基础。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值