在C ++中读取mp3 id3标签

时间:2014-07-05 09:26:26

标签: c++ mp3 id3

我尝试读取id3标签的标题:

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 bytes) 我认为这段代码错了,因为大小很奇怪。

1 个答案:

答案 0 :(得分:0)

总结一下我失眠的咆哮......

  • 转到第7个字节
  • 读取整数(又称四个字节)
  • 通过“synchSafe conveter”功能传递该数量
  • 结果现在是正确的标题大小(减去10个字节)

我使用AS3但我也学习了C ++,C#,Java,PHP,Python等代码,然后将代码逻辑转换为AS3。现在我将向您展示我们如何在Flash(AS3)中完成它,也许您可​​以将其转换为C ++。

(用于向上检查ID3 v2)

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);


和同步Safe函数转换读取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;
}
BTW:AS3函数恰好用于转换整数字节的总和,而C ++代码示例正在处理实际的整数字节。相同结果的两种不同方法。选择一个( AS3 转换从bytes = result或 C ++ 转换字节获得的数字=获得数字=结果)