# -*- coding:utf-8 -*-
import struct
def decode(x): #如果按照正常算法得到的synchsafe integer,解析成 真正的整数大小
a = x & 0xff;
b = (x >> 8) & 0xff;
c = (x >> 16) & 0xff;
d = (x >> 24) & 0xff;
x_final = 0x0;
x_final = x_final | a;
x_final = x_final | (b << 7);
x_final = x_final | (c << 14);
x_final = x_final | (d << 21);
return x_final
def encode(x): #和上边相反
a = x & 0x7f;
b = (x >> 7) & 0x7f;
c = (x >> 14) & 0x7f;
d = (x >> 21) & 0x7f;
x_final = 0x0;
x_final = x_final | a;
x_final = x_final | (b << 8);
x_final = x_final | (c << 16);
x_final = x_final | (d << 24);
return x_final
name = "4.mp3"; #要读取的文件
print name
fp = open(name,'rb');
head = fp.read(10)
id3,ver,revision,flag,length = struct.unpack("!3sBBBI",head);
length = decode(length)
print 'total:',length
while True:
frame = fp.read(10)
fid,size,flag,flag2 = struct.unpack("!4sI2B",frame)
if size==0: #有时候会留1024的白 不知道为啥
break
if ver==4: #就是这一点 4和3的不同之处,4的这儿也采用synchsafe integer 了,注意啊
size = decode(size)
print fid,'frame:',size
fp.read(size)
length-= (size+10)
if length<=0:
break
#如果要给该mp3加张图片 那就方便了
找了一堆文章,走了许多弯路,发现许多同学的文档是错误滴,现在总结如下
虽然说 百度找来的每篇资料都说 现在的id3v2 都是3 版本,但是不知道是不是太古老啦,现在许多都四了噢,而且3和4有一点非常严重的不同,你如果把4当3来解,肯定会出错
参考文章
http://id3.org/id3v2.3.0
http://id3.org/id3v2.4.0-structure
http://fanzhichao.blog.hexun.com/28574021_d.html 这个是针对2.3的