1

我收到了比特流问题的错误。我已经跳过了 512 个字节的 id3tag 读取,但是在播放某些歌曲时我仍然无法播放所有歌曲

define MP3_SKIP_SIZE  512
fseek(playerDetails->mp3Fp,MP3_SKIP_SIZE,SEEK_SET);
4

1 回答 1

1

ID3 标签的大小是可变的,不一定是 512 字节。

您可以使用id3lib找出 ID3 标签的大小:



#include <id3/tag.h>

// Get size of ID3 tags 

size_t getID3TagSize(const char* filename)
{
    ID3_Tag myTag(filename);

    return myTag.Size();
}



#include <lame.h>

void decodeMp3(const char* fileName)
{
    size_t mp3TagSize = getID3TagSize(fileName);

    f.open(fileName, std::ios::binary);

    f.seekg(mp3TagSize); //Skip ID3 tags

    std::array<unsigned char, 1024*1024> buffer;

    f.read(reinterpret_cast<char*>(&buffer[0]), buffer.size());

    auto count = f.gcount();

    hip_t lameInput = hip_decode_init();

    mp3data_struct mp3data{ 0 };

    std::array<short, 1024 * 1024 * 8> pcm_l;
    std::array<short, 1024 * 1024 * 8> pcm_r;

    int decodeResult = hip_decode_headers(lameInput, &buffer[0], count, &pcm_l[0], &pcm_r[0], &mp3data);


    //... Continue decoding ...

}

于 2019-05-26T19:01:25.483 回答