c++ ID3v2,APIC帧大小计算错误

rwqw0loc  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(87)

每个ID 3v 2帧的数据大小存储在帧头块的4567字节中(根据文档):
x1c 0d1x的数据
我正在从这个mp3文件中阅读帧大小:


要将帧数据大小转换为整数,我使用以下代码:

int frame_data_sz = b4 << 21 | b5 << 14 | b6 << 7 | b7;

字符串
例如,对于大多数帧,此代码正确计算帧大小:

TALB-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TIT 2-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TPE 1-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TCON-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TCOM-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TRCK-> 0x 00 0x 00 0x 00 0x 03-> 3字节-正确!
TLEN-> 0x 00 0x 00 0x 00 0x 06-> 6字节-正确!
COMM-> 0x 00 0x 00 0x 00 0x 06-> 6字节-正确!
APIC-> 0x 00 0x 01 0x 0 F 0x 5D-> 18397字节-不正确!

对于“APIC”帧,我的代码计算错误的帧大小值,因为实际数据大小值为71517字节。

如何正确地将帧大小转换为整数值?

bvuwiixz

bvuwiixz1#

ID 3v 2头的第4个字节告诉我们它的版本:

虽然标题大小在所有3个版本中存储相同,但帧大小的存储方式都不同-您的阅读方式仅适用于版本2.4.0:
| 2.2.0| 2.3.0| 2.4.0| 2.4.0 |
| --|--|--| ------------ |
| 4 * %0xxxxxxx = 28位|4 * %0xxxxxxx = 28位|4 * %0xxxxxxx = 28位| 4 * %0xxxxxxx = 28 bit |
| $xx xx xx = 24位|$xx xx xx xx = 32位|4 * %0xxxxxxx = 28位| 4 * %0xxxxxxx = 28 bit |
但是还有更多的不一致之处,暗示着误解了标签格式,无论是哪个软件编写的:

  • 所有大小为2的文本框架实际上都是空的。为什么一个软件甚至会存储空帧,而不是省略它们?
  • 所有的文本框架,包括注解,都有一个不必要的终止符$00,进一步毫无目的地扩大了标记的大小。
  • 注解框只包含它的语言为rus的信息,但是由于描述和文本都是空的,这也是浪费空间(和意义)。
  • APIC的大小为$00 01 0f 5d,十进制实际为69,469(67.84 KiB)。这与您预期的2048字节相差甚远。

相关问题