利用C#程序,实现音乐文件的播放功能(文末附GitHub源代码地址)

ops/2024/12/23 21:38:09/

目录

一、功能要求

读取MP3文件要求

读取ogg文件要求

二、前期准备步骤

三、代码实现步骤

1、实现“添加音乐”

2、实现“停止音乐”

3、实现”上一曲“

4、实现“下一曲”

5、实现“播放ogg"

6、listbox1中代码

7、填写showmusic函数

四、全部代码

五、测试

六、总结

1、功能实现

2、心得体会

七、GitHub源代码地址



一、功能要求

读取MP3文件要求

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

2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。

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

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

提示:本文此功能使用WindowsMediaPlayer控件

读取ogg文件要求

1. 程序应能够播放ogg文件。

2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。

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

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

提示:本文此功能使用Nuget程序包中的Naudi.Vorbis控件

二、前期准备步骤

步骤一:打开C#项目在Visual Studio 2022中,创建新项目,选择Windows窗体应用(.NET Framework)。

 步骤二:左键点击常规(在工具箱中),右键点击指针“选择项” -> “com组件”->“windows media player",将其拖到窗口。

步骤三:右键点击项目(在解决方案资源管理器中),选择管理nuGet资源->”浏览“->”NAUdio.Vorbis“安装。

步骤四:拖工具箱当中的button、listbox、label控件到Form1.cs[设计]当中,添加按键。

三、代码实现步骤

1、实现“添加音乐”

这段代码的目的是让用户从文件系统中选择音频文件,并将这些文件的路径显示在ListBox控件中,同时将它们存储在一个列表中供后续使用。

        openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.fllac";openFileDialog1.Multiselect = true;if(openFileDialog1.ShowDialog() == DialogResult.OK){listBox1.Items.Clear();if (files!=null){Array.Clear(files,0, files.Length);}files =openFileDialog1.FileNames;string[] array = files;foreach(string x in array){ listBox1.Items.Add(x);localmusiclist.Add(x);}}

2、实现“停止音乐”

axWindowsMediaPlayer1.Ctlcontrols.stop(); 

3、实现”上一曲“

此代码实现播放上一曲的功能,如果播放到第一一曲,则会从最后一曲开始播放。

 if (localmusiclist.Count > 0){int index = listBox1.SelectedIndex;if (index < 0){index = 0;  }else{index--;  if (index < 0){index = localmusiclist.Count - 1; }}axWindowsMediaPlayer1.URL = localmusiclist[index];showmusic(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);listBox1.SelectedIndex = index;}

4、实现“下一曲”

此代码实现播放下一曲的功能,如果播放到最后一曲,则会从第一曲开始播放。

         if (localmusiclist.Count > 0){if (listBox1.SelectedIndex + 1 > localmusiclist.Count){axWindowsMediaPlayer1.URL = localmusiclist[0];}axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex+1];musicplay(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);}

5、实现“播放ogg"

            string oggFilePath = "path_to_your_ogg_file.ogg"; // 替换为您的OGG文件路径  OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "播放音频|*.ogg";if (openFileDialog.ShowDialog()== DialogResult.OK){oggFilePath = openFileDialog.FileName;}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);}}}

6、listbox1中代码

     if (localmusiclist.Count > 0){axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];musicplay(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);}

7、填写showmusic函数

    private void showmusic(string filename){string extension = Path.GetExtension(filename);if (extension == ".ogg"){Console.WriteLine("this is ogg file.");}else{Console.WriteLine("this is not ogg file.");axWindowsMediaPlayer1.Ctlcontrols.play();}}

四、全部代码

using NAudio.Wave;
using NAudio.Vorbis;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsMusic1
{public partial class Form1 : Form{string[] files;List<string> localmusiclist = new List<string> { };public Form1(){InitializeComponent();}private void showmusic(string filename){string extension = Path.GetExtension(filename);if (extension == ".ogg"){Console.WriteLine("this is ogg file.");}else{Console.WriteLine("this is not ogg file.");axWindowsMediaPlayer1.Ctlcontrols.play();}}private void button1_Click(object sender, EventArgs e){openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.fllac";openFileDialog1.Multiselect = true;if(openFileDialog1.ShowDialog() == DialogResult.OK){listBox1.Items.Clear();if (files!=null){Array.Clear(files,0, files.Length);}files =openFileDialog1.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];showmusic(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){if (localmusiclist.Count > 0){int index = listBox1.SelectedIndex + 1;if (index >= localmusiclist.Count()) { index = 0; }axWindowsMediaPlayer1.URL = localmusiclist[index];showmusic(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);listBox1.SelectedIndex = index;}}private void Form1_Load(object sender, EventArgs e){}private void button4_Click(object sender, EventArgs e){string oggFilePath = "path_to_your_ogg_file.ogg"; // 替换为您的OGG文件路径  OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "播放音频|*.ogg";if (openFileDialog.ShowDialog()== DialogResult.OK){oggFilePath = openFileDialog.FileName;}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);}}}}private void label2_Click(object sender, EventArgs e){}private void label1_Click(object sender, EventArgs e){}private void button5_Click(object sender, EventArgs e){if (localmusiclist.Count > 0){int index = listBox1.SelectedIndex;// 如果当前没有选中任何项,或者已经是第一项,可以选择播放最后一项或者保持当前项不变  if (index < 0){index = 0; // 或者你可以选择播放列表中的最后一项:index = localmusiclist.Count - 1;  }else{index--; // 否则播放上一项  // 如果现在索引是-1(即原本是第一项),可以选择播放列表中的最后一项或者保持当前项不变  if (index < 0){index = localmusiclist.Count - 1; // 循环到最后一项  }}axWindowsMediaPlayer1.URL = localmusiclist[index];showmusic(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);listBox1.SelectedIndex = index;}}}}

五、测试

六、总结

1、功能实现

音乐播放器已经具备了基本的播放控制功能,包括播放播放音乐(通过的button1_Click事件处理)、停止音乐(通过的button2_Click事件处理)、上一曲(通过button5_Click事件处理)、播放下一曲(通过的button3_Click事件处理)和播放ogg(通过的button4_Click事件处理)。

播放器能够从一个包含音乐文件路径的列表中加载并播放音乐。

播放器的当前播放曲目会在一个列表框(listBox1)中显示,并且当播放曲目变化时,列表框的选中项也会相应更新。

播放器还包含了一个标签(label1)用于显示当前播放曲目的文件名。

播放器还包含音量的调节(label2)。

2、心得体会

在开发过程中,我接触并学习了许多新的技术和工具,如Windows Media Player控件、ActiveX控件的使用、文件路径处理(如Path.GetFileNameWithoutExtension)等。这些新技术和工具不仅帮助我解决了开发中的难题,也拓宽了我的技术视野。

七、GitHub源代码地址

https://github.com/chenwq2004/windowshomework.git


http://www.ppmy.cn/ops/144393.html

相关文章

手机便签哪个好用?手机桌面便签app下载推荐

在快节奏的现代生活中&#xff0c;我们常常需要记录一些重要的信息和灵感&#xff0c;以便于日后查阅和回顾。手机便签软件因其便携性和易用性&#xff0c;成为了我们日常生活中不可或缺的工具。无论是购物清单、待办事项、灵感记录还是重要笔记&#xff0c;手机便签都能帮助我…

Mybatis中使用MySql触发器报错:You have an error in your SQL syntax; ‘DELIMITER $$

前提&#xff1a; 在写数据库作业时候&#xff0c;使用SpringBoot2.7.xMybatis-plusMysql8.0开发&#xff0c;其中使用MySQL的触发器时报以下错误&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…

Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略

Tool之Excalidraw&#xff1a;Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略 目录 Excalidraw 简介 1、Excalidraw 的主要特点&#xff1a; Excalidraw 安装和使用方法 1、Excalidraw的安装 T1、使用 npm 安装&#xff1a; T2、使用 …

如何利用Python爬虫获得1688按关键字搜索商品

在当今的数字化时代&#xff0c;数据已成为企业竞争的核心资源。对于电商行业来说&#xff0c;了解市场动态、分析竞争对手、获取商品信息是至关重要的。Python作为一种强大的编程语言&#xff0c;其丰富的库和框架使得数据爬取变得简单易行。本文将介绍如何使用Python爬虫技术…

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…

深度学习试题及答案解析(一)

1. 一幅256*256的图像&#xff0c;若灰度级数为16&#xff0c;则存储它所需的比特数是&#xff08;&#xff09; 2. 在深度学习中&#xff0c;涉及大量的矩阵相乘&#xff0c;现在需要计算三个稠密矩阵A&#xff0c;B&#xff0c;C的乘积ABC,假设三个矩阵的尺寸分别为m∗n&…

AI Chat API 对接说明

AI Chat API 对接说明 我们知道&#xff0c;市面上一些问答 API 的对接还是相对没那么容易的&#xff0c;比如说 OpenAI 的 Chat Completions API&#xff0c;它有一个 messages 字段&#xff0c;如果要完成连续对话&#xff0c;需要我们把所有的上下文历史全部传递&#xff0…

Jenkins搭建并与Harbor集成上传镜像

Jenkins介绍 Jenkins 是一个开源的自动化服务器&#xff0c;广泛用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;的实践中。它帮助开发人员自动化构建、测试和部署过程&#xff0c;从而提高开发效率、代码质量和项目交付速度。通过丰富的插件支持…