电脑上存放了特别的歌曲,大概有2400首左右,每次通过播放器选择相应歌曲实在麻烦,于是打算自己使用Java写一个终端下的音乐播放器,我使用的ubuntu,因为java是跨平台语言,所以什么系统已经无所谓了。首先本片文章讲述歌词的获取。

网上有很多关于百度音乐,QQ音乐等的歌词获取,个人尝试了一下百度音乐,可以获取,但是却发现一个问题,获取的歌词没有我们在百度音乐网页上看到的全面,我搜过了一下 “丁当的猜不透”,结果网上的代码根本搜不到任何歌词,但是在线版百度音乐确实有,不过对于一些经典歌曲还是能够搜索到相关的歌词的。QQ音乐已经把相应接口关闭。与其使用这些没有开发的api,不如找一个开放api的歌词搜索平台,歌词迷就是其中一个。

歌词迷(http://api.geci.me/en/latest/#)提供了3种歌词检索方式,还有一个封面检索

  • 根据歌曲名获取歌词
  • 根据歌曲名和歌手名获取歌词
  • 根据歌曲编号获取歌词URL
  • 根据专辑编号获取专辑封面URL

我们为了提高歌词的准确性,采用歌曲名加歌词的方式进行搜索,api说明如下

根据歌曲名和歌手名获取歌词

  • 请求地址

    http://geci.me/api/lyric/:song/:artist

  • 返回格式  JSON

  • 请求方法 GET

    返回数据样式

{"count": 14,"code": 0,"result":[
{"lrc": "http://s.geci.me/lrc/166/16685/1668536.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1668536, "aid": 1563419},
{"lrc": "http://s.geci.me/lrc/167/16796/1679605.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1679605, "aid": 1571906},
{"lrc": "http://s.geci.me/lrc/168/16819/1681961.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1681961, "aid": 1573814},
{"lrc": "http://s.geci.me/lrc/179/17907/1790768.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1790768, "aid": 1656038},
{"lrc": "http://s.geci.me/lrc/187/18757/1875769.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1875769, "aid": 1718741},
{"lrc": "http://s.geci.me/lrc/226/22642/2264296.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2264296, "aid": 2003267},
{"lrc": "http://s.geci.me/lrc/228/22889/2288967.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2288967, "aid": 2020610},
{"lrc": "http://s.geci.me/lrc/233/23323/2332322.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2332322, "aid": 2051678},
{"lrc": "http://s.geci.me/lrc/283/28376/2837689.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2837689, "aid": 2412704},
{"lrc": "http://s.geci.me/lrc/311/31116/3111659.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3111659, "aid": 2607041},
{"lrc": "http://s.geci.me/lrc/316/31663/3166350.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3166350, "aid": 2647055},
{"lrc": "http://s.geci.me/lrc/318/31803/3180339.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3180339, "aid": 2657468},
{"lrc": "http://s.geci.me/lrc/377/37740/3774083.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3774083, "aid": 3093833},
{"lrc": "http://s.geci.me/lrc/386/38612/3861244.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3861244, "aid": 3161846}]
}

下面我们就开始具体实现歌词地址捕获:

 第一步:定义相应的bean

 由返回结果可以确定相应bean的定义,为什么要使用这个bean呢,首先操作方便,其次便于扩展,最后可以使用Gson方便的将json转换为bean,定义bean是变量名字请与返回数据名字保持一致,代码如下:

package honest.playmusic.bean;import java.util.List;/*** 歌词* @author 李跃东* @mail androiddevelop@qq.com* @date 2013-11-8*/public class OnlineLrc {public int count;public int code ;public List<LrcInfo> result;public void setCount(int count) {this.count = count;}public void setCode(int code) {this.code = code;}public void setResult(List<LrcInfo> result) {this.result = result;}public int getCount() {return count;}public int getCode() {return code;}public List<LrcInfo> getResult() {return result;}
}
package honest.playmusic.bean;/*** 歌曲信息(名字,绝对路径,播放时长,总帧数)* @author 李跃东* @mail androiddevelop@qq.com* @date 2013-11-8*/
public class Music {private String musicName; //音乐名字private String musicAuthor; //歌手private String musicAbsolutePath; //音乐绝对路径private long musicTime; //音乐总时长 (ms)private int musicFrameNumber; // 音乐总帧数public String getMusicName() {return musicName;}public void setMusicName(String musicName) {this.musicName = musicName;}public String getMusicAuthor() {return musicAuthor;}public void setMusicAuthor(String musicAuthor) {this.musicAuthor = musicAuthor;}public String getMusicAbsolutePath() {return musicAbsolutePath;}public void setMusicAbsolutePath(String musicAbsolutePath) {this.musicAbsolutePath = musicAbsolutePath;}public long getMusicTime() {return musicTime;}public void setMusicTime(long musicTime) {this.musicTime = musicTime;}public int getMusicFrameNumber() {return musicFrameNumber;}public void setMusicFrameNumber(int musicFrameNumber) {this.musicFrameNumber = musicFrameNumber;}}

第二步:获取在线歌词

获取在线歌词只用按照官方的请求地址,使用java网络编程的相关操作

/*** 网上得到歌词* @param title 歌曲名* @param singer 歌手* @throws IOException * @throws MalformedURLException */public OnlineLrc getOnlineLrc(String title,String singer) throws MalformedURLException, IOException{String musicAddress="http://geci.me/api/lyric/"+title+"/"+singer;URLConnection connection=new URL(musicAddress).openConnection();BufferedReader in=new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuffer res=new StringBuffer("");String tmp;while((tmp=in.readLine())!=null){res.append(tmp);}OnlineLrc lrc=new OnlineLrc();Gson gson=new Gson();lrc=gson.fromJson(res.toString(), new TypeToken<OnlineLrc>(){}.getType());return lrc;}

第三步:提取json数据中的地址

这里我们使用一个开源的数据转化项目gson,它的官方地址http://code.google.com/p/google-gson,gson可以方便的进行json与bean之间的转换,将得到的json转换为bean,然后进行简单的操作即可将所有的歌词地址提取出来,代码如下:

/*** 获取歌词所有地址* @param title 歌曲名* @param singer 歌手* @throws IOException * @throws MalformedURLException */public List<String> getMusicLrc(String title,String singer) throws MalformedURLException, IOException{List<String> address=new ArrayList<String>();OnlineLrc onlineLrc=getOnlineLrc(title, singer);List<Lrc> lrc=onlineLrc.getResult();for(int i=0;i<lrc.size();i++)address.add(lrc.get(i).getLrc());return address;}

这样我们就得到了所有歌曲的歌词地址了,测试一下

public static void main(String[] args) {try {List<String> res=new OnlineLrcManager().getMusicLrc("猜不透","丁当");for(int i=0;i<res.size();i++)System.out.println(res.get(i));}catch (Exception e) {e.printStackTrace();}}

结果如下:

http://s.geci.me/lrc/382/38295/3829595.lrc
http://s.geci.me/lrc/423/42360/4236045.lrc

下载一个,打开查看:

[ti:猜不透]
[ar:丁当]
[al:《我爱上的》]
[by:百岛@UKOO]
[00:00.00]
[00:02.00]丁当 - 猜不透
[00:04.00]专辑:《我爱上的》
[00:06.00]作词:黄婷
[00:08.00]作曲:林迈可
[00:10.00]编曲:林迈可
[00:12.00]LRC:百岛@UKOO音乐论坛
[00:14.00]@网络支持:UKOO www.ukoo.net@
[00:16.00]
[00:26.69]猜不透 你最近是好是坏更沉默
[00:38.13]我也不想去追问 太多
[00:45.52]让试探为彼此的心 上了锁
[00:53.55]
[00:54.43]猜不透 相处会比分开还寂寞
[01:05.48]两个人都只是得过且过
[01:12.37]无法感受每次触摸 是真的 是热的
[01:24.47]
[01:25.27]如果忽远忽近的洒脱 是你要的自由
[01:32.07]那我宁愿回到一个人生活
[01:39.72]如果忽冷忽热的温柔 是你的借口
[01:46.70]那我宁愿对你从没认真过
[01:53.99]
[02:03.02]猜不透 相处会比分开还寂寞
[02:14.01]两个人都只是得过且过
[02:21.09]无法感受每次触摸 是真的 是热的
[02:33.39]
[02:34.19]如果忽远忽近的洒脱 是你要的自由
[02:40.89]那我宁愿回到一个人生活
[02:47.59]如果忽冷忽热的温柔 是你的借口
[02:54.59]那我宁愿对你从没认真过
[03:01.37]
[03:01.95]如果忽远忽近的洒脱 是你要的自由
[03:08.75]那我宁愿回到一个人生活
[03:15.65]如果忽冷忽热的温柔 是你的借口
[03:22.49]那我宁愿对你从没认真过
[03:29.03]
[03:29.44]到底这感觉谁对谁错
[03:33.58]我已不想追究
[03:36.26]越是在乎的人越是猜不透
[03:44.70]

歌词获取结束,下一篇将会继续讲解 音乐播放器(2)--歌曲数据存放

转载请注明原帖地址:http://blog.csdn.net/dliyuedong/article/details/14527067

音乐播放器(1)--在线歌词获取相关推荐

  1. 全网首个tk网络音乐播放器!支持歌词滚动!你看我吊不?

    这是一个用 Python 的 tkinter 库做的一个网络音乐播放器.我不说它的 UI 设计的有多好看,但是它的功能绝对是全站首个!坚持看到底,你不点赞算我输! 成果展示 程序截图 前期准备 程序结 ...

  2. android版音乐播放器----卡拉OK歌词实现(二)

    相信大家都看过酷狗的音乐播放器,特别是酷狗的滚动歌词实现起来,效果特别好.我自己也尝试看了一下酷狗的歌词文件,发现是加密的,根本就看不了,所以只能是从目前开源的歌词文件出发了.我自己选择的是ksc歌词 ...

  3. Qt音乐播放器实现(带歌词功能)

    最近期末项目要写一个音乐播放器,作为新人头疼了好久,参考了各方文档,总算憋出来了一个,歌词功能用的是一个大佬实现的,然后我就调用了,就是我那个lyricwidget.cpp和头文件就是直接弄过来的,但 ...

  4. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

    一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...

  5. android音乐播放器开发在线加载歌词

    转载请注明出处: http://blog.csdn.net/u014608640/article/details/51899239 如果没有本地歌词怎么办?现在来将一下加载在线歌词.好了,还是用那张图 ...

  6. 仿网易云网页版音乐播放器,实现歌词随歌曲进行滚动高亮

    引言 前几天在使用网易云网页版听歌时,看着那个页面的歌词随歌曲进行高亮,突然也想自己手动地去实现一下,于是呢,就仿照了网易云音乐的网页自己也写了个页面.效果图如下: 当然了,此处不做css的样式介绍, ...

  7. 手把手教你做音乐播放器(三)获取音乐信息

    第3节 获取音乐信息 在"视频播放器"的开发过程当中,我们已经学会了如何获取视频文件的信息: 定义一个视频信息的数据结构VideoItem: 自定义一个AnsycTask,在它的工 ...

  8. 音乐播放器的滚动歌词的实现

    先说下思路:歌词是tableView的实现,用个定时器每隔0.5秒就自动滚动一次,比较当前的时间和播放器的时间的大小来判断是否滚动到下一行.废话不多说,直接上代码. 一. 播放界面VC.h #impo ...

  9. android音乐播放器开发在线加载歌词,移动开发平台

    import android.util.Log; public class OnlineLrcUtil { private static String TAG = "OnlineLrcUti ...

最新文章

  1. C++ - RTTI(RunTime Type Information)运行时类型信息 详解
  2. excel模糊匹配两列文字_Excel快速画出美观饼图
  3. leetcode 606. Construct String from Binary Tree | 606. 根据二叉树创建字符串
  4. 十大排序总结(js实现、稳定性、内外部排序区别、时间空间复杂度、冒泡、快速、直接选择、堆、直接插入、希尔、桶、基数、归并、计数排序)
  5. python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行
  6. 文件操作(解密加密)
  7. ssm访问html乱码_SpringMVC+jdbc和SSM整合
  8. 破世界纪录了0.74秒!用代码实现自动扫雷!
  9. plsqlDev.exe启动时无监听问题
  10. 《人间告白》---我看万物像你,我看你像万物
  11. PHP中用while的用法,php while语句的用法
  12. iphone android传照片大小,快速地将iPhone/Android的照片传到电脑上
  13. Python自动化测试中的参数化使用
  14. Peekaboo(2019年上海网络赛K题+圆上整点)
  15. SMS短信PDU编码详细解析
  16. 华师计算机应用基础知识,华师计算机应用基础课后习题答案.doc
  17. mysql 计算近30天总金额_电商网站销售数据分析(MYSQL)
  18. 无限防 助你一臂之力 !!
  19. 工作好搭档(四):铷安居 H-C81 电脑桌
  20. JAVA中如何将大数字或字符串放进数组

热门文章

  1. java u0100_《Groovy语言规范》
  2. chattr加锁解锁
  3. 2、 前馈和反馈神经网络
  4. mysql计算日期间隔天数_mysql 计算两个日期之间的天数
  5. 计算机社团展示方案,计算机社团活动策划方案.doc
  6. 【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?
  7. matlab数字图像处理-消除条纹干扰
  8. 通信网数据流量压力测试软件,Socket Client Tester(压力测试工具)
  9. linux图形方式的运行级定义为,在大多数 Linux 发行版本中,图形方式的运行级定义为?...
  10. 什么是CSRF攻击,如何防范CSRF攻击?