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,一经查实,立即删除!

相关文章

浅谈Java23种设计模式之创建型设计模式的几种使用场景

前言: 都知道Java有23种设计模式,但实际开发中相信很多同学基本很少能利用上这些设计模式. 下面我将结合实际开发应用场景来进行简单解读一下这些设计模式在实际开发中是怎么使用的. 1.单例模式&#xff08;Singleton&#xff09; 确保一个类只有一个实例&#xff0c;并提供一…

C++中的享元模式

目录 享元模式&#xff08;Flyweight Pattern&#xff09; 实际应用 文字编辑器中的字符 修仙游戏中的地图瓦片 图形编辑器中的图形对象 总结 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式是一种结构型设计模式&#xff0c;用于减少对象的内存使用和提高…

Ubuntu 22.04 解决 firefox 中文界面乱码

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

Java解析Json格式数据

首先通过一定的方法得到String类型的Json数据。 然后利用fastjson中的JSON的parseObject()将String解析为JSONObject 然后通过get方法得到某个键对应的值&#xff1a; private String getOpenid(String code) {Map<String, String> map new HashMap<>();map.put(&…

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

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

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

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

【杂记-浅谈实现流量控制】

一、流量控制概述 流量控制是计算机网络中的一个关键技术&#xff0c;它涉及到的不仅仅是单一的技术层面&#xff0c;而是涵盖了从物理层到应用层的多个层次。在网络通信中&#xff0c;流量控制技术通过各种手段对数据流量进行管理和调控&#xff0c;以防止网络拥堵、提高网络…

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

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

centos安装多实例mysql

参考&#xff1a;CentOS7 单机配置mysql多实例运行-腾讯云开发者社区-腾讯云

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设备描述符。提供给其他…

网络新增接入交换机引发故障应对经验

网管对某一栋楼的汇聚交换机进行配置变更&#xff0c;要增加一台接入交换机&#xff0c;因为人员变多了&#xff0c;终端也就变多了&#xff0c;所以现有的网络和接入设备不能满足需求&#xff0c;需要新增一台接入层的交换机。 现网中新增一台接入交换机&#xff0c;这个配置是…

[Day 15] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的數字身份認證 1. 概述 數字身份認證是當今數字世界中的關鍵問題之一。傳統的身份驗證方法面臨著安全性、隱私性和可信度等方面的挑戰。區塊鏈技術通過其去中心化、不可篡改和可追溯的特性&#xff0c;為解決這些問題提供了新的可能性。本文將深入探討區塊鏈在數字身份…

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

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

cJSON解析数组

json串: {"list":[ "hello","world"]} 代码 : int func(char *sn) { int ret = 0; cJSON *root, *list; FILE *fp = fopen("a.txt", "r"); if(!fp) { printf("open sn file failed!\n"); …

图解Attention学习笔记

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