如何在 ID3v2.2 MP3 标签中获取帧大小?

Posted

技术标签:

【中文标题】如何在 ID3v2.2 MP3 标签中获取帧大小?【英文标题】:How to get frame size in ID3v2.2 MP3 tags? 【发布时间】:2012-07-14 16:11:20 【问题描述】:

ID3v2.3标签我已经整理好了,因为有4个字节,但是这里frame的header标签一共只有3个字节,不是4个。这似乎意味着我不能使用struct.unpack 得到一个 int 出来。

例如,我现在使用的标签是:TT2\x00\x00\x0c\x00Torn Within,其中TT2 是名称标识符,\x00\x00\x0c 是尺寸标识符。标签的内容为\x00Torn Within,大小为12字节。

这也是歌曲的 ID3 标题。 'ID3\x02\x00\x00\x00\x04NP',在这里可以看到没有设置编码和标志。

我已经尝试过struct.unpack('>3b', '\x00\x00\x0c'),但这只会获取每个单独字节的值。

但在那之后,我被卡住了,因为除非我在尺寸标签前面加上 \x00,否则我无法继续。我该怎么办?

这是 ID3 标签文档 http://id3.org/id3v2-00,以及 struct 模块 http://docs.python.org/library/struct.html#format-characters 的文档

edit 发现我可以这样做:int(binascii.hexlify('\x00\x00\x0c'), 16) 但我认为这不是一个很好的解决方案

【问题讨论】:

你总是可以在前面加上一个 \x00 空字节.. @MartijnPieters 我也有同样的想法,但我不确定如果标签变得非常大,是否会产生任何影响,比如它是否包含招聘图像或其他东西。你认为这不是问题吗? 3 个字节限制了字段的大小,您的空填充不会改变这一点。 16777216 字节对于 MP3 标签来说已经足够了。 【参考方案1】:

只需在解包前添加一个空字节 (\x00):

>>> length = "\x00\x00\x0c"
>>> struct.unpack('>I', '\x00' + length)
(12,)

空字节将您的长度字节填充为 4 个字节,而不会改变含义。 3 个 size 字节可以容纳的最大值是 224 等于 16777216 个字节;添加填充不会以任何方式改变该限制。

【讨论】:

以上是关于如何在 ID3v2.2 MP3 标签中获取帧大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java ID3 标签库从 MP3 文件中获取图像

在 MP3 ID3v2 标签中设置歌词

如何使用 Mp3agic jar Android studio 从 MP3 文件中获取 ID3 歌词标签?

APEv1 标签标识符是啥?

使用 id3v2 获取 MP3 ID3 (V2) 标签

我可以为 MP3 编写类似于我自己版本的 ID3 标签的东西吗?