如何解决Java IOException:否定寻求偏移? (Java ID3标记库)

时间:2013-03-09 00:59:31

标签: java mp3 ioexception id3-tag id3v2

我正在尝试使用Java ID3 Tag Library操纵MP3文件中的ID3标签。但是,当我尝试使用“MP3File”类进行任何操作时,我会收到IOException:Negative Seek Offset;

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

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文件工作得非常好。那么,关于为什么会发生这种情况的任何想法和/或如何解决它?

1 个答案:

答案 0 :(得分:2)

  

那么,关于为什么会发生这种情况的任何想法和/或如何解决它?

冒着明显的风险,有两个可能的原因导致问题:

  • MP3文件以某种微妙的方式被破坏,不会阻止它“工作”......我认为这意味着在某些非Java播放器中播放。
  • 图书馆有问题,而且处理不当。

解决方案?

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

你问这是一个编程问题所以我假设你是一个程序员,并且能够进行一般的故障排除,特别是查找/阅读规范和调试Java。


好的...因为您自己似乎没有取得任何进展,所以我查看了我找到的源代码here。 (当然,这可能是错误的版本,但你没有说你正在使用的库的版本......)

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

// 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文件,情况永远不会发生。< / p>

所以我的猜测是,您要么尝试读取截断的 MP3文件,要么根本不读取MP3文件,或者您正试图从某些设备/文件系统中读取文件不能正确报告文件大小。

(值得阅读File.length()的javadocs,了解为什么它可能会返回一个奇怪的值;例如为零。)