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

 更新时间:2024年05月06日 09:25:43   作者:2301_76253689  
本文介绍了如何使用C#编写一个简单的程序来实现音乐文件的播放功能,程序能够读取MP3文件和ogg文件,并通过合适的控件进行播放,同时,程序具备处理异常、良好的用户界面和兼容性的特点,感兴趣的朋友可以自己动手尝试一下

引言

在现代软件开发中,音乐播放功能是一个常见的需求。本文将介绍如何使用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文件进行测试,验证程序是否能够正常播放音乐文件。

代码优点:

  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#开发者有所帮助,谢谢阅读!

到此这篇关于基于C#实现音乐文件的播放功能的文章就介绍到这了,更多相关C#音乐播放功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#的四种基本数据类型

    C#的四种基本数据类型

    本文主要介绍了C#的四种基本数据类型的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • C#调用接口的四种方式介绍

    C#调用接口的四种方式介绍

    这篇文章介绍了C#调用接口的四种方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#实现功能强大的中国农历日历操作类

    C#实现功能强大的中国农历日历操作类

    这篇文章主要介绍了C#实现功能强大的中国农历日历操作类,实例分析了C#操作时间及字符串的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • c#给图片添加文字的代码小结

    c#给图片添加文字的代码小结

    c#编程中,我们需要为图片添加文字水印,那么就可以参考下面的几个代码
    2012-11-11
  • C#窗体控件DataGridView常用设置

    C#窗体控件DataGridView常用设置

    这篇文章主要为大家详细介绍了C#窗体控件DataGridView常用10项设置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C# wpf简单颜色板的实现

    C# wpf简单颜色板的实现

    wpf本身没有提供颜色板之类的控件,有些业务使用场景需要使用颜色板之类的控件,本文就简单实现,感兴趣的可以了解一下
    2021-10-10
  • C# WPF后台动态添加控件实战教程

    C# WPF后台动态添加控件实战教程

    最近尝试用wpf在后台动态添加控件,所以下面这篇文章主要给大家介绍了关于C# WPF后台动态添加控件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • C# 10个常用特性汇总

    C# 10个常用特性汇总

    这篇文章主要介绍了C# 10个常用特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 如何使用C#中的Lazy的使用方法

    如何使用C#中的Lazy的使用方法

    这篇文章主要介绍了如何使用C#中的Lazy的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C# 面向对象的基本原则

    C# 面向对象的基本原则

    什么是面向对象的基本原则?设计原则是基本的工具,应用这些规则可以使你的代码更加灵活、更容易维护,更容易扩展。
    2009-11-11

最新评论