c#音乐播放器续(联网下载)

0.前言

  • 书接上文,我们已经实现了一个能够播放本地音乐的音乐播放器,能够播放众多音乐格式,包括.ogg,接下来,我们将为我们的音乐播放器添加一个令人激动的新功能——联网音乐下载和播放!这个功能将使我们能够通过网络获取音乐,并将其添加到我们的播放列表中。
  • 为了实现这个功能,我们选择使用苹果音乐开放的API。尽管这个API只支持音乐的30秒预览,但它非常适合初学者上手。使用这个API不需要认证或密钥等额外操作,让我们能够更快地理解和实现联网音乐下载功能。
  • 本项目旨在练习如何实现联网音乐下载,理解基础方法后,想要拓展很快就能上手。

1.关于本地音乐播放

详情可查看本人上篇博客~

在此只放框架:

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){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);outputDevice = new WaveOutEvent();outputDevice.Init(oggReader);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 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);localmusiclist.Add(x);}}}
//点击音乐歌单事件,切换选择的歌曲private void listBox1_SelectedIndexChanged(object sender, EventArgs e){if(localmusiclist.Count > 0){index = listBox1.SelectedIndex;musicplay(localmusiclist[index]);}}
//音轨事件,用于响应调整声音private void trackBar1_Scroll(object sender, EventArgs e){axWindowsMediaPlayer1.settings.volume = trackBar1.Value;if(outputDevice != null)outputDevice.Volume = trackBar1.Value;}
//暂停private void button2_Click(object sender, EventArgs e){if(axWindowsMediaPlayer1 != null)axWindowsMediaPlayer1.Ctlcontrols.stop();if(outputDevice != null)outputDevice.Stop();}//下一曲private void button3_Click(object sender, EventArgs e){if(localmusiclist.Count > 0) {index = (index+1)% localmusiclist.Count;musicplay(localmusiclist[index]);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);}}

在这里插入图片描述

2.使用iTunes Search API进行联网下载歌曲

2.1 控件

在这里插入图片描述

  1. 控件1:输入歌曲搜索关键词
  2. 控件2:根据歌曲搜索关键词进行搜索,并显示于listBox2
  3. 控件3:下载listBox2选择的歌曲到本地
  4. 控件4:用于显示歌曲搜索出来的信息,并可以选择某首歌进行下载

2.2 函数实现

首先定义一个类的成员变量,用于网络连接

private readonly HttpClient httpClient = new HttpClient();

2.2.1 控件2:搜索歌曲

private async Task<List<string>> SearchMusic(string keyword)
{string apiUrl = $"https://itunes.apple.com/search?term={keyword}&media=music&limit=10";try{HttpResponseMessage response = await httpClient.GetAsync(apiUrl);response.EnsureSuccessStatusCode();string responseBody = await response.Content.ReadAsStringAsync();var json = JObject.Parse(responseBody);var results = json["results"];List<string> musicLinks = new List<string>();foreach (var result in results){string trackName = result["trackName"].ToString();string artistName = result["artistName"].ToString();string previewUrl = result["previewUrl"].ToString();musicLinks.Add($"{trackName} - {artistName} | {previewUrl}");return musicLinks;}}catch (HttpRequestException e){MessageBox.Show(e.Message);}catch (Exception ex){MessageBox.Show($"Unexpected error: {ex.Message}");}return null;}
private async void button4_Click(object sender, EventArgs e)
{string keyword = textBox1.Text.Trim();if (string.IsNullOrEmpty(keyword)){MessageBox.Show("请输入搜索关键词");return;}var results = await SearchMusic(keyword);if (results == null)return;           listBox2.Items.Clear();foreach (var result in results){listBox2.Items.Add(result);}
}

在搜索歌曲的时候,一定要对结果判空,有可能什么也没搜到,这样会返回空

在操作控件时,对可能出错的步骤尽量使用异常处理的方法,这样即使出现错误也不会使主程序崩溃

2.2.2 控件3:下载歌曲

private async Task DownloadMusic(string musicUrl, string filePath)
{HttpResponseMessage response = await httpClient.GetAsync(musicUrl);response.EnsureSuccessStatusCode();using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)){await response.Content.CopyToAsync(fileStream);}
}
private async void button5_Click(object sender, EventArgs e)
{if (listBox2.SelectedItem == null){MessageBox.Show("请选择要下载的音乐");return;}string selectedItem = listBox2.SelectedItem.ToString();string[] parts = selectedItem.Split('|');if (parts.Length < 2){MessageBox.Show("无效的下载链接");return;}string musicUrl = parts[1].Trim();SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.FileName = parts[0].Trim();saveFileDialog.Filter = "MP3 文件|*.mp3";if (saveFileDialog.ShowDialog() == DialogResult.OK){string filePath = saveFileDialog.FileName;await DownloadMusic(musicUrl, filePath);MessageBox.Show("下载完成");//将下载好的歌曲直接添加到播放列表	listBox1.Items.Add(filePath);localmusiclist.Add(filePath);}
}

2.3 主界面

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

3.拓展

本项目使用的iTunes Search API肯定无法满足大家的需求
推荐一个比较好用的在线播放API:Spotify Web API
这个API包含了众多的歌曲,并且可以在线免费播放
使用步骤:

  1. 注册并创建Spotify开发者账号
    访问 Spotify for Developers 并登录或注册一个Spotify账号。
  2. 创建Spotify应用程序
    • 登录后,点击“Create an App”按钮,填写应用的名称和描述,点击“Create”创建应用。
    • 创建应用后,你会获得 Client ID 和 Client Secret。这是你访问Spotify API的凭证。
  3. 获取访问令牌
    Spotify API需要OAuth认证来获取访问令牌。访问令牌有两种方式获取:
    • 客户端凭据流:适用于不需要用户数据的场景。
    • 授权码流:适用于需要访问用户数据的场景。
  4. 发送API请求

使用Spotify Web API相较于本项目可能需要进行一些前置设置的操作,但后续的操作与本项目相差不大。只要你掌握了基础知识,就能够轻松地适应这个API的使用。

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

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

相关文章

Ubuntu 22.04 解决 firefox 中文界面乱码

问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后&#xff0c;将桌面语言设置为中文时&#xff0c;打开Firefox可能会出现中文乱码的问题。经过网上调查发现&#xff0c;这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…

数学建模基础:非线性模型

目录 前言 一、非线性方程组 二、非线性规划 三、微分方程模型 四、非线性模型的应用 五、实例示范&#xff1a;传染病传播模型 实例总结 五、总结 前言 非线性模型用于描述变量之间的非线性关系&#xff0c;相比线性模型&#xff0c;其数学形式更为复杂&#xff0c;但…

AI大模型会如何颠覆手机?

导语&#xff1a;大模型在手机端的落地&#xff0c;不仅仅是AI进入人类生活的开始&#xff0c;也是行业发生颠覆&#xff0c;新老巨头进行更替的时刻。 将大模型变小&#xff0c;再塞进手机&#xff0c;会给人们的生活带来怎样的影响&#xff1f; 最近&#xff0c;荣耀成为了…

Java基础学习-流程控制语句-顺序结构-分支结构-循环结构

目录 顺序结构&#xff1a; 分支结构&#xff1a; if语句&#xff1a; 第一种格式&#xff1a; if第二种格式&#xff1a; 案例练习 if第三种格式&#xff1a; switch语句&#xff1a; 格式&#xff1a; switch其他知识点&#xff1a; 循环结构&#xff1a; for循环…

yolov8图像分割训练

1.背景 最近在做一个AI项目&#xff0c;需要用到yolov8的实例分割功能来确定一个不规则区域&#xff0c;从而找出不规则区域的坐标完成大致定位&#xff0c;以前有用过yolov8的目标检测功能&#xff0c;实际上yolov8的分割功能和检测功能大同小异。本博客将仔细分享使用yolov8图…

给电脑bios主板设置密码

增强安全性&#xff1a;防止未经授权的人员更改 BIOS 中的重要设置&#xff0c;如启动顺序、硬件配置等。这有助于保护计算机系统的稳定性和数据的安全性。防止恶意篡改&#xff1a;阻止可能的攻击者或恶意软件通过修改 BIOS 设置来破坏系统或获取敏感信息。数据保护&#xff1…

多功能声学综合馆:气膜声学环境的创新解决方案—轻空间

多功能声学综合馆作为一种创新的建筑解决方案&#xff0c;成功地解决了传统气膜馆内部噪音问题&#xff0c;为用户提供了一个宁静、舒适的环境。轻空间依托科研院校&#xff0c;研究出与气膜匹配的复合声学材料以及悬挂安装工艺&#xff0c;既保证气膜安全&#xff0c;同时实现…

C语言入门系列:数据类型之浮点数

文章目录 一&#xff0c;什么是浮点数二&#xff0c;C语言中的浮点数1&#xff0c;float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2&#xff0c;double2.1 double变量的声明2.2 double的存储格式2.3 double的精度和范围2.4 long double 3&#xff0c;0.2 0.1…

uni app 树状结构数据展示

树状数据展示&#xff0c;可以点击item 将点击数据给父组件 &#xff0c;满足自己需求。不喜勿喷&#xff0c;很简单可以根据自己需求改哈&#xff0c;不要问&#xff0c;点赞收藏就好 <template><view><view v-for"(node, index) in treeData" :ke…

Mellanoxnvidia ib高速网络常用命令总结

1.spci&#xff1a;检查本地的pci设备。示例&#xff1a;lspci| grep -i mell 2.ofed_info&#xff1a;检测ofed驱动版本。示例&#xff1a;ofed_info-s 3.ibstat&#xff1a;查看本机的ib网卡状态。 4.mst&#xff1a;mellnoax软件管理工具。用来生成IB设备描述符。提供给其他…

经典游戏案例:unity官方推荐3d跑酷

学习目标&#xff1a;实现跑酷核心算法 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 游戏管理器是一个状态机&#xff0c;根据当前的游戏状态&#xff0c;它…

图解Attention学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Attention Attention出现的原因是&#xff1a;基于循环神经网络&#xff08;RNN&#xff09;一类的seq2seq模型&#xff0c;在处理长文本时遇到了挑战&#xff0c;而对长文本中…

华北水利水电大学-C程序设计作业

目录 基础题 1-1 分析 代码实现 1-2 分析 代码实现 1-3 分析 代码实现 1-4 ​编辑 分析 代码实现 1-5 分析 代码实现 1-6 分析 代码实现 基础题 1-1 从键盘输入10个学生的有关数据&#xff0c;然后把它们转存到磁盘文件上去。其中学生信息包括学号、姓名…

Redis变慢了?

Redis变慢了&#xff1f; 什么是Redis&#xff1f;测定Redis变慢&#xff1f;最大响应延迟平均响应延迟设置Redis慢日志 分析Redis变慢bigkeysbigkey的危害bigkey优化 写在最后 什么是Redis&#xff1f; 作为一个技术人员来说&#xff0c;大家用的最多的可能就是Redis了&#…

EMQX集群搭建

1. 什么是 MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、…

防火墙中的NAT

防火墙的NAT NAT分类 源NAT 基于源IP地址进行转换。 我们之前接触过的静态NAT&#xff0c;动态NAT&#xff0c;NAPT都属于源NAT&#xff0c;都是针对源IP地址进行转换的。源NAT主要目的是为了保证内网用户可以访问公网。 先执行安全策略&#xff0c;后执行NAT 目标NAT 基于…

git的分支管理

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;20246月19日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&#x…

【TB作品】MSP430G2553,单片机,口袋板, 单相交流电压、电流计设计

题5 单相交流电压、电流计设计 设计基于MSP430的单相工频交流电参数检测仪。交流有效值0-220V&#xff0c;电流有效值0-40A。电压、电流值经电压、电流传感器输出有效值为0-5V的交流信号&#xff0c;传感器输出的电压、电流信号与被测电压、电流同相位。 基本要求如下 &#xf…

05、部署 YUM 仓库及NFS 共享服务

目录 5.1 部署YUM软件仓库 5.1.1 准备网络安装源&#xff08;服务器端&#xff09; 1、准备软件仓库目录 2、安装并启用vsftpd服务 5.1.2 配置软件仓库位置&#xff08;客户端&#xff09; 5.2 使用yum工具管理软件包 5.2.1 查询软件包 1、yum list——查询软件包列表 …

DGit的使用

将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理&#xff0c;如果您不在工作区上工作&#xff0c;请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取&#xff0c;你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…