安卓(JAVA)读取Mp3文件中的歌曲信息(及readLine()出现乱码问题的解决方法)

在开发一个音乐播放器的过程中,我们往往需要读取MP3文件的相关信息并保存起来。

由于文件名极易遭人更改,MP3文件的文件名有时是不可信的。再加之MP3“ 歌手 - 歌曲名 ”及“ 歌曲名 - 歌手 ”格式的不统一 ,通过文件名来标识一首歌曲不那么准确 也不怎么规范。

想必使用windows时读者也发现了:MP3文件属性的详细信息里显示了更多细节内容(如歌曲名、艺术家、唱片集、比特率等),这些信息很大一部分文件名都没有说明,windows是怎么知道的呢?这些信息必然存储在文件内部!

接下来就是怎么确定这些信息的位置及读取的问题了。

一:歌曲信息位置

音乐相关信息统一保存在歌曲文件的后128个字节中,每一项都有固定长度的信息位(如下)


上图中的“字节”表示在末128字节中的位置,如歌曲名的具体位置应为: 歌曲大小(Byte) - 128 + 3 

具体格式信息请参照此文http://www.cnblogs.com/laobiao/p/5585862.html

二:正确读取相应信息

这里以读取歌曲名为例:

为了定位到相应位置,推荐使用RandomAccessFile类的seek方法:

  File file = new File("文件路径");
  RandomAccessFIle randaf = new RandomAccessFile(file,"r");
  randaf.seek(file.length()-125);

歌曲名字段固定字长为30字节,对于未使用位置统一用0填充。而readLine()方法仅以'\r'或'\n'作为结束标识符,因此我们需要将获取的字符串通过.subString()方法进行适当剪切:

  String music_name = randaf.readLine();//获取一行数据
  int temp = music_name.indexOf('\0');//查找第一个字符'\0'的位置
  if(temp!=-1)
    music_name = new String(music_name.substring(0,temp).getBytes("ISO-8859-1") , "GBK");
  else if(music_name.length()>30)
    music_name = new String(music_name.substring(0,30).getBytes("ISO-8859-1") , "GBK"); //歌曲名
  else if(music_name.length()<=30)
    music_name = new String(music_name.getBytes("ISO-8859-1") , "GBK");

注意:RandomAccessFile的readLine()方法以"ISO-8859-1"标准读取字符串,国内MP3文件编码形式多为"GBK",需要手动转换(如上),否则会出现乱码问题!若依然乱码可以尝试转换为“UNICODE”、“UTF-8”等编码。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值