您的位置:首页 > 编程语言 > Java开发

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

2017-10-21 14:32 1311 查看
在开发一个音乐播放器的过程中,我们往往需要读取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_nam
4000
e.getBytes("ISO-8859-1") , "GBK");
注意:RandomAccessFile的readLine()方法以"ISO-8859-1"标准读取字符串,国内MP3文件编码形式多为"GBK",需要手动转换(如上),否则会出现乱码问题!若依然乱码可以尝试转换为“UNICODE”、“UTF-8”等编码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐