2011-06-20 45 views
0

我想讀取id3幀,我的問題是我無法獲得完整的標題。當mp3的標題很長時,我的結果是沒有結束的字符串,並且沒有前9個字符。如果歌曲的標題很短,我的結果是沒有前9個字符的標題。如何讀取id3v2的幀?

struct ID3V2frame 
{ 
    char header[4]; 
    char *id3frame[readBytes]; 
    int sizze[4]; 
}frame; 

fseek(file,10,SEEK_SET); // skip id3 header 

fread(&frame.header,sizeof(frame),1,file); 


readBytes = ((frame.sizze[0] & 127) << 21) | 
((frame.sizze[1] & 127) << 14) | 
((frame.sizze[2] & 127) << 7) | 
(frame.sizze[3] & 127); 

fread(&frame.id3frame,sizeof(frame),1,file); 
if(strncmp(frame.header,"TIT2", 4) == 0) 
    printf("%s",frame.id3frame); 

回答

0

我知道有什麼不對,因爲sizeof(struct ID3V2frame)將返回:

sizeof(char[4]) + sizeof(char pointer) + sizeof(int[4]) 

注意,該結構有一個指針爲char和指針是在你的系統可能是4個字節。所以你fread()錯誤的大小和錯誤的方式。

我不知道ID3,但標頭中的某處必須是此字符串的大小。

編輯:讀取文檔

ID3v2的幀概述

由於標籤由標籤頭 和與一個或多個 幀標籤體的,所有的幀包含一個 幀的接着是包含實際 信息的一個或多個 字段。幀 頭的佈局:

幀ID $ xx月xx xx月xx(4個字符)

尺寸$ xx月xx xx月xx

標誌$ xx月xx

幀ID之後大小爲 描述符,在每個幀中產生十個字節的總報頭大小 。大小爲 的計算方式爲幀大小,不包括 幀頭(幀大小 - 10)。

你的幀結構是錯誤的。

修復了您的結構並擁有合適的總數size後,您可以使用fread()size-10字節來獲取幀的內容。

請小心,因爲您需要檢查Frame ID以查看它是否是Title的文件名框架,因爲規範說明它們可以以任何順序。

請參閱文檔。 ID3v2似乎有據可查。我能在5分鐘內獲得所有信息。

http://www.id3.org/id3v2.3.0

+0

是的!你對! – andrey

+0

很高興它幫助你:)無論如何,你有沒有試過id3lib? http://id3lib.sourceforge.net/似乎是成熟和廣泛使用的代碼。 –