1

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

4

1 回答 1

2

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

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

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

解决方案?

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

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


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

看来问题出现在方法的第 309org.farng.mp3.id3.ID3v1.javaseek

// 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 文件的文件,或者您正在尝试从无法正确报告文件大小的某些设备/文件系统中读取文件。

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

于 2013-03-09T01:23:55.437 回答