基于C#制作一个音乐播放器

news2024/11/18 21:35:36

此文主要基于C#制作音乐播放器,可实现导入本地歌曲、音乐播放、音量设置、歌词显示等。

在这里插入图片描述

    • 实现流程
      • 1.1、创建项目
      • 1.2、准备素材
      • 1.3、功能开发

实现流程

1.1、创建项目

  1. 打开Visual Studio,右侧选择创建新项目。

在这里插入图片描述

  1. 搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一步,创建成功后如下图。

在这里插入图片描述
在这里插入图片描述

  1. 将Form1的FormBorderStyle属性设置为None,这时窗体效果则由下图1变成了图2的样子。

在这里插入图片描述

在这里插入图片描述

1.2、准备素材

需要准备一些平常喜欢听的歌曲,mp3格式的就行,如果需要歌词展示的话还需要准备lrc格式的文件。

在这里插入图片描述

1.3、功能开发

在工具箱拖拽出一个listview控件,用于歌曲列表的展示,序号跟歌名两列通过columnHeader属性设置。

在这里插入图片描述

添加一个button按钮控件,实现添加歌曲的功能。

在这里插入图片描述

实现一个自定义函数,将用户选择的歌曲填充到listview中。

在这里插入图片描述

 public void addLocalSong(string[] files)
        {
            XmlDocument xd = new XmlDocument();
            xd.Load(Directory.GetCurrentDirectory() + "\\data\\" + "music.xml");
            XmlElement xe = xd.DocumentElement;
            int i = xe.ChildNodes.Count;
            foreach (string str in files)
            {
                i++;
                XmlNode x = xd.CreateElement("path");
                x.InnerText = str;
                xe.AppendChild(x);
                string[] t = { i.ToString(), Path.GetFileNameWithoutExtension(str) };
                ListViewItem lvi = new ListViewItem(t);
                this.listView1.Items.Add(lvi);
            }
            xd.Save(Directory.GetCurrentDirectory() + "\\data\\" + "music.xml");
        }

双击上传歌曲的button控件,调用上面所定义的函数,这里需要限制用户选择文件的后缀为mp3格式。

在这里插入图片描述

在这里插入图片描述

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "音乐|*.mp3";
ofd.Multiselect = true;
ofd.Title = "本地歌曲添加";

DialogResult dr = ofd.ShowDialog();
if (dr == DialogResult.OK)
{
addLocalSong(ofd.FileNames);
}

再拖拽几个button按钮到窗体上来,修改其text显示的同时给播放按钮增加点击事件。

在这里插入图片描述

在这里插入图片描述

 		/// <summary>
        /// 播放或暂停歌曲
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.now_music_id == -1)
                return;
            if (this.button2.Text == "播放" && this.trackBar1.Value < (this.trackBar1.Maximum - 2))
            {
                this.timer1.Enabled = true;
                this.Mp3Player.Ctlcontrols.play();
                this.button2.Text = "暂停";
            }
            else if (this.button2.Text == "播放" && this.trackBar1.Value >= (this.trackBar1.Maximum - 2))
            {
                this.timer1.Enabled = true;
                this.button2.Text = "暂停";
                this.PlayModeChange();
            }
            else 
            {
                this.timer1.Enabled = false;
                this.Mp3Player.Ctlcontrols.pause();               
                this.button2.Text = "播放";      
            }
        }

给listview也增加事件,实现双击播放歌曲的效果。

在这里插入图片描述

 			if (this.listView1.SelectedItems.Count == 0)
                return;
            this.button2.Text = "暂停";
            this.timer1.Enabled = true;
            ListViewItem lvi = this.listView1.SelectedItems[0];

            //MessageBox.Show("双击");
            this.label3.Text = this.listView1.SelectedItems[0].SubItems[1].Text;
        
            this.label3.Text = lvi.SubItems[1].Text;
            if (this.label3.Text.Length > 15)
                this.label3.Text = this.label3.Text.Substring(0, 13) + "..";
            this.label3.Location = new Point((int)(this.panel1.Width / 2 - this.label3.Width / 2), this.label3.Location.Y);

            this.now_music_id = Convert.ToInt32(lvi.SubItems[0].Text) - 1;
            XmlDocument xd = new XmlDocument();
            xd.Load(Directory.GetCurrentDirectory() + "\\data\\" + "music.xml");
            string filename = xd.DocumentElement.ChildNodes[this.now_music_id].InnerText;
            this.musicPlay(filename);
            string lrc_filename = Path.GetDirectoryName(filename) + "\\" + Path.GetFileNameWithoutExtension(filename) + ".lrc";
            if (File.Exists(lrc_filename))
            {
                loadLrc(lrc_filename);    
            }
            else
            {
                this.richTextBox1.Text = "歌词文件不存在";
            }

界面左侧拖拽一个richTextBox,用于歌词的展示。

在这里插入图片描述

在播放按钮以及listview双击事件中都调用一个加载歌词的自定义函数,使用FileStream时需要配置utf-8的格式,否则歌词可能会乱码。

在这里插入图片描述

在窗体底部增加一个trackBar控件,用于歌曲进度条的控制。

在这里插入图片描述

实现歌曲进度条滚动变化事件处理的函数。

 	if (this.now_music_id == -1)
	return;
	
	this.Mp3Player.Ctlcontrols.currentPosition = this.trackBar1.Value;
	this.label1.Text = this.Mp3Player.Ctlcontrols.currentPositionString;
	
	
	if (this.trackBar1.Value >= (this.trackBar1.Maximum - 2) && this.button2.Text == "暂停")
	{
	this.PlayModeChange();
	}

定义一个透明窗体,用于歌词显示。

在这里插入图片描述

在这里插入图片描述

再次增加一个trackbar控件,用于控制音量。

在这里插入图片描述

在这里插入图片描述

private void trackBar2_Scroll(object sender, EventArgs e)
{
    if (this.now_music_id == -1)
        return;

    this.Mp3Player.settings.volume = this.trackBar2.Value;
}

有兴趣的可以在此基础上进行一些功能完善,例如增加一些歌曲循环或随机播放等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测控一体化闸门 灌区智能控制闸门 渠道智能测控闸门系统解决方案

平升电子测控一体化闸门系统/灌区智能控制闸门/渠道智能测控闸门系统解决方案集闸门远程/自动控制、渠道水位流量监测、远程通信、图像/视频监控等功能于一体&#xff0c;具备多种闸门启闭控制方式和多种流量计量方式&#xff0c;应用于支渠、斗渠、农渠的精准用水控制与计量。…

数据库原理及MySQL应用 | 程序流程控制

解决复杂问题不可能通过一个SQL语句完成&#xff0c;我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程或存储函数中SQL语句的执行顺序&#xff0c;是我们完成复杂操作必不可少的一部分。 流程控制语句是指可以控制程序运行顺序的语句&#xff0c;程序运行顺序主要…

各种数据类型的SPI, UART, I2C等方式的通信传输以及存储到EEPROM、Flash等设备的简易实现方法

各种类型的数据传输和存储就涉及到大小端的问题&#xff0c;首先要简单说下芯片的大小端问题&#xff0c;我们这里主要讨论Cortex-M内核。 M内核支持大端或者小端&#xff0c;实际应用中大部分内核都是小端。以STM32为例&#xff0c;全部都是小端&#xff0c;而且是芯片设计之…

Spring Cloud Alibaba Nacos Config - - - >多配置文件/共享配置

源码地址(重点开源码中的 nacos8030 模块)&#xff1a;https://download.csdn.net/download/weixin_42950079/87264006 多配置文件 / 共享配置 在一个微服务架构应用系统中可能包含成百上千个微服务。而很多微服务可能都引入相同的中间件&#xff0c;当环境中引入的中间件较多时…

【eth uniswap】uniswap 自动路径(Auto Router)错误导致的swap超大损耗

____tz_zs 2022-06-09 稿 对于同时有v2池子和v3池子的Token&#xff0c;感觉最近uniswap的app的自动路由寻址&#xff08;Auto Router&#xff09;有点问题&#xff0c;找的永远是v3的&#xff08;如示例caw/weth&#xff09;池子。此时的情况是v3池子很小&#xff0c;只有几十…

用 HarmonyOS ArkUI 来开发一个健康饮食应用

本文演示如果在DevEco Studio 3里面&#xff0c;用HarmonyOS的ArkUI来开发一个健康饮食应用。体验HarmonyOS 3最新API 9&#xff01; 获取HarmonyOS应用 HarmonyOS的ArkUI来开发一个健康饮食的ArkUI程序“ArkUIHealthyDiet”&#xff0c;基础代码已经有了[1]&#xff0c;个人…

【数据结构初阶】八大排序算法+时空复杂度

学会控制自己是人生的必修课 文章目录一、插入排序1.直接插入排序2.希尔排序二、选择排序1.直接选择排序2.堆排序&#xff08;已经建好堆的基础之上&#xff09;三、交换排序&#xff08;Swap&#xff09;1.冒泡排序&#xff08;大学牲最熟悉的排序&#xff09;2.快速排序&…

Python 数据库开发实战-Mac系统下通过homebrew安装Redis数据库

此文章的前置条件是 “Mac系统已安装过Homebrew”&#xff0c;如果未安装&#xff0c;可访问 “Mac 安装 homebrew 详细教程” 一文&#xff0c;详细介绍Homebrew的用法。利用 “Homebrew” 对 “Redis” 进行安装管理&#xff0c;那是一个方便啊。 利用 homebrew 安装 Redis …

【Windows逆向】【Qt】日志信息打印

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 示例程序Demo2️⃣ 编写功能&#xff08;QtCreator版本&#xff09;3️⃣ 编写功能&#xff08;VS版本&#xff09;&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x1f6eb; 导读 需求 调试是编程中常见的定位手段&#xf…

字节一面,操作系统这题没答好,可惜了

问题引入&#xff1a; 在曾经我们学习Linux的经历中&#xff0c;我们也是多次使用信号的。比如&#xff1a;当我们在使用xshell时&#xff0c;在命令行中按Ctrlc&#xff0c;这个键盘输入产生了一个硬件中断&#xff0c;被操作系统获取&#xff0c;解释成信号&#xff0c;发送…

两百行C++代码实现yolov5车辆计数部署(通俗易懂版)

这周用opencv简单实现了一下基于yolov5检测器的车辆计数功能&#xff0c;方法是撞线计数&#xff0c;代码很简单一共就两百多行&#xff0c;测试视频是在b站随便下载的。注&#xff1a;该代码只能演示视频demo效果&#xff0c;一些功能未完善&#xff0c;离实际工程应用还有距离…

JMeter整体综述

JMeter整体综述1. JMeter体系结构及运行原理1.1 主要的组件1.2 运行原理2. 元件执行顺序和作用域2.1 元件执行顺序2.2 元件执行作用域3. 参考1. JMeter体系结构及运行原理 负载模拟&#xff1a;负责模拟用户请求。如取样器有参数化的需求&#xff0c;可通过配置元件或前置处理器…

15.JavaScript 01

文章目录一、概念二、功能三、 JavaScript发展史四、 ECMAScript&#xff1a;客户端脚本语言的标准1、基本语法1. 与html结合方式2. 注释3. 数据类型4. 变量5. 运算符6. 流程控制语句7. JS特殊语法8. 练习&#xff1a;99乘法表2、基本对象1. Function&#xff1a;函数(方法)对象…

上线3天,下载4万,ChatGPT 中文版VSCode插件来了

ChatGPT 的 Debug 功能&#xff0c;有人应用化了。 ChatGPT 这几天可谓是风头无两。作为一个问答语言模型&#xff0c;它最大的优点就是可以回答与编程相关的问题&#xff0c;甚至回复一段代码。 尽管有人指出 ChatGPT 生成的代码有错误&#xff0c;但程序员们还是对它写代码、…

图像配准开源数据集资源汇总

Brown 数据集 数据集下载链接&#xff1a;http://suo.nz/3042bh 数据集由 1024 x 1024 位图 (.bmp) 图像组成&#xff0c;每个图像包含一个 16 x 16 图像块阵列。每个补丁都被采样为 64 x 64 灰度&#xff0c;具有规范的比例和方向。 ETHZ Toys 数据集下载链接&#xff1a…

Java中的语法糖(真甜)

什么是语法糖&#xff08;Syntactic sugar&#xff09; 语法糖是一个计算机数据&#xff0c;特指在编程语言中添加的某种语法&#xff0c;这种语法对语言的功能没有影响&#xff0c;但是更方便程序员使用。语法糖让程序更加简洁&#xff0c;有更高的可读性。 糖嘛&#xff0c…

08.DashBoard流监控配置

08.DashBoard流监控配置 每个服务提供者都需要实现actuator&#xff0c;才可以实现流量监控。 导入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><…

【图像去噪】空域+频域滤波图像去噪【含GUI Matlab源码 914期】

⛄一、获取代码方式 获取代码方式1&#xff1a; 完整代码已上传我的资源&#xff1a;【图像去噪】基于matlab GUI空域频域滤波图像去噪【含Matlab源码 914期】 获取代码方式2&#xff1a; 通过订阅紫极神光博客付费专栏&#xff0c;凭支付凭证&#xff0c;私信博主&#xff0…

移动端防抓包实践

目录介绍 01.整体概述介绍 1.1 项目背景1.2 思考问题1.3 设计目标1.4 收益分析 02.市面抓包的分析 2.1 Https三要素2.2 抓包核心原理2.3 搞定CA证书2.4 突破CA证书校验2.5 如何搞定加解密2.6 Charles原理2.7 抓包原理图2.8 抓包核心流程 03.防止抓包思路 3.1 先看如何抓包3.2 …

C++计算机视觉库OpenCV在Visual Studio 2022的配置方法

本文介绍在Visual Studio 2022中配置、编译C 计算机视觉库OpenCV的方法。 1 OpenCV库配置 首先&#xff0c;我们进行OpenCV库的下载与安装。作为一个开源的库&#xff0c;我们直接在其官方下载网站&#xff08;https://opencv.org/releases/&#xff09;中进行下载即可&#x…