安卓(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”等编码。
由于文件名极易遭人更改,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”等编码。
相关文章推荐
- Java:InputStream读取文本文件内容出现乱码问题的解决方法
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- java中读取excel文件中字符串乱码问题解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取中文文件出现乱码解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java中从txt文件中读取和存储内容出现乱码的解决方法
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法
- java中读取excel文件中字符串乱码问题解决方法
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- java 利用POI读取execel文件时出现 Unable to read entire header; 0 bytes read; expected 512 bytes 的解决方法
- Java采用readInt()方法直接读取特定的ZIP压缩文件出现了奇怪的问题