2013-03-09 7 views
1

Я пытаюсь манипулировать тегами ID3 в файлах MP3, используя Java ID3 Tag Library. Однако, когда я пытаюсь сделать что-то, используя класс «MP3File», я получаю IOException: Negative Seek Offset;Как решить Java IOException: Negative Seek Offset? (Библиотека тегов Java ID3)

Вот пример кода и StackTrace:

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

+0

@EJP имеет хорошую идею. Попробуйте найти некоторые из файлов MP3 [здесь] (http://pscode.org/media/#sound). –

+0

Спасибо, ребята. На самом деле, я подумал, что это первый раз, когда я получил его, поэтому я попробовал с другим файлом, а другой, а другой ... Пробовал более 30 файлов и получил это же исключение. Теперь я попытался использовать эти файлы на сайте @AndrewThompson предложил и получил то же исключение: / –

ответ

2

Итак, любые идеи о том, почему это происходит и/или как его решить?

Рискуя констатировал очевидное, есть две возможные причины для этой проблемы:

  • Файл MP3 сломана некоторым тонким способом, что не мешает его от «работает» .. , который, как я полагаю, означает играть в некоторых не-Java-плеерах.
  • Библиотека багги, и она не обрабатывает что-то должным образом.

Решения?

  • Попробуйте другой файл MP3.
  • Попробуйте несколько файлов из разных источников, если это что-то связано с файлами MP3, создаваемыми определенным программным обеспечением.
  • Запустите библиотеку с помощью отладчика Java, чтобы узнать, что на самом деле вызывает исключение. Это, вероятно, повлечет за собой чтение спецификаций MP3, чтобы решить, существует ли какое-то несоответствие между 1) кодом, 2) спецификацией и 3) байтами в файле.

Вы спросили это как вопрос программирования, так что я предполагаю, что вы программист, и способны к устранению неполадок в целом и, в частности, в поиске/читать спецификации и отладки Java.


OK ... так как вы, кажется, не добились никакого прогресса в этом сами, я решил посмотреть на исходный код, который я нашел here. (Конечно, это может быть неправильная версия, но вы не сказали, какую версию библиотеки вы использовали ...)

Похоже, что проблема возникает в строке 309 org.farng.mp3.id3.ID3v1.java в методе 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, или вы пытаетесь прочитать файлы с какого-либо устройства/файловой системы, которые не сообщают размер файла.

(Это стоит прочитать Javadocs для File.length() подсказки относительно того, почему это может вернуть странное значение,., Например, ноль)