【转】MP3文件头格式
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文件头格式相关推荐
- g711音频封装wav文件头格式
g711音频封装wav文件头格式 之前的客户需求,平台音频不支持g711格式,只支持wav/mp3,wav格式封装比较简单,只需要在原始音频数据上封装一层wav头就可以,在此记录一下该模块接口.参考开 ...
- wav文件头格式详解
wav文件头格式详解 首先先声明几个变量: int file_size; //文件大小 int channel; //声道数 int sample_rate; //采样率 ...
- 一、各种WAV文件头格式
Wav文件也分好几个种类,相应的非数据信息存储在文件头部分,以下是各种WAV文件头格式. 表1 8KHz采样.16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节) 偏移地址 字节数 数 ...
- java校验文件头格式_转自:java 文件格式二进制头文件校验
转自:https://blog.csdn.net/useprogram/article/details/90637401 public class FileTypeUtil { private fin ...
- 位图(BMP)文件头格式及数据分析
由于BMP文件有诸多格式,这里只以256色彩色位图为例来分析一下. 这个图是我自己用画图板做的,如下. 图1 BMP图 由于这里限制上传BMP文件,所以这个是JPG的.我的原始的BMP文件大小是200 ...
- Audio WAV文件头格式
最近需要对多个WAV文件进行拼接,这就涉及到WAV文件头的创建和修改更新.之前的方式是利用第一个WAV的文件头,在最后全部拼接完后再修改文件头中的文件长度及音频数据长度.这个长度如果不修改,最后拼接的 ...
- Arcgis系列——gis读取ascii文件头格式
(1)ascii头文件格式 参考中国气象数据网0.5°格点数据的文件格式,题头格式如下: NCOLS xxx NROWS xxx XLLCORNER xxx YLLCORNER xxx CELLSIZ ...
- oracle 录制响应文件格式_ORACLE 11G 数据文件头格式
11G版本 BBED> print kcvfh struct kcvfh, 860 bytes @0 struct kcvfhbfh, 20 bytes ...
- oracle 文件头格式,ORACLE 11G 数据文件头格式
11G版本 BBED> print kcvfh struct kcvfh, 860 bytes @0 struct kcvfhbfh, 20 bytes @0 ub1 type_kcbh @0 ...
最新文章
- ubuntu10.04 安装virtualbox
- Web推流,Webrtc网页推流rtmp在教学直播录制中应用
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 3 TensorFlow Tutorial
- 如何查看linux系统版本信息及CPU信息
- c mysql 编译_MySQL编译安装之cmake
- 数学教材里的神秘数表在国外红出圈,网友:引人入胜、猜不到结局
- 马斯克:特斯拉汽车产量今年有望达到50万辆
- 王亚叶:洞悉客户心声用大数据运营
- Pyinstaller打包过程中报错“AttributeError: 'str' object has no attribute 'items''”问题解决
- kafka阿里云镜像下载
- 国际期刊出版趋势及科技论文写作要点
- 蓝桥杯大赛——练习系统登录
- 二级c语言百度云,全国计算机二级C语言历年真题完整版.pdf
- Java SimpleDateFormat用法
- 开山之作造假!Science大曝Nature重磅论文学术不端,恐误导全球16年
- nchar , char , nvarchar , varchar 的区别
- unity网络实战开发(丛林战争)-正式开发阶段(014-游戏客户端与服务器端连接搭建)
- jquery+javascript编写国籍控件
- 安卓大屏导航可用万年历
- 最新搜狗泛目录站群程序,助力站群关键词优化方法详解
热门文章
- c语言 线程读写,C语言创建线程以及使用锁进行读写分离
- 对数函数定义域和值域_这6道题全懂了,求对数函数的定义域和值域再不作难了...
- 2.ADS操作入门_线性/非线性仿真工具
- 创建可启动 WinPE 介质
- 递归函数内部的原理????不要跟我讲自己调用自己这样的话,我一分也不给你的zz
- 422器件与lvds接收器的区别_51系列单片机的区别与特点介绍
- RationalDMIS 7.1 SC2测针的构建
- 运算放大器选型与参考指南
- 脑科学实验-割裂脑研究
- 攻防世界 BotW-