2013-03-09 40 views
1

我想操纵MP3文件中的ID3标签使用Java ID3 Tag Library。然而,当我尝试使用“MP3File”类来做任何事情时,我得到IOException:负查找偏移;如何解决Java IOException:负查找偏移量? (Java的ID3标签库)

下面是一个示例代码和堆栈跟踪:

package com.test; 

import java.io.File; 
import java.io.IOException; 

import org.farng.mp3.MP3File; 
import org.farng.mp3.TagException; 

public class MP3Test { 

    public static void main(String[] args) throws IOException, TagException { 

     File f = new File("test.mp3"); 

     MP3File mp = new MP3File(f); 

     System.out.println(mp.getFrequency()); 
    } 


    } 
-------------------------------------------------------------------------------- 

Exception in thread "main" java.io.IOException: Negative seek offset 
    at java.io.RandomAccessFile.seek(Native Method) 
    at org.farng.mp3.id3.ID3v1.seek(Unknown Source) 
    at org.farng.mp3.id3.ID3v1.read(Unknown Source) 
    at org.farng.mp3.id3.ID3v1.<init>(Unknown Source) 
    at org.farng.mp3.MP3File.<init>(Unknown Source) 
    at org.farng.mp3.MP3File.<init>(Unknown Source) 
    at com.test.MP3Test.main(MP3Test.java:15) 

正如你看到的,甚至是基本的操作抛出了我的异常,使得它真的很难,我真的开发的东西... MP3文件,我正在努力阅读的工作完全正常。那么,为什么会发生这种情况和/或如何解决它?

+0

我怀疑文件已损坏。试试另一个。 – EJP 2013-03-09 01:11:03

+0

@EJP有个好主意。尝试一些找到的MP3文件[这里](http://pscode.org/media/#sound)。 – 2013-03-09 01:16:18

+0

谢谢你们。其实,我第一次认为这是tat,所以,我尝试了另一个文件,另一个,另一个...尝试了超过30个文件,并得到了同样的例外。现在我已经尝试使用@AndrewThompson建议的网站中的这些文件,并得到相同的异常:/ – 2013-03-09 01:25:57

回答

2

那么,为什么会发生这种情况和/或如何解决它?

在说明明显的风险,也有针对问题2可能的原因:

  • 对MP3文件在不阻止其“工作”了一些微妙的方式打破.. 。我认为这意味着玩某些非Java玩家。
  • 图书馆是越野车,它没有正确处理的东西。

解决方案?

  • 尝试不同的MP3文件。
  • 尝试使用来自不同来源的多个文件,以防与特定软件产生的MP3文件有关。
  • 使用Java调试器运行该库以找出实际导致该异常的内容。这可能需要读取MP3规格来决定1)代码,2)规格和3)文件中的字节之间是否存在某些不匹配。

你问这是一个编程问题,所以我认为你是一个程序员,并能够排除故障的一般,特别是在寻找/读取规格,并调试Java。


OK ......既然你似乎没有取得与这个自己任何进展,我看了看源代码,我发现here。 (当然,这可能是错误的版本,但是你没有说出你使用的库的版本是什么...)

看起来问题出现在org.farng.mp3.id3.ID3v1.java的第309行的seek方法中:

// If there's a tag, it's 127 bytes long and we'll find the tag 
file.seek(file.length() - 128); 

现在可能可能给出了否定的唯一途径寻求抵消例外是如果file.length()返回文件长度小于128这是不可能发生的一个有效的MP3文件。

所以我的猜测是,要么你想读截断 MP3文件,或不在MP3文件的所有文件,或者你正试图从一些设备/文件系统,不报告读取文件文件大小正确。

(这是值得一读为File.length()的javadoc为线索,为什么它会返回一个奇怪的值;例如零)