В 99% случаев, если вы опустите первые 10 байтов, у вас будет заголовок ID3v2, из которых последние 4 байта будут размером тега ID3v2, который будет содержать обложку.
Размер ID3v2 является "безопасным от синхронизации целым числом", но TagLib имеет функцию для его декодирования в нормальное целое число:
TagLib::ID3v2::SynchData::toUInt(const ByteVector &data)
Итак, в основном алгоритм будет:
- Получите первые 10 байтов
- Разумность проверяет те байты, которые начинаются с "ID3"
- Считайте последние 4 байта этих 10 и пропустите их через функцию выше, чтобы получить длину тега ID3v2
- Получите столько дополнительных данных из потока
- Передать этот блок данных в TagLib
- Извлечь обложку