实现自己的音乐搜索软件(三)

No.13 免费音乐软件推荐:轻松畅听全网音乐 这些开源音乐软件为用户提供了丰富的音乐搜索和播放功能,让您可以享受高品质的音乐畅听体验。它们支持多种音乐平台,如网易云音乐、QQ音乐、酷狗音乐等,同时提供了自动切换播放源、精选歌单、数据同步等实用功能。它可以让用户在一个App中享受来自不同平台的丰富歌曲资源,包括网易云音乐、QQ音乐和虾米音乐等。它支持多种音乐平台,包括网易云音乐、QQ音乐、酷狗音乐等,并且可以搜索和播放歌曲。这个开源项目是一个名为Listen 1的音乐播放器,它可以让你从多个主流音乐网站搜索和播放歌曲,使你的曲库更加全面。 阅读详情

实现自己的音乐搜索软件(一)

 

实现自己的音乐搜索软件(二)

 

 

前面介绍了实现自己的搜索模块,我们已经能够从互联网上搜索到自己想要的音乐的地址了,所以这一篇文章主要介绍实现自己的下载的模块。对于下载模块,也没有做的很复杂,毕竟对于象迅雷那种很强劲的下载工具也不是很了解,所以只能在功能上模仿一个形似。

 

 


 

 

一 下载模块功能

 

上图右侧显示了下载模块的基本功能,支持多任务下载,并且支持断点续传。所以可以进行暂停,取消等控制。而下载并没有使用多线程下载,因为相对要复杂一些,所以目前只是单线程下载。对于MP3这种小文件来说速度还是不错的。

 

对于下载模块多任务实现,没有使用异步方法,或者是建立线程池去控制。而是使用了基于事件的异步模型。在.NET中基于此模型实现的控件就是BackGroundWork,他能很好的解决子线程和UI主线程间的通信,并且使用起来非常方便。但是他最大的问题是,他是以一个控件实现的,并且不支持多任务,所以我们想要使用他的话,每一个任务都需要使用一个控件,并且如果像编写一个与UI无关的下载模块,却引人一个UI控件,总是不太好,所以我们下载的核心就是自己实现一个可以支持多任务的BackGroundWork模块,用来管理下载。除了下载管理模块之外,我们还需要具体的下载功能以及下载后的文件管理功能。

 

.

.

 

二 下载模块结构

如上图,下载模块一共有3个文件,其中DownloadCore.cs是对HttpWebRequest的包装主要负责下载,支持断线续传;DownloadManagement.cs是模块的核心,负责下载任务的调度,控制和管理,整个功能是模仿BackGroundWork进行,但是支持多任务控制,而且支持调度控制;FileManager.cs文件是对下载文件的管理,负责文件重名,下载临时文件等处理。

 

DownloadManagement在使用方面和BackGroundWork一样,使用时注册DoWork,ProgressChanged,RunWorkerCompleted3个事件。在DoWork事件对应的方法中,调用DownloadCore对象进行下载;在ProgressChanged事件对应的方法中更新下载进度和状态,而在RunWorkerCompleted3事件触发时,调用FileManager对象,管理文件。

 

.

.

三 下载管理的实现

对于下载管理DownloadManagement,是参照BackGroundWork实现的,不过他可以支持多任务,并且可以对多任务之间进行管理。在了解本对象实现之前,最好能对BackGroundWork的实现有一定了解,可以参考我之前的文章BackgroundWork的内部实现

 

1 多任务的支持

相对于BackGroundWork,我们支持了多任务,所以必须在内部有一张表来维护这些任务。从而能对这些任务进行调度,而且还必须有一个位置的值作为Task的key,来唯一标识一个任务。

 

 

以上是类中定义的一些变量,可以看到,我们定义了3个哈希表,用来保存等待下载和正在下载的任务,而另一个管理同步操作的列表。同时定义了3个同步锁,保证多个任务能同时正确的操作哈希表。而哈希表的key使用的是GUID,这样就能保证唯一性,每个下载任务都有一个GUID。

 

前面两个哈希表比较好理解,存放的对象是DownloadMusicTask,而后一个用来管理同步操作的哈希表存放的是AsyncOperation对象。在前面的BackgroundWork的内部实现的文章中有介绍过这个对象,他是BackGroundWork的核心,用来和UI线程进行通信的。他具体的实现细节前面文章介绍过了,这就就不在说了。但是BackGroundWork是单任务的,所以只存在一个AsyncOperation对象,而我们这里支持多任务,所以必须有多个AsyncOperation对象。

 

您的类应该在每个任务开始时调用 AsyncOperationManager.CreateOperation,为每个异步任务获取 AsyncOperation 对象。为了使客户端能够区分不同的异步任务,AsyncOperationManager.CreateOperation 采用一个参数作为客户端提供的独一无二的标记,这个就是 UserSuppliedState 属性。然后客户端代码便可使用该属性来标识当前引发进度或完成事件的特定异步任务。

 

以上是MSDN对他使用的解释,所以我们在创建对象时,把任务的GUID传递给了他,保证了唯一性,而在BackGroudWork中传递的是null,因为只有一个对象。

 

我们的的多任务下载就是以此为基础进行的。每个任务都有一个GUID,当需要与UI交互时,我们根据GUID从哈希表中查找到相应的AsyncOperation对象,然后调用Post或者PostOperationCompleted方法和UI进行通信。

.

2 基于事件的异步实现

我们这里的实现,基本和BackGroudWork一致,不过相对于多任务增加了一些功能。微软也建议对于更复杂的异步应用程序,请考虑实现一个符合基于事件的异步模式的类。

 

参考:《使用基于事件的异步模式进行多线程编程》http://msdn.microsoft.com/zh-cn/library/hkasytyf(v=VS.90).aspx

 

基于事件的异步模式可以采用多种形式,具体取决于某个特定类支持的操作的复杂程度。最简单的类可能只有一个方法名称Async 方法和一个对应的方法名称Completed 事件。更复杂的类可能有若干个方法名称Async 方法(每种方法都有一个对应的方法名称Completed 事件),以及这些方法的同步版本。这些类分别支持各种异步方法的取消、进度报告和增量结果。

 

以上是我们的DownloadManagement 类中定义的事件成员。为了简便,我们使用了BackgroundWork使用的委托原型。当然也可以自己定义事件的委托类型以及参数类型。随后我们定义了3个事件发生时通知订阅者的虚方法。在这里我们并没有显示的去实现事件的订阅与注销,因为我们这里事件很少,而且也不太关注CLR实现的事件潜在的同步问题,以为使用对象自己作为同步锁,对于大多数程序并不是一个问题。

 

最后我们就需要定义三个触发事件的方法,在开始下载,下载中以及下载完成时触发。但是我们要注意到一个问题。我们这里定义了三个事件,注册这些事件的方法应该都是UI中的方法。而我们DownloadManagement本质是使用多线程。所以就存在一个子线程修改UI控件的问题,这是不允许的,所以我们需要使用前面提到的AsyncOperation对象,把这些方法发送到UI线程执行。而在我们这里,就是要把这3个触发事件的方法,发送到UI线程执行。所以我们需要利用委托来包装这3个方法。

 

所以我们定义了和这3个方法有关的委托,并在构造函数中和相应的方法进行绑定。其中WorkerThreadStartDelegate是我们自定义的委托类型,因为开始下载的方法需要在一个新的线程中执行,使用了委托的Invoke方法。而另外两个方法和SendOrPostCallback委托绑定,此委托是系统定义的:表示在消息即将被调度到同步上下文时要调用的方法。

.

 

3 实现异步方法

 我们这里只实现了异步方法,而没有实现同步方法,因为单线程下载是没有意义的。对于我们来说,这里有开始下载,停止下载,取消下载,报告下载进度这几个异步的方法。并且这几个方法是public的,共外部调用。先看看整个下载功能开始的方法

整个方法比较简单,传入一个下载任务对象,检查次任务是否已经存在,如果不存在就新建一个对应的AsyncOperation对象,并添加到哈希表中。根据目前任务数量决定是进入下载队列还是等待队列。如果可以下载,我们使用了threadStart.BeginInvoke 方法让这个任务在一个新的线程中运行,这也是我们这个管理类的本质,仍旧是使用多线程。

以上就是接受到任务后,在新的任务线程中执行的方法。他的作用是管理整个下载过程。首先是触发了注册的DoWork时间的方法,我们这里也就是实际的下载方法。总的来说,这里就是让DownloadCore对象的下载方法在一个新的线程运行。当下载完成后,需要触发RunWorkerCompleted事件,并把注册的方法发送到UI线程执行。这里可以看到使用了AsyncOperation对象的PostOperationCompleted方法,并把operationCompleted委托作为参数传递了过去。

接下来就是进度报告的异步方法。使用了AsyncOperation对象的Post方法,并把progressReporter委托传递了过去。

.

 

4 异步方法的暂停和取消

在多线程和基于APM的异步模型中,最麻烦的就是暂停一个异步操作。对于基于事件的异步模型来说,应该尽量支持取消操作,而且在取消时要出发RunWorkerCompleted事件,这是微软的建议。

 

在实现上,是对于每个任务都有两个标志IsCancle 和 IsStop ,我们的工作也就是设置这两个标志的状态。这里有一个问题,我们这个模块很难用在下载以外的地方,因为很难知道如何去结束一个异步操作。这也是为什么BackgroundWork不支持取消的原因。所以我们这里设置的标志位,在下载时会使用到,如果标志位为true,则从正在运行的程序中退出。从前面可以知道,下载结束时,会触发RunWorkerCompleted事件。 对于没有在下载的任务,取消时直接触发RunWorkerCompleted事件。

.

 

5 总结

以上就是实现的基于事件的异步模型,从整个模型可以看出,他的功能就是利用委托,启动一个新的线程,运行注册到类事件上的方法,而事件并不需要知道运行的是什么方法。对于报道进度,这里只是负责把数据和注册到时间的方法发送到正确的线程中,结束时也是一样。所以基于事件的异步模型更像是一个邮差。接受数据和方法,并投递到订阅者那里,如果处理这些数据,用什么方法处理,都是订阅者的事情。这样以来,就简化了我们使用多线程时一切都要自己控制,代码也更清晰,逻辑中基本看不到多线程处理的恒基。

.

.

四  文件下载和文件管理

文件下载,使用的是HttpWebRequest对象。整个过程和网页请求是一样的,不同的是相对于网页,MP3文件较大,所以我们在读取请求的流时是循环读取的。而且在保存下载数据时也要考虑到暂停和同名等情况。

 

 

以上就是下载的实现方式,主要有几点,一个是断点续传,一个是报告进度,另一个就是计算下载速度。

. 

1 断点续传

断点续传的功能实际是利用了HttpWebRequest的AddRange方法来实现断点续传。下载时我们把文件存入到一个.mus后缀的临时文件中。当暂停一个下载任务时,这个任务并没有从前面的DownloadManagement的哈希表中删除,只是标志位设置为了stop。

 

当继续下载时,首先从硬盘上读取这个文件,如果存在,则获得文件大小,并设置到HttpWebRequest的AddRange方法中,这样就能从指定的位置请求数据,实现断点续传。另外要注意的是,断点续传时,HttpWebResponse.ContentLength返回的只是剩余数据的大小,而不是全部数据的大小。如果弄错会导致下载的文件变小,播放的MP3就是乱的了。

.

 

2 进度报告和速度

在HttpWebResponse请求成功之后就马上进行了报告,这样做是为了让UI获得要下载的文件的大小数据,以及准备下载的状态。在下载中,利用已下载大小和文件大小来进行循环,每次从流中读取1024个字节。没读取一次回报一下进度,当然可以自己去控制回报进度的频率。在下载的过程中可能会出现错误,在出现错误时,也进行了进度汇报,这样前台就能知道此时下载的状态。

 

对于计算速度,就是用下载字节数除下载的时间。但是问题就是,如果读取1024个字节就计算一次,可能很不准确,因为读1024自己的时间很短,而且这样更新太快,用户也看不清楚。所以这里我采用了每400ms计算一次速度,实际的效果还是不错的。

.

 

3 文件管理

我们在下载时,文件名为歌曲的名字,所以下载多个同名音乐时很可能出现同名的状况。通用的情况就是给后面的文件加上(1),(2)这样的后缀。而在下载过程中,文件是存放到扩展名为.mus的文件中。当下载完成后,重名为对应的音乐格式后缀。而在文件取消和下载失败时,也需要对文件进行删除等操作。

 

 

这里也考虑了在下载是使用一个后缀为mus的文件存放数据,另一个后缀为cfg的文件存放下载信息,比如把DownloadMusicTask对象序列化存入到文件中,这样,即便在下载暂停,程序关闭之后,在下一次打开程序是,还能再次进行下载。而且对于多线程下载时,每个下载块的管理也是很有必要的。但是目前并没有这样做。不过实现起来没有什么难度。

 

.

.

 

五 总结

这一篇主要介绍了实现的下载模块,实际我想介绍的核心就是基于事件的异步模型。所以其他和下载相关的一些地方就介绍的很少或者没有提及。目前比较忙,没有时间继续写,程序实现的功能也基本就是目前介绍的这些。 当然还是用了WMP的插件,实现了在线播放。并且还写了一个网络状态实时检查的功能,但这里都没有做更多的介绍。

 

在后面计划尝试进行歌词的实时显示功能,不过不知道是否有时间。因为进去工作比较忙,在开发一个手机平台上的msn客户端,也打算马上写一系列MSN协议分析的文章。所以时间就很难说了。

 

源代码SVN:http://code.google.com/p/cmusicsearch/

 

 

音乐破解哦哦哦 你可以在这里找到最近正在热门的音乐,还能看到推荐的歌手、单曲推荐,热门歌单等,喜欢的音乐可以直接点击播放,或点击单曲后面的三个点击就可以看到下载按钮,支持免费下载单曲、歌词、封面等详细内容。页面左侧提供了超详细的音乐分类,包括民谣、电子乐、古典、电影、爵士乐、嘻哈、流行、民族等不同风格的音乐,还支持强大的音乐搜索,输入歌曲的英文名字或歌手就可以找到相关的音乐。一个非常强大的音乐搜索网站,支持搜索各大平台的音乐,支持输入歌名、歌手、ID、音乐地址等详细信息搜索单首歌曲,搜索到的歌曲支持在线播放以及免费下载。 阅读详情

相关推荐

软件案例分析:商业音乐软件还是开源音乐软件?

本文选择了商业音乐软件网易云音乐和开源音乐软件Listen1进行对比分析

Blore1507的博客 1335

实现自己的音乐搜索软件(二)

音乐搜索中,有关搜索的具体实现

CC的技术专栏 4243

ASP.NET MVC3官方示例Music Store(音乐商店)源代码

ASP.NET MVC3官方示例Music Store(音乐商店)源代码 经过整理后的源代码 含有 SSCERuntime的安装文件

基于Django以及requests爬虫的音乐网站

基于Django以及requests爬虫的音频网站

qq_49259434的博客 3191

Asp.net mvc 4.0 音乐商店

Asp.net mvc 4.0 音乐商店 源代码教程

百度音乐搜索模块

用百度音乐的接口做的音乐搜索模块,封装了搜索音乐的接口,和下载功能

免费听歌软件,音乐搜索APP:掌中的音乐宝库,为您的音乐生活增添色彩

同类软件还有小橘音乐、soul音乐、Listen1和等。无需氛金,也可以免费下载无损音乐(非常良心了,没有广告)对比那些动不动开了会员还没有音频的算是良心太多了。音乐搜索APP,一款真正为您量身打造的音乐软件。无论您是音乐发烧友还是普通爱好者,它都能满足您的音乐需求。快来下载体验,让音乐搜索APP成为您生活中的音乐宝库吧!

qq_28768477的博客 2743

.netMVC音乐商店 源代码(C#)

此代码采用ASP.net 技术,使用MVC框架实现的音乐商店系统,代码完整,可以直接运行,可以作为软件相关专业毕业设计或者课程设计的参考。

免费下载音乐软件推荐:方格音乐 - 高音质,全网搜索,免费下载

方格音乐是一款非常实用的音乐下载工具,支持安卓手机和Windows电脑。遗憾的是,苹果用户暂时无法使用这款软件。。通过这个网站,你可以下载到适合自己设备的安装包,并进行安装使用。虽然免费音乐软件的使用体验可能会因为各种原因而不尽如人意,但通过下载功能,我们可以更好地掌控自己的音乐资源。方格音乐作为一款免费的音乐下载工具,能够帮助我们解决音乐播放的困扰,让我们随时随地都能享受高质量的音乐体验。如果你觉得这些免费工具不符合你的要求,当然可以选择购买正版音乐服务,以支持原创音乐的健康发展。

QQ183718318的博客 1万+

一个简单的MVC音乐商城

一个简单的MVC框架做的音乐商城,MVC音乐商城实例,功能齐全。

MVC音乐商店实例_完整中文版20141008

目前网上的MVC的教程或者很少,或者套路的泛泛概述,而好的项目源码也不多,初学者不易入手,所以一篇系统的项目开发案例教程就很必要了。微软的原版为英文,这个是中文的,学习MVC的不可不珍惜。

[工具]更新音乐下载软件工具音乐下载网站,MP3音乐无损音乐下载器

微信关注“DLGG创客DIY”设为“星标”,重磅干货,第一时间送达。今天推荐几个音乐下载的网站,想当年音乐随便下,这几年因为版权神马问题下个歌都费尽,今天推荐几个好用的网站和软...

tiandiren111的专栏 5274

音乐商城系统(ASP.NET MVC)

专辑购买系统,实现功能如下: 前台:首页显示(专辑及各种信息的显示、登录、注册)、会员个人中心(编辑信息、修改密码等)、订单管理(订单列表、付款、订单详细、发表评论)、购物车、聊天机器人、专辑评论等 后台:专辑管理、歌手管理、类别管理、评论管理、订单管理(发货、查看详细)、评论管理、销售统计等

音乐软件案例分析

​ 用户在网易云音乐上分享、评论音乐,表达自己的情感和观点。根据数据显示,QQ音乐,酷狗音乐,虾米音乐,网易云音乐,酷我音乐,综合ASO指数,关键词覆盖,AppStore排名,QQ音乐以其简单清爽的UI设计风格代表腾讯系对音乐市场的极度重视,网易云音乐凭借年度听歌报告再一次重击市场吸引广大用户,酷狗音乐作为老牌App也在数字音乐行业不断找寻自己的定位。基于以上关系,可以利用这些关系构建特定的用户生态:利用用户之间的关注、粉丝关系和相似的音乐兴趣,构建一个社交音乐社区,为用户提供交流、分享和发现音乐的平台;

weixin_60920767的博客 2377

游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析

本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。

u8v9w0x1y的博客 445

【WRF数据准备】基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

WW、forever的博客 591

软件案例分析-音乐软件界的卧龙凤雏-酷狗音乐与网易云音乐

项目 内容 这个作业属于哪个课程 2022春季软件工程(罗杰 任健) 这个作业的要求在哪里 个人作业-软件案例分析 我在这个课程的目标是 学习软工的项目合作管理知识,提升软件开发技术 这个作业在哪个具体方面帮助我实现目标 深入分析软件的功能与问题,学习如何进行软件测评以及调研市场需求 Part0 前言 现在许多人生活中都离不开音乐,而当前主要的听音乐方式毫无疑问就是各种音乐软件,包括移动端,Web端,PC客户端这三种主要的软件呈现形式,当前国内的音乐app数量众多,本次作业主...

weixin_45783724的博客 6720

2025年CSP-J初赛真题及答案解析(完整版)

2025年CSP-J初赛真题及答案解析(完整版)

王老师青少年编程 1万+

音乐搜索器终极指南:一站式搜索全网音乐资源

在当今数字音乐时代,用户常常需要在不同音乐平台之间切换才能找到心仪的歌曲。音乐搜索器应运而生,它是一个开源的多站合一音乐搜索解决方案,让您只需一个界面就能搜索和试听来自网易云音乐、QQ音乐、酷狗音乐等十多个主流平台的音乐资源。 ## 🎵 项目核心功能亮点 ### 全网音乐资源整合 音乐搜索器最大的优势在于整合了全网音乐资源。无论您想听流行歌曲、经典老歌还是网络热歌,都能在这里找到。项目支持包

gitblog_00652的博客 1138

Ardupilot chibios主函数学习(1)

目录 文章目录目录摘要第一部分chibios主函数**(1)主回调函数入口****(2)主回调函数入口****(3)主回调函数入口****(4)主回调函数入口**1.函数hal.scheduler->init()分析 摘要 本节主要记录自己学习Ardupilot的 chibios代码过程,欢迎批评指正。 第一部分chibios主函数 (1)主回调函数入口 AP_HAL_MAIN_...

陌城烟雨 4243

趋势跟踪策略

/ 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred);

2401_84919512的博客 354

虾米音乐关闭后还有什么好用的音乐软件?

苏生不惑第209 篇原创文章,将本公众号设为星标,第一时间看最新文章。前几天虾米音乐发布公告2月5号将正式关闭,12年的音乐软件要下架了https://act.xiami.com/wow...

sushengbuhuo的博客 4674

5、基于模型的系统工程(MBSE)全面解析

本文全面解析了基于模型的系统工程(MBSE),介绍了模型在系统工程中的核心地位,以及如何通过视图和符号表示法实现信息的可视化。文章还详细阐述了MBSE的方法构成,包括框架(本体和视图点)和流程集,探讨了MBSE的实施流程、关键要素、应用策略以及未来发展趋势。通过合理应用MBSE,组织可以提高系统开发的效率和质量,降低成本与风险,实现成功部署。

nft7creator的博客 127
上一篇: 实现自己的音乐搜索软件(二)
下一篇: MSNP18协议分析(一)--- MSN协议介绍
cc_net
博客等级 码龄21年 901粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值