论坛首页 Java企业应用论坛

开源JAVA音乐播放器YOYOPlayer1.2发布,全面改进歌词搜索

浏览 10851 次
精华帖 (1) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-02   最后修改:2009-08-02

注意:
JRE的最低版本是:1.6

本项目的所有代码已移到google code,此前在sourceforge和java.net项目不再维护了,现在项目的地址为:

http://code.google.com/p/yoyoplayer

在使用过程中有任何问题,都欢迎在此留言。

 

1.2更新[2009-08-02]
1,全新的歌词搜索方式,使搜索率大大提高。
2,把整个代码全部移到google code上去。以前的sourceforge和java.net已经不再维护了。
=====================================================================================
1.1.3更新[2008-07-28]

1,完全去除了其它的搜索部分,因为有些网页格式经常会变动,所以一段时间以后可能又搜不到歌词了,现在搜索歌词用的是百度的filetype:lrc 歌曲名-歌手名 的方式进行搜索.
2,更新了在线搜索歌词的时候,只能下载一首的情况,以前点了下载之后,整个界面就不可用了,要重新输入歌曲信息才可用,现在已经不做限制了.
3,修补了当以前下载并匹配的歌词文件不见的时候,会出现既不下载新的歌词也不提示出错,现在当以前的歌词文件不存在时,会自动上网搜索新的歌词.
==================================================================================
1.1.2更新[2008-04-03]

1,更改了精品网页的歌词搜索部分,因为精品网页的内容发生了改变,如果不更改对应的搜索方式的话
将不能从精品网页上查询到歌词,无论怎么样,都对精品网页表示感谢,它的网址是:http://www.jpwy.net/gc
2,修正了程序在某些LINUX版本上的系统上打开会抛出异常而影响程序使用的BUG.
3,在歌词秀窗口去掉了作者的名字:),此前的不便,望各位用户原谅.
4,在使用过程中,有任何的建议,可以加作者的QQ:24325142,注明yoyoplayer,或者
登录http://www.blogjava.net/hadeslee上留言,此博客为作者的博客,再此感谢大家对yoyoplayer的支持.
==================================================================================

    YOYOPlayer1.0版推出之后,得到了一些朋友的认可和反馈,经过这段时间的修改,现在推出YOYOPlayer1.1版.相对于1.0版,改进的地方如下:
一,设置方面
1,增加了首选项的功能,很多方面现在已经可以配置
二,歌词方面
1,增加了歌词搜索的自主性,用户可以选择自定义搜索关键字,也可以自定义是否和歌词文件相关联,这里的关联并不是把歌词写入歌曲文件,而是在程序中建立一种关联,以免每次播放这首歌的时候都去搜索歌词,而是直接去读取关联好的歌词文件.
2,增加了指定歌词的搜索目录,指定歌词的保存目录功能.为了性能考虑,歌词的搜索目录不会往下递归,只搜索设置的那一级目录.
3,歌词的设置更为丰富,很多地方以前是固定的,现在都是可以改变的,并且增加了纵向显示歌词的卡拉OK显示功能,还支持字体是否抗锯齿显示的选项.
4,支持淡入淡出显示歌词,支持多种对齐方式.
5,在windows下面支持歌词窗口的透明显示.在linux下面,此选项将被禁用:(
三,标签方面
1,现在完全支持ID3v1,ID3v2,APEv2,Vorbis标签的读取和写入,并可设置标签的读取和写入的编码.以免在读取标签的时候出现乱码的情况.程序的默认设置编码是GBK,如果是UTF-8的用户,可以在首选项修改.
四,其它方面
1,可以选择音频设备,这在一定程度上可以选择几个设置对比一下效果.尽量减少播放器没有声音的情况.
2,增加在任务栏滚动显示歌曲标题.
3,支持设置代理服务器连接网络.
4,支持对播放列表进行一些细化的设置,因为程序预设的颜色不一定符合大家的审美观.
5,配置目录现在改为{user.home}/.YOYOPlayer/,默认的歌词目录是{user.home}/.YOYOPlayer/Lyrics/
6,快捷键:C:播放,V:停止,B:下一首,空格:暂停,F2:显示/隐藏歌词秀,F3:显示/隐藏EQ窗口,F4:显示/隐藏播放列表
7,在一定程度上实现了窗口的吸附的功能,虽然不是很完美,还望各位有什么好的想法一起分享:)
在首选项里在的还有很多功能没有实现,因为个人的精力实在有限,YOYOPlayer项目已经在google code上申请了项目,有想一起开发的朋友,可以和我联系.

YOYOPlayer现在项目已经移至google code,以前的sourceforge和java.net上面的项目不再维护了。因为速度很慢。
google code上主页的地址是:
http://code.google.com/p/yoyoplayer
在程序的使用过程中有任何意见和BUG反应,请到http://code.google.com/p/yoyoplayer/issues/list上新建issue。
在使用的过程中,有任何问题,欢迎到http://www.blogjava.net/hadeslee或者上留言.也可以加本人的QQ:24325142.希望和大家一起探讨JAVA问题,让JAVA的浓香飘的更远.
最后,谢谢我的女友YOYO这段时间以来以我的关心和鼓励.

下载地址为:

http://yoyoplayer.googlecode.com/files/YOYOPlayer1.2.zip

 

 

   发表时间:2009-08-02  
下了。。。蛮不错的。。。

ps.我的女朋友也叫Yoyo,缘分阿~~^_^
0 请登录后投票
   发表时间:2009-08-02  
Laynepeng 写道
下了。。。蛮不错的。。。

ps.我的女朋友也叫Yoyo,缘分阿~~^_^

不会是一个人把
0 请登录后投票
   发表时间:2009-08-04  
看了一点源代码,我觉得作者对于java字符串理解还是不深刻。


在一个Util类里面我看到这样一个函数
public static String convertString(String source, String encoding) {
        try {
            byte[] data = source.getBytes("ISO8859-1");
            return new String(data, encoding);
        } catch (UnsupportedEncodingException ex) {
            return source;
        }
}
这个函数的意图似乎叫做转换,但是它的输入是String类型的东西,输出也是String类型的东西,这个过程你是转不了什么的,这是一个没意义的操作。
当我们定义String a ="天下";请问a变量指向的String对象里面存储的二进制形式是什么?答案必然是对"天下"这两个字符以某种编码方案的编码后的二进制内容。那么是什么编码方案呢?正如java宣称的那样是Unicode。没错,所谓java支持Unicode就是这个意思。现在我们来看这个函数,传进来一个source,然后执行这个source.getBytes("ISO8859-1")。这个什么意思呢?就是说将source指向的String对象内容以这个ISO8859-1编码方案编码输出,但是请注意source指向的String对象本身的内容还是原来的Unicode的形式,只是输出符合ISO8859-1编码的一堆byte。接下来做了这个return new String(data, encoding);这个干什么呢?以某种编码方案对某堆byte进行解析,解完后构造的String对象内部还是要以Unicode形式存储的。然后来说说这个“某种编码方案对某堆byte的解析”如果匹配那自然没有问题,如果不匹配那就可能出现问题。现在从这一句byte[] data = source.getBytes("ISO8859-1");来看这堆byte是ISO8859-1编码方案生成的,那么如果以非ISO8859-1的编码方案去解这堆byte很可能出问题。
所以如果我这样
String test = "安西四镇";
String rs = convertString(test,"GBK");
System.err.println(rs);
rs打印出来是四个????

现在假如我把你的那个函数改成
public static String convertString(String source, String encoding) {
        try {
            byte[] data = source.getBytes("UTF-8");
            return new String(data, encoding);
        } catch (UnsupportedEncodingException ex) {
            return source;
        }
}

String test = "安西四镇";
String rs = convertString(test,"UTF-8");
System.err.println(rs);
这样打印出"安西四镇",没错,但是这是在做无用功。

String test = "安西四镇";
String rs = convertString(test,"GBK");
System.err.println(rs);
这样打印出"瀹夎タ鍥涢晣",乱码。

String对象到String对象的转换时没有意义的,要么瞎折腾,无用功,要么反而折腾的出错了。因为String对象对于字符一直是以Unicode形式存储的,它可以按某个编码方案输出一堆byte,也可以按某个编码方案从一堆byte解析,但是最终在内存的存储都是Unicode形式。只有当你要与外围(网络,文件,。。。)打交道的时候才会考虑转码,解码问题,两个String对象之间这不是瞎折腾吗。
0 请登录后投票
   发表时间:2009-08-15  
偶太低级,下载了这个播放器了,都不知道怎么用...
0 请登录后投票
   发表时间:2009-08-26  
哈哈,我找做LRC歌词的资料,搜索到这里来了。
我准备用swt/jface做个,才没做几天(上班要搞j2ee,下班做做学习学习),可以看看偶的博客http://user.qzone.qq.com/345343747/blog/1251030474,我是超级科比迷
0 请登录后投票
   发表时间:2009-08-26  
carlkkx 写道
看了一点源代码,我觉得作者对于java字符串理解还是不深刻。


在一个Util类里面我看到这样一个函数
public static String convertString(String source, String encoding) {
        try {
            byte[] data = source.getBytes("ISO8859-1");
            return new String(data, encoding);
        } catch (UnsupportedEncodingException ex) {
            return source;
        }
}
这个函数的意图似乎叫做转换,但是它的输入是String类型的东西,输出也是String类型的东西,这个过程你是转不了什么的,这是一个没意义的操作。
当我们定义String a ="天下";请问a变量指向的String对象里面存储的二进制形式是什么?答案必然是对"天下"这两个字符以某种编码方案的编码后的二进制内容。那么是什么编码方案呢?正如java宣称的那样是Unicode。没错,所谓java支持Unicode就是这个意思。现在我们来看这个函数,传进来一个source,然后执行这个source.getBytes("ISO8859-1")。这个什么意思呢?就是说将source指向的String对象内容以这个ISO8859-1编码方案编码输出,但是请注意source指向的String对象本身的内容还是原来的Unicode的形式,只是输出符合ISO8859-1编码的一堆byte。接下来做了这个return new String(data, encoding);这个干什么呢?以某种编码方案对某堆byte进行解析,解完后构造的String对象内部还是要以Unicode形式存储的。然后来说说这个“某种编码方案对某堆byte的解析”如果匹配那自然没有问题,如果不匹配那就可能出现问题。现在从这一句byte[] data = source.getBytes("ISO8859-1");来看这堆byte是ISO8859-1编码方案生成的,那么如果以非ISO8859-1的编码方案去解这堆byte很可能出问题。
所以如果我这样
String test = "安西四镇";
String rs = convertString(test,"GBK");
System.err.println(rs);
rs打印出来是四个????

现在假如我把你的那个函数改成
public static String convertString(String source, String encoding) {
        try {
            byte[] data = source.getBytes("UTF-8");
            return new String(data, encoding);
        } catch (UnsupportedEncodingException ex) {
            return source;
        }
}

String test = "安西四镇";
String rs = convertString(test,"UTF-8");
System.err.println(rs);
这样打印出"安西四镇",没错,但是这是在做无用功。

String test = "安西四镇";
String rs = convertString(test,"GBK");
System.err.println(rs);
这样打印出"瀹夎タ鍥涢晣",乱码。

String对象到String对象的转换时没有意义的,要么瞎折腾,无用功,要么反而折腾的出错了。因为String对象对于字符一直是以Unicode形式存储的,它可以按某个编码方案输出一堆byte,也可以按某个编码方案从一堆byte解析,但是最终在内存的存储都是Unicode形式。只有当你要与外围(网络,文件,。。。)打交道的时候才会考虑转码,解码问题,两个String对象之间这不是瞎折腾吗。




有时候你拿到的string就是乱码形式,所以需要通过这类函数来重新encode一下字节数组吧

比如String param = request.getParameter("某参数"),得到的值是????

按照最粗浅的做法就是  new String(param.getBytes("某编码"),"某编码")。

这实际上就是楼主做法的含义所在,有什么问题嘛?
0 请登录后投票
   发表时间:2009-08-26  
下来试了试,效果不错呀
0 请登录后投票
   发表时间:2009-09-10  
Object真鼻祖啊...
0 请登录后投票
   发表时间:2009-11-12  
先赞一个,不知道有没有实现频谱功能。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics