如何在 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 标签中获取帧大小?的主要内容,如果未能解决你的问题,请参考以下文章