c#实现音乐的“vip播放功能”

2024-05-07 12:12

本文主要是介绍c#实现音乐的“vip播放功能”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 1. c#窗体
  • 2. 功能
  • 3. 具体实现
    • 3.1 添加文件
    • 3.2 音乐播放
    • 3.3 其他功能
  • 4. 整体代码和窗口
  • 5. 依赖的第三方库

前言

最近在QQ音乐里重温周杰伦的歌,觉得好听到耳朵怀孕,兴起想要下载下来反复听,发现QQ音乐VIP歌曲下载下来的格式居然不是MP3格式,是ogg。OMG!ogg是什么鬼,都不能直接听,顿感失落,思来想去决定自己实现一个QQ音乐的播放功能,搞定这ogg

1. c#窗体

C#窗体是事件驱动的,在窗体中,可以通过定义和处理特定事件来触发相应的操作。例如,当用户点击按钮时,可以在对应的按钮的Click事件处理程序中执行相应的代码。这意味着窗体的行为是由事件的发生而触发的,而不是通过连续的轮询或主动调用来完成的。这种事件驱动的方式使得窗体在等待用户输入和响应用户操作时更加高效。
我们就选用c#窗体来做音乐播放器的界面。

2. 功能

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

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

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

  4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
    此功能可以使用WindowsMediaPlayer控件

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

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

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

  8. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
    此功能可以使用Nuget程序包中的Naudi.Vorbis控件

3. 具体实现

3.1 添加文件

音乐播放器少不了的就是音乐文件列表,在c#listBox控件便可以完成此工作,他能显示一行一行的文本信息,可以用来作为我们的音乐文件列表。
我们再添加button1控件,用于添加我们的音乐文件于列表中。
在这里插入图片描述

private void button1_Click(object sender, EventArgs e)
{OpenFileDialog openFileDialog1 = new OpenFileDialog(); //这个是文件选择框的对象//筛选文件后缀openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";//设置一次添加多个文件openFileDialog1.Multiselect = true;if(openFileDialog1.ShowDialog() == DialogResult.OK)  //这个会打开文件选择框{string[] files = openFileDialog1.FileNames;foreach(string x in files){listBox1.Items.Add(x); //向listBox1控件里添加音乐文件名localmusiclist.Add(x); //localmusiclist,是一个全局的对象,用于存储已选音乐}}
}

3.2 音乐播放

Windows Media Player控件用于播放常见的音乐文件格式,如.mp3.wav.flac等等,所以我们添加它播放常见的音乐格式文件
但如果要播放.ogg格式音乐,那我们就需要引入第三方库了,分别是NAudioNAudio.vorbis

private void musicplay(string filename)
{//获取filename的后缀名string extension = Path.GetExtension(filename).ToLower();//如果oggReader和outputDevice不为空,说明正在播放或播放过ogg文件,此时要再播放新选择的文件就要先释放旧的if (oggReader != null && outputDevice != null){oggReader.Dispose();oggReader = null;outputDevice.Dispose(); outputDevice = null;}axWindowsMediaPlayer1.Ctlcontrols.stop();try //捕获可能的错误{if (extension == ".ogg"){oggReader = new VorbisWaveReader(filename); //对ogg文件进行解析outputDevice = new WaveOutEvent();outputDevice.Init(oggReader); // 初始化解析后的ogg文件outputDevice.Play();}else{axWindowsMediaPlayer1.URL = filename;axWindowsMediaPlayer1.Ctlcontrols.play();}}
}

其中outputDeviceoggReader都要设置为全局的,因为如果是局部对象的话,出了作用域会自动被释放,导致音乐播放截然而止。所以我们将其设置为全局的,只有再次进行播放时才将他释放,再播放新选择的音乐。

此时窗口是这样的:
在这里插入图片描述
要想完成音乐播放,还需要最后一步,就是完善运行时 点击listBox1里的内容 就播放对应音乐的功能。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{if(localmusiclist.Count > 0){index = listBox1.SelectedIndex; //index为全局索引,用于标识正在播放哪个的音乐musicplay(localmusiclist[index]);}
}

至此,大功告成,我们已经完成了最重要的音乐播放,后续只需要完善其他功能即可

3.3 其他功能

label控件,用于显示正在播放的音乐的音乐名,添加此控件后,只需要在musicplay函数的最开始加上此代码即可:

label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);

停止播放

private void button2_Click(object sender, EventArgs e)
{axWindowsMediaPlayer1.Ctlcontrols.stop();outputDevice.Stop();
}

下一曲

private void button3_Click(object sender, EventArgs e)
{if(localmusiclist.Count > 0) {index = (index+1)% localmusiclist.Count;musicplay(localmusiclist[index]);}
}

滑动音轨TrackBar控件

private void trackBar1_Scroll(object sender, EventArgs e) //音轨控件
{axWindowsMediaPlayer1.settings.volume = trackBar1.Value;outputDevice.Volume = trackBar1.Value;
}

4. 整体代码和窗口

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
using System.Threading;namespace music1
{public partial class Form1 : Form{VorbisWaveReader oggReader = null;  //定义此对象,用于解析.ogg文件格式WaveOutEvent outputDevice = null;  //定义此对象,用于播放.ogg音频List<string> localmusiclist  = new List<string>(); //添加的所有音频文件int index = -1; //当前播放的音频文件索引public Form1(){InitializeComponent();}private void musicplay(string filename){//修改label控件所显示的音乐文件名label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);//获取filename的后缀名string extension = Path.GetExtension(filename).ToLower();//如果oggReader和outputDevice不为空,说明正在播放或播放过ogg文件,此时要再播放新选择的文件就要先释放旧的if (oggReader != null && outputDevice != null){oggReader.Dispose();oggReader = null;outputDevice.Dispose(); outputDevice = null;}axWindowsMediaPlayer1.Ctlcontrols.stop();try //捕获可能的错误{if (extension == ".ogg"){oggReader = new VorbisWaveReader(filename); //对ogg文件进行解析outputDevice = new WaveOutEvent();outputDevice.Init(oggReader); // 初始化解析后的ogg文件outputDevice.Play();}else{axWindowsMediaPlayer1.URL = filename;axWindowsMediaPlayer1.Ctlcontrols.play();}}catch (FileNotFoundException ex) //文件找不到的错误{MessageBox.Show("File not found: " + ex.Message);}catch (Exception ex){MessageBox.Show("An error occurred: " + ex.Message);}}private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog1 = new OpenFileDialog();//筛选文件后缀openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";//设置一次添加多个文件openFileDialog1.Multiselect = true;if(openFileDialog1.ShowDialog() == DialogResult.OK)  {string[] files = openFileDialog1.FileNames;foreach(string x in files){listBox1.Items.Add(x); //向listBox1控件里添加音乐文件名localmusiclist.Add(x); }}}private void listBox1_SelectedIndexChanged(object sender, EventArgs e){if(localmusiclist.Count > 0){index = listBox1.SelectedIndex;musicplay(localmusiclist[index]);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);}}private void trackBar1_Scroll(object sender, EventArgs e) //音轨控件{axWindowsMediaPlayer1.settings.volume = trackBar1.Value;outputDevice.Volume = trackBar1.Value;}private void button2_Click(object sender, EventArgs e){axWindowsMediaPlayer1.Ctlcontrols.stop();outputDevice.Stop();}private void button3_Click(object sender, EventArgs e){if(localmusiclist.Count > 0) {index = (index+1)% localmusiclist.Count;musicplay(localmusiclist[index]);}}}
}

控件窗口
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7e11552cc5eb4c7b9ec750419f4389a2.png

运行窗口

5. 依赖的第三方库

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

这篇关于c#实现音乐的“vip播放功能”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967321

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议