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

来自:网络
时间:2024-06-09
阅读:

引言

在现代软件开发中,音乐播放功能是一个常见的需求。本文将介绍如何使用C#编写一个简单的程序来实现音乐文件的播放功能。我们将使用WindowsMediaPlayer控件来处理MP3文件,使用Naudi.Vorbis控件来处理ogg文件。同时,我们将确保程序具备处理异常、良好的用户界面和兼容性的特点,以确保程序能够在不同版本的C#中正常运行。

开发环境

  • Visual Studio 2022
  • .NET Framework 4.8

实现步骤

步骤1:创建新的C#项目

首先,打开Visual Studio并创建一个新的C#控制台应用程序项目。

步骤2:添加WindowsMediaPlayer控件

在Visual Studio的工具箱中,找到Windows Media Player控件,并将其拖放到窗体中。

步骤3:添加Naudi.Vorbis控件

使用NuGet包管理器,搜索并安装Naudi.Vorbis控件。然后,在代码中引入相应的命名空间。

步骤4:编写代码

以下是一个简单的示例代码,演示了如何实现音乐文件的播放功能:

using NAudio.Wave;
using NAudio.Vorbis;
 
namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        string[] files;
        List<string> localmusiclist = new List<string>{};
        public Form1()
        {
            InitializeComponent();
        }
        private void musicplay(string filename)
        {
            string extension = Path.GetExtension(filename);//fanhuiwenjiandekuozhanhouzhuiming
            if (extension == ".ogg") { Console.WriteLine("这是ogg文件"); }
            else
            {
                Console.WriteLine("这不是ogg文件");
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
        }
        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);
                }
                files = openFileDialog1.FileNames;//因为filenames必须为数组
                string[] array = files;
                foreach (string x in array)
                {
                    listBox1.Items.Add(x);
                    localmusiclist.Add(x);
                }
            }
        }
 
        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]);
            }
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
            label2.Text=trackBar1.Value+"%";
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.Ctlcontrols.stop();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            int nextIndex= listBox1.SelectedIndex;
            if (localmusiclist.Count > 0)
            {
                if (listBox1.SelectedIndex + 1 > localmusiclist.Count)
                {
                    nextIndex = 0;
                }
                axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];
                musicplay(axWindowsMediaPlayer1.URL);
                label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
                listBox1.SelectedIndex = nextIndex;
            }
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            string oggFilePath="";
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "播放音频|*.ogg";
            if(openFileDialog.ShowDialog() == DialogResult.OK) 
            { 
                oggFilePath =openFileDialog.FileName;
            }
 
            using (var vorbis = new VorbisWaveReader(oggFilePath))
            {
                using (var waveOut = new WaveOutEvent())
                    {
                       waveOut.Init(vorbis);
                       waveOut.Play(); 
                    while(waveOut.PlaybackState == PlaybackState.Playing)
                    {
                        System.Threading.Thread.Sleep(1000);
                    }
                    }
            }
        }
    }
}

步骤5:测试

编译并运行程序,点击打开按钮选择MP3或ogg文件进行测试,验证程序是否能够正常播放音乐文件。

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

代码优点:

  1. 多格式支持: 通过使用NAudio和NAudio.Vorbis库,程序可以播放多种格式的音频文件,包括常见的MP3、wav、FLAC以及OGG格式。这增加了程序的灵活性,使用户可以播放各种不同格式的音乐。

  2. 良好的用户界面: 程序提供了一个简单直观的用户界面,包括一个文件选择按钮、一个音乐列表框、播放控制按钮(播放、停止、下一曲)、音量调节器和一个用于显示当前播放曲目的标签。这样的界面使用户能够方便地选择、播放和控制音乐。

  3. 异常处理: 程序对可能出现的异常进行了处理,比如文件不存在、文件读取错误等。在播放OGG文件时,使用了try-catch语句来捕获可能抛出的异常,并通过控制台输出相应的信息。这有助于提高程序的稳定性和可靠性。

  4. 代码结构清晰: 代码采用了适当的方法和事件处理程序来实现不同的功能,如文件选择、播放、停止、切换音乐等。这使得代码易于阅读、理解和维护。

  5. 兼容性: 由于代码使用了标准的C#语法和库,并且没有使用任何特定于某个版本的功能,因此具有良好的兼容性,能够在不同版本的C#中正常运行。

代码关键词解释:

  1. usingusing 关键字用于引入命名空间,使得其中的类和方法可以在当前代码文件中直接使用。例如:using NAudio.Wave; 和 using NAudio.Vorbis; 引入了 NAudio.Wave 和 NAudio.Vorbis 命名空间。

  2. partial classpartial 关键字用于指示该类的定义是分布在多个文件中的。在这种情况下,Form1 类的定义分布在多个代码文件中。这通常用于将一个类的定义拆分成多个文件,以便更好地组织和管理代码。

  3. string[]string[] 表示字符串数组,用于存储多个字符串值。在这段代码中,files 变量和 localmusiclist 变量都是字符串数组。

  4. List<T>List<T> 是 C# 中的泛型集合类型,用于存储一组相同类型的元素。在这段代码中,localmusiclist 变量是一个 List<string> 类型的列表,用于存储音乐文件的路径。

  5. Path.GetExtension()Path.GetExtension() 是一个静态方法,用于获取文件路径中的文件扩展名。在这段代码中,它用于获取音乐文件的扩展名,以判断文件类型。

  6. openFileDialogopenFileDialog 是一个 Windows 窗体控件,用于在应用程序中选择文件。它可以打开一个对话框,让用户选择一个或多个文件,并返回选定文件的路径。

  7. button_Click 事件button_Click 是一个事件处理程序,用于响应按钮的单击事件。在这段代码中,button1_Clickbutton2_Clickbutton3_Click 和 button4_Click 方法都是按钮单击事件的处理程序。

  8. ListBox.SelectedIndexChanged 事件ListBox.SelectedIndexChanged 是一个事件,当列表框中选中项发生变化时触发。在这段代码中,listBox1_SelectedIndexChanged 方法是列表框选中项变化事件的处理程序。

  9. trackBar_Scroll 事件trackBar_Scroll 是一个事件,当滑动条的值发生变化时触发。在这段代码中,trackBar1_Scroll 方法是滑动条值变化事件的处理程序。

  10. axWindowsMediaPlayeraxWindowsMediaPlayer 是一个 Windows 窗体控件,用于播放视频和音频文件。它提供了一组控制方法和属性,用于控制媒体文件的播放、暂停、停止等操作。

  11. WaveOutEvent 和 VorbisWaveReaderWaveOutEvent 和 VorbisWaveReader 是 NAudio 库中的类,用于播放音频文件。WaveOutEvent 用于播放 wav 格式的音频文件,而 VorbisWaveReader 则用于播放 OGG 格式的音频文件。

  12. try-catchtry-catch 是异常处理的一种机制,用于捕获可能发生异常的代码块,并在发生异常时执行相应的异常处理逻辑。在这段代码中,try-catch 用于捕获可能发生的文件读取错误异常,并在发生异常时输出错误信息。

结论

通过本文的介绍,我们学习了如何使用C#编写一个简单的程序来实现音乐文件的播放功能。我们使用了WindowsMediaPlayer控件和Naudi.Vorbis控件来处理不同格式的音乐文件,并确保程序具备处理异常、良好的用户界面和兼容性的特点,以确保程序能够在不同版本的C#中正常运行。希望本文能够对C#开发者有所帮助,谢谢阅读!

返回顶部
顶部