2013-03-09 24 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爲線索,爲什麼它會返回一個奇怪的值;例如零)