作业2:编写一个C#程序,实现音乐文件的播放功能。

编写一个C#程序,实现音乐文件的播放功能
要求1: 1. 程序应能够读取MP3和ogg文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。

界面设计

  1. 在设计器中添加以下控件:
    • 一个TextBox控件,用于输入文件路径或在线音乐文件的URL。设置其Name属性为txtFilePathOrUrl
    • 一个Button控件,用于选择本地文件(btnBrowse),另一个用于播放音乐(btnPlay)。将按钮的Text属性分别设置为“浏览”和“播放”。
    • 一个OpenFileDialog控件,用于选择本地文件。

      安装NuGet包
      安装以下NuGet包:

      NAudio
      NVorbis

      完整代码

      Form1.cs中编写以下代码:
       

      using System;
      using System.IO;
      using System.Windows.Forms;
      using WMPLib;
      using NAudio.Wave;
      using NVorbis.NAudioSupport;
      
      namespace MusicPlayer
      {
          public partial class Form1 : Form
          {
              private WindowsMediaPlayer mp3Player;
              private WaveOutEvent waveOut;
              private VorbisWaveReader vorbisReader;
      
              public Form1()
              {
                  InitializeComponent();
                  mp3Player = new WindowsMediaPlayer();
                  waveOut = new WaveOutEvent();
              }
      
              private void btnBrowse_Click(object sender, EventArgs e)
              {
                  using (OpenFileDialog ofd = new OpenFileDialog())
                  {
                      ofd.Filter = "音频文件 (*.mp3;*.ogg)|*.mp3;*.ogg|所有文件 (*.*)|*.*";
                      if (ofd.ShowDialog() == DialogResult.OK)
                      {
                          txtFilePathOrUrl.Text = ofd.FileName;
                      }
                  }
              }
      
              private void btnPlay_Click(object sender, EventArgs e)
              {
                  string filePathOrUrl = txtFilePathOrUrl.Text;
                  if (string.IsNullOrEmpty(filePathOrUrl))
                  {
                      MessageBox.Show("请输入有效的文件路径或URL。");
                      return;
                  }
      
                  try
                  {
                      if (filePathOrUrl.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase))
                      {
                          PlayMp3(filePathOrUrl);
                      }
                      else if (filePathOrUrl.EndsWith(".ogg", StringComparison.OrdinalIgnoreCase))
                      {
                          PlayOgg(filePathOrUrl);
                      }
                      else
                      {
                          MessageBox.Show("不支持的文件格式。");
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("播放文件时出错: " + ex.Message);
                  }
              }
      
              private void PlayMp3(string filePath)
              {
                  try
                  {
                      if (mp3Player.playState == WMPPlayState.wmppsPlaying)
                      {
                          mp3Player.controls.stop();
                      }
                      mp3Player.URL = filePath;
                      mp3Player.controls.play();
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("播放MP3文件时出错: " + ex.Message);
                  }
              }
      
              private void PlayOgg(string filePath)
              {
                  try
                  {
                      if (waveOut.PlaybackState == PlaybackState.Playing)
                      {
                          waveOut.Stop();
                      }
                      vorbisReader = new VorbisWaveReader(filePath);
                      waveOut.Init(vorbisReader);
                      waveOut.Play();
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("播放OGG文件时出错: " + ex.Message);
                  }
              }
      
              private void Form1_FormClosing(object sender, FormClosingEventArgs e)
              {
                  if (mp3Player != null)
                  {
                      mp3Player.controls.stop();
                  }
                  if (waveOut != null)
                  {
                      waveOut.Stop();
                      waveOut.Dispose();
                  }
                  if (vorbisReader != null)
                  {
                      vorbisReader.Dispose();
                  }
              }
          }
      }
      


       

      初始化组件

      在Form1.Designer.cs中确保控件已正确初始化,并添加了事件处理程序:
       

      private void InitializeComponent()
      {
          this.txtFilePathOrUrl = new System.Windows.Forms.TextBox();
          this.btnBrowse = new System.Windows.Forms.Button();
          this.btnPlay = new System.Windows.Forms.Button();
          this.label1 = new System.Windows.Forms.Label();
          this.SuspendLayout();
          // 
          // txtFilePathOrUrl
          // 
          this.txtFilePathOrUrl.Location = new System.Drawing.Point(12, 25);
          this.txtFilePathOrUrl.Name = "txtFilePathOrUrl";
          this.txtFilePathOrUrl.Size = new System.Drawing.Size(656, 20);
          this.txtFilePathOrUrl.TabIndex = 0;
          // 
          // btnBrowse
          // 
          this.btnBrowse.Location = new System.Drawing.Point(674, 23);
          this.btnBrowse.Name = "btnBrowse";
          this.btnBrowse.Size = new System.Drawing.Size(75, 23);
          this.btnBrowse.TabIndex = 1;
          this.btnBrowse.Text = "浏览";
          this.btnBrowse.UseVisualStyleBackColor = true;
          this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
          // 
          // btnPlay
          // 
          this.btnPlay.Location = new System.Drawing.Point(755, 23);
          this.btnPlay.Name = "btnPlay";
          this.btnPlay.Size = new System.Drawing.Size(75, 23);
          this.btnPlay.TabIndex = 2;
          this.btnPlay.Text = "播放";
          this.btnPlay.UseVisualStyleBackColor = true;
          this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);
          // 
          // label1
          // 
          this.label1.AutoSize = true;
          this.label1.Location = new System.Drawing.Point(12, 9);
          this.label1.Name = "label1";
          this.label1.Size = new System.Drawing.Size(163, 13);
          this.label1.TabIndex = 3;
          this.label1.Text = "请输入文件路径或在线音乐URL:";
          // 
          // Form1
          // 
          this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
          this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
          this.ClientSize = new System.Drawing.Size(842, 61);
          this.Controls.Add(this.label1);
          this.Controls.Add(this.btnPlay);
          this.Controls.Add(this.btnBrowse);
          this.Controls.Add(this.txtFilePathOrUrl);
          this.Name = "Form1";
          this.Text = "音乐播放器";
          this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
          this.ResumeLayout(false);
          this.PerformLayout();
      }
      
      private System.Windows.Forms.TextBox txtFilePathOrUrl;
      private System.Windows.Forms.Button btnBrowse;
      private System.Windows.Forms.Button btnPlay;
      private System.Windows.Forms.Label label1;
      


       

      程序说明

      1. Form1类的构造函数:
         - 初始化`WindowsMediaPlayer`实例和`WaveOutEvent`实例。

      2. btnBrowse_Click事件处理方法:
         - 打开文件选择对话框,让用户选择本地音乐文件。选中的文件路径将显示在`txtFilePathOrUrl`文本框中。

      3. btnPlay_Click事件处理方法:
         - 获取用户输入的文件路径或URL,检查其是否为空。
         - 根据文件扩展名,选择适当的方法播放MP3或OGG文件。
         - 捕获播放过程中可能出现的异常,并显示错误消息。

      4. PlayMp3方法:
         - 使用Windows Media Player控件播放MP3文件。
         - 如果文件正在播放,先停止播放,再加载新文件并播放。

      5. PlayOgg方法:
         - 使用NAudio和NVorbis库播放OGG文件。
         - 如果文件正在播放,先停止播放,再加载新文件并播放。

      6. Form1_FormClosing事件处理方法:
         - 确保在窗体关闭时停止播放音乐,并释放相关资源。
      通过上述设计和实现,程序能够实现MP3和OGG文件的播放功能,用户只需输入文件路径或有效的URL即可播放音乐。该程序使用Windows Media Player控件、NAudio和NVorbis库,具有简单明了的用户界面,易于操作,并处理了常见的异常情况。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值