【问题标题】:How to solve Java IOException: Negative Seek Offset? (Java ID3 Tag Library)如何解决 Java IOException: Negative Seek Offset? (Java ID3 标记库)
【发布时间】:2013-02-24 16:49:09
【问题描述】:

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

【问题讨论】:

  • 我怀疑文件已损坏。尝试另一个。
  • @EJP 有一个好主意。尝试找到here 的一些 MP3 文件。
  • 谢谢你们。实际上,我第一次得到它时就想到了这个,所以,我尝试了另一个文件,另一个文件,另一个......尝试了 30 多个文件并得到了同样的例外。现在我尝试在@AndrewThompson 建议的站点中使用这些文件并得到相同的异常:/
  • 我遇到了同样的问题。我认为这是错误...我检查了 2 个参数:文件路径的长度和文件夹的深度(对不起我的英语:-))。问题出在这两个参数之间。路径 E:\F\G\H\I\J\K\L\ 正常路径 E:\F\Music\Rammstein\Mutter\ 不正常...但路径 E:\F\MUZYCZKA\Rammstein12345678901234567890 正常.

标签: java mp3 ioexception id3-tag id3v2


【解决方案1】:

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

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

  • MP3 文件以某种微妙的方式被破坏,但这并不能阻止它“工作”......我认为这意味着在某些非 Java 播放器中播放。
  • 库有问题,无法正确处理。

解决方案?

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

您将此作为编程问题提出,因此我假设您是一名程序员,并且能够进行一般故障排除,尤其是在查找/阅读规范和调试 Java 方面。


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

seek方法中org.farng.mp3.id3.ID3v1.java的第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 文件,这种情况绝不应该发生。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2012-10-02
    • 2014-01-28
    相关资源
    最近更新 更多