mp3头解析,id3v2.3.0 id3v2.4.0

# -*- 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的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值