2014-07-05 64 views
0

MP3 ID3標籤我嘗試讀取ID3標籤的標題:讀取C++

int main() { 

    union MP3Header { 
     char header[10]; 
     struct HeaderStruct { 
     char tagIndicator[3]; 
     char version[2]; 
     char flags[1]; 
     char size[4]; 
     } headerStruct; 
    }; 


    fstream file; 
    file.open("file.mp3", ios::binary || ios::in); 

    MP3Header header; 
    //read header of id3 
    file.read(header.header, 10); 


    //tag description 
    char tag[4] = {0}; 
    strncpy(tag, header.headerStruct.tagIndicator, 3); 
    cout << tag << endl; 


    //get size 
    string sizeTags = ""; 
    for (int i=0; i<4; i++) { 
     bitset<8> bit_set = header.headerStruct.size[i]; 
     sizeTags += bit_set.to_string(); 
    } 
    cout << sizeTags << endl; 
} 

的標籤某些MP3文件大小爲... 1111101110110(8054個字節) 我覺得這個代碼是錯誤的,因爲大小很奇怪。

+0

A [簡單的搜索](http://en.wikipedia.org/wiki/ID3#Layout )或檢查規範將確認您想要128B作爲標準,或227B擴展。你應該使用類似這樣的庫,例如[id3lib](http://id3lib.sourceforge.net/)。 'id3'標籤位於MP3文件的末尾,而不是頭部。 – OJFord

+0

id3v2是頭像。 感謝您的支持。 – user3807389

+0

你的號碼可能沒關係,但只需要轉換,因爲MP3使用同步安全整數。看到這個:[SynceSafe整數轉換](http://stackoverflow.com/questions/5223025/why-are-there-synchsafe-integer) –

回答

0

總之我失眠咆哮......

  • 進入第7個字節
  • 讀取一個整數(又名四個字節)
  • 傳遞量通過「synchSafe conveter」功能
  • 結果現在是正確的標題大小(減10字節)

那麼我使用AS3,但我也從C++,C#,Java,PHP,Python的代碼學習然後將其代碼邏輯轉換爲AS3。現在我將向您展示我們如何在Flash(AS3)中實現它,也許您可​​以將其轉換爲C++。

(用於ID3檢查2版以上)

mp3_Bytes.position = 6; //go to 7th byte (offset 6) for Header Size bytes (integer) 
mp3_headerLength = readSynchsafeInt (mp3_Bytes.readUnsignedInt()); 

mp3_headerLength += 10; //add 10 cos result always seems to be 10 bytes less 
trace("Header Length : " + mp3_headerLength); 


和同步的安全功能來轉換讀取INT(四個字節)的樣子:

private function readSynchsafeInt (synch:int):int 
{ 
    return (synch & 127) + 128 * ((synch >> 8) & 127) + 16384 * ((synch >>16) & 127) + 2097152 * ((synch >> 24) & 127); 
} 

我做了快速查找你,發現這個C++:Why are there Synchsafe Integer?
同步安全功能看起來像

int ID3_sync_safe_to_int(uint8_t* sync_safe) 
{ 
    uint32_t byte0 = sync_safe[0]; 
    uint32_t byte1 = sync_safe[1]; 
    uint32_t byte2 = sync_safe[2]; 
    uint32_t byte3 = sync_safe[3]; 

    return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3; 
} 

順便說一句:AS3函數只是用於轉換整數字節的總和,而C++代碼示例正在處理實際的整數字節。兩種不同的方法獲得相同的結果選擇一個(AS3轉換從字節獲得了數=導致或C++將字節轉換,以獲得數=結果)