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

音乐播放器

  • 0.前言
  • 1.关于本地音乐播放
  • 2.使用iTunes Search API进行联网下载歌曲
    • 2.1 控件
    • 2.2 函数实现
      • 2.2.1 控件2:搜索歌曲
      • 2.2.2 控件3:下载歌曲
    • 2.3 主界面
  • 3.拓展

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.rhkb.cn/news/353902.html

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

相关文章

计算机专业毕设-在线商城系统

1 项目介绍 在线商城系统&#xff0c;后端java语言&#xff0c;springboot&#xff0c;SSM框架。前端thymeleaf&#xff0c;前后端不分离。本项目已经隐去作者信息&#xff0c;所有代码文件均没有创建人和创建时间&#xff0c;可以放心使用。 系统用户分为两类&#xff0c;管理…

Spring-JdbcTemplate

了解知道即可 JdbcTemplate环境配置 先加入依赖&#xff1a; 在pom.xml中要引入spring和mysql的依赖&#xff1a; <!--仓库和依赖--><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><ur…

逻辑蕴含、函数依赖集的闭包、Armstrong公理、属性集闭包

一、引言 Armstrong公理-从给定的函数依赖集得到关系模式的完整依赖集 二、逻辑蕴含 1、定义 设F是关系模式R上的函数依赖集&#xff0c;X、Y是R的属性子集&#xff0c;对于R的每个满足F的关系实例r&#xff0c;若函数 依赖都成立&#xff0c;则称F逻辑蕴含。 记为&#…

2021 hnust 湖科大 C语言课程设计报告+代码+流程图源文件+指导书

2021 hnust 湖科大 C语言课程设计报告代码流程图源文件指导书 目录 报告 下载链接 https://pan.baidu.com/s/14NFsDbT3iS-a-_7l0N5Ulg?pwd1111

LUA移植到STM32F4,移植REPL,通过RTT Viewer交互

概述 站内移植LUA多数是使用C函数调用LUA&#xff0c;并没有移植REPL交互端口 本文将REPL也移植进去&#xff0c;做了简单的适配 LUA源码使用标准C库函数&#xff0c;如fgets&#xff0c;fwrite等&#xff0c;在嵌入式环境中要使用fgets&#xff0c;fwrite等C库函数&#xff…

用c语言实现通讯录

目录 静态简易通讯录 代码&#xff1a; 功能模块展示&#xff1a; 设计思路&#xff1a; 动态简易通讯录&#xff08;本质顺序表&#xff09; 代码&#xff1a; 扩容模块展示&#xff1a; 设计思路&#xff1a; 文件版本通讯录 代码&#xff1a; 文件模块展示&#x…

JAVA开发 PDF文件生成表格,表格根据内容自动调整高度

1、展示效果 2、相关功能实现 JAVA开发 使用Apache PDFBox库生成PDF文件&#xff0c;绘制表格 3、实现代码 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.ap…

傲星一个在线工具箱源码附搭建教程

傲星工具箱源码是一款功能强大的在线工具箱程序&#xff0c;您可以通过安装扩展来增强其功能。同时&#xff0c;该程序还提供了插件模板的功能&#xff0c;让您可以将其作为网页导航使用。 1.PHP版本需不低于7.2.5。 2.Mysql版本需不低于5.7。 3.需要安装fileinfo扩展。 4.…

Python | 使用Matplotlib生成子图的示例

数据可视化在分析和解释数据的过程中起着举足轻重的作用。Python中的Matplotlib库提供了一个强大的工具包&#xff0c;用于制作各种图表和图表。一个突出的功能是它能够在单个图中生成子图&#xff0c;为以组织良好和结构化的方式呈现数据提供了有价值的工具。使用子图可以同时…

北京崇文门中医医院贾英才:中医传承的践行者

贾英才&#xff0c;一位在北京崇文门中医医院出诊的杰出中医执业医师&#xff0c;在中医领域深耕近三十载&#xff0c;以其精湛的医术和独特的诊疗验方体系&#xff0c;赢得了广大患者的信赖与认可。 贾英才自幼便深受家学熏陶&#xff0c;中医的种子早早在他心中扎根。成长于中…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi&#xff1a;https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;于2023年10月9日推出的一款人工智能助手&#xff0c;主要为用户提供高效、便捷的信息服务。它具备多项强大功能&#xff0c;包括多…

深入理解计算机系统 CSAPP 家庭作业6.35

第一步先求(S,E,B,m) 题目说共C128个字节,块大小B为16个字节,那就是分为八组:0,1,2,3,4,5,6,7.然后每组存4个int 每个4字节 CB*E*S .B16 ,直接映射的E就是1,所以S8 (S,E,B,m)(8,1,16,7) C128M128s3b4t0 sizeof(int)0100地址(二进制)COCIsrc[0][0]00000000000000组0src[0][1…

上市公司-社会责任报告、ESG报告文本(2006-2023年)

上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件&#xff0c;涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响、提升社会福祉、维护员工权益、促进社区发展以及确保透明和道德的管理实践等方面的信息和数据。有助于了…

linux 线程

文章目录 1.线程概念线程优点线程缺点 2.Linux线程和进程3. Linux线程控制线程创建---pthread_create线程等待---pthread_join线程退出线程分离---pthread_detach 1.线程概念 进程内核数据结构 进程代码和数据 我们的代码在进程中&#xff0c;全部都是串行调用的 进程创建&am…

入侵检测系统(IDS)

入侵检测 入侵检测&#xff08;Intrusion Detection&#xff09;是指发现或确定入侵行为存在或出现的动作&#xff0c;也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为&#xff0c;或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

upload-labs第十三关教程

upload-labs第十三关教程 第十三关一、源代码分析代码审计 二、绕过分析1&#xff09;0x00绕过a.上传eval.pngb.使用burpsuite进行拦截修改之前&#xff1a;修改之后&#xff1a;进入hex模块&#xff1a; c.放包上传成功&#xff1a; d.使用中国蚁剑进行连接 2&#xff09;%00绕…

20240619在飞凌OK3588-C的LINUX系统启动的时候拉高3个GPIO口141-111-120【方法一】

20240619在飞凌OK3588-C的LINUX系统启动的时候拉高3个GPIO口141-111-120【方法一】 2024/6/19 16:12 缘起&#xff1a;在凌OK3588-C的LINUX R4系统启动的时候&#xff0c;需要拉高GPIO4_B5、GPIO3_B7和GPIO3_D0。 修改rcS&#xff0c;在系统启动的时候&#xff0c;即可拉高。 通…

极具吸引力的小程序 UI 风格

极具吸引力的小程序 UI 风格

002.Linux CentOS7 安装

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

湖北文理学院2024年成人高等继续教育招生简章

湖北文理学院&#xff0c;作为一所历史悠久、底蕴深厚的学府&#xff0c;始终致力于为社会各界培养具备高素质、专业技能和创新精神的优秀人才。在成人高等继续教育领域&#xff0c;湖北文理学院更是凭借其卓越的教学质量和丰富的教育资源&#xff0c;吸引了众多有志于提升自身…