MP3文件大体分为三部分:
TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)

ID3V2
包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。
Frame
一系列的帧,个数由文件大小和帧长决定
每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定
每个FRAME又分为帧头和数据实体两部分
帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立
ID3V2
包含了作者,作曲,专辑等信息,长度为128BYTE。

/*~~~~~~~~~~~~~*/

MPEG音频标签分为两种,一种是ID3v1,存在文件尾部,长度128字节,另一种是ID3v2,是对ID3v1的扩展,存在文件头部,长度不定。

1、ID3v1

ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。

结构如下

AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB
BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD
DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE
EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG

等等~~~~
2、ID3V2

ID3V2 到现在一共有4 个版本,但流行的播放软件一般只支持第3 版,既ID3v2.3。由于ID3V1 记录在MP3 文件的末尾,ID3V2 就只好记录在MP3 文件的首部了(如果有一天发布ID3V3,真不知道该记录在哪里)。也正是由于这个原因,对ID3V2 的操作比ID3V1 要慢。而且ID3V2 结构比ID3V1 的结构要复杂得多,但比前者全面且可以伸缩和扩展。
下面就介绍一下ID3V2.3。
每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

(一)、标签头

在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下:

char Header[3]; /必须为"ID3"否则认为标签不存在/
char Ver; /版本号ID3V2.3 就记录3/
char Revision; /副版本号此版本记录为0/
char Flag; /存放标志的字节,这个版本只定义了三位,稍后详细解说/
char Size[4]; /标签大小,包括标签头的10 个字节和所有的标签帧的大小/
注:对这里我有疑惑,因为在实际寻找首帧的过程中,我发现有的mp3文件的标签大小是不包含标签头的,但有的又是包含的,可能是某些mp3编码器写标签的BUG,所以为了兼容只好认为其是包含的,如果按大小找不到,再向后搜索,直到找到首帧为止。

(1).标志字节

标志字节一般为0,定义如下:
abc00000
a – 表示是否使用Unsynchronisation(这个单词不知道是什么意思,字典里也没有找到,一般不设置)
b – 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置
c – 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)
(2).标签大小
一共四个字节,但每个字节只用7 位,最高位不使用恒为0。所以格式如下
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如
下:

int total_size;
total_size = (Size[0]&0x7F)*0x200000
+(Size[1]&0x7F)*0x4000
+(Size[2]&0x7F)*0x80
+(Size[3]&0x7F)

(二)、标签帧

每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件
中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大
小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
帧头的定义如下:
char FrameID[4]; /用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表/
char Size[4]; /帧内容的大小,不包括帧头,不得小于1/
char Flags[2]; /存放标志,只定义了6 位,稍后详细解说/

(1).帧标识

用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨 格式:N/M 其中N 为专集中的第N 首,M 为专集中共M 首,N 和M 为ASCII 码表示的数字
TYER=年代 是用ASCII 码表示的数字
TCON=类型 直接用字符串表示
COMM=备注 格式:“eng/0 备注内容”,其中eng 表示备注所使用的自然语言

(2).大小

这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x100000000
+Size[1]*0x10000
+Size[2]*0x100
+Size[3];

(3).标志

只定义了6 位,另外的10 位为0,但大部分的情况下16 位都为0 就可以了。格式如下:
abc00000 ijk00000
a – 标签保护标志,设置时认为此帧作废
b – 文件保护标志,设置时认为此帧作废
c – 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志)
i – 压缩标志,设置时一个字节存放两个BCD 码表示数字
j – 加密标志(没有见过哪个MP3 文件的标签用了加密)
k – 组标志,设置时说明此帧和其他的某帧是一组
值得一提的是winamp 在保存和读取帧内容的时候会在内容前面加个’/0’,并把这个字节计算在帧内容的
大小中。
转:http://www.360doc.com/content/09/1018/17/247230_7472811.shtml
转:https://blog.csdn.net/liuyan4794/article/details/7746993

【转】MP3文件头格式相关推荐

  1. g711音频封装wav文件头格式

    g711音频封装wav文件头格式 之前的客户需求,平台音频不支持g711格式,只支持wav/mp3,wav格式封装比较简单,只需要在原始音频数据上封装一层wav头就可以,在此记录一下该模块接口.参考开 ...

  2. wav文件头格式详解

    wav文件头格式详解 首先先声明几个变量: int file_size;      //文件大小 int channel;        //声道数 int sample_rate;   //采样率 ...

  3. 一、各种WAV文件头格式

    Wav文件也分好几个种类,相应的非数据信息存储在文件头部分,以下是各种WAV文件头格式. 表1 8KHz采样.16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节) 偏移地址 字节数 数 ...

  4. java校验文件头格式_转自:java 文件格式二进制头文件校验

    转自:https://blog.csdn.net/useprogram/article/details/90637401 public class FileTypeUtil { private fin ...

  5. 位图(BMP)文件头格式及数据分析

    由于BMP文件有诸多格式,这里只以256色彩色位图为例来分析一下. 这个图是我自己用画图板做的,如下. 图1 BMP图 由于这里限制上传BMP文件,所以这个是JPG的.我的原始的BMP文件大小是200 ...

  6. Audio WAV文件头格式

    最近需要对多个WAV文件进行拼接,这就涉及到WAV文件头的创建和修改更新.之前的方式是利用第一个WAV的文件头,在最后全部拼接完后再修改文件头中的文件长度及音频数据长度.这个长度如果不修改,最后拼接的 ...

  7. Arcgis系列——gis读取ascii文件头格式

    (1)ascii头文件格式 参考中国气象数据网0.5°格点数据的文件格式,题头格式如下: NCOLS xxx NROWS xxx XLLCORNER xxx YLLCORNER xxx CELLSIZ ...

  8. oracle 录制响应文件格式_ORACLE 11G 数据文件头格式

    11G版本 BBED> print kcvfh struct kcvfh, 860 bytes                     @0 struct kcvfhbfh, 20 bytes  ...

  9. oracle 文件头格式,ORACLE 11G 数据文件头格式

    11G版本 BBED> print kcvfh struct kcvfh, 860 bytes @0 struct kcvfhbfh, 20 bytes @0 ub1 type_kcbh @0 ...

最新文章

  1. ubuntu10.04 安装virtualbox
  2. Web推流,Webrtc网页推流rtmp在教学直播录制中应用
  3. 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 3 TensorFlow Tutorial
  4. 如何查看linux系统版本信息及CPU信息
  5. c mysql 编译_MySQL编译安装之cmake
  6. 数学教材里的神秘数表在国外红出圈,网友:引人入胜、猜不到结局
  7. 马斯克:特斯拉汽车产量今年有望达到50万辆
  8. 王亚叶:洞悉客户心声用大数据运营
  9. Pyinstaller打包过程中报错“AttributeError: 'str' object has no attribute 'items''”问题解决
  10. kafka阿里云镜像下载
  11. 国际期刊出版趋势及科技论文写作要点
  12. 蓝桥杯大赛——练习系统登录
  13. 二级c语言百度云,全国计算机二级C语言历年真题完整版.pdf
  14. Java SimpleDateFormat用法
  15. 开山之作造假!Science大曝Nature重磅论文学术不端,恐误导全球16年
  16. nchar , char , nvarchar , varchar 的区别
  17. unity网络实战开发(丛林战争)-正式开发阶段(014-游戏客户端与服务器端连接搭建)
  18. jquery+javascript编写国籍控件
  19. 安卓大屏导航可用万年历
  20. 最新搜狗泛目录站群程序,助力站群关键词优化方法详解

热门文章

  1. c语言 线程读写,C语言创建线程以及使用锁进行读写分离
  2. 对数函数定义域和值域_这6道题全懂了,求对数函数的定义域和值域再不作难了...
  3. 2.ADS操作入门_线性/非线性仿真工具
  4. 创建可启动 WinPE 介质
  5. 递归函数内部的原理????不要跟我讲自己调用自己这样的话,我一分也不给你的zz
  6. 422器件与lvds接收器的区别_51系列单片机的区别与特点介绍
  7. RationalDMIS 7.1 SC2测针的构建
  8. 运算放大器选型与参考指南
  9. 脑科学实验-割裂脑研究
  10. 攻防世界 BotW-