野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13743|回复: 4

【原创】MP3文件格式及解码过程简述(by qduwg)

[复制链接]
发表于 2016-1-14 20:29:16 | 显示全部楼层 |阅读模式
本帖最后由 qduwg 于 2016-1-14 20:36 编辑

题记:
       15年8月份偶然机会与火哥结缘,认识了野火的板子,宝贝到手后就废寝忘食的投入研究和学习了,一不小心就闯入STM32的店堂。与51单片机的开发很不一样的是,需要大量的库函数,效率和性能远远胜过51了。一发不可收拾的迷上了STM32。每每遇到问题也是百思不得其解,经过执着的探索和求证咨询,得到解决后感到真是柳暗花明又一村,豁然开朗的感觉真是不错。最近一段时间研究到了MP3播放器这里了,看到坛友“虫子”的帖子说是跟踪不到PCM数据的输出。我就暗下决心试试看能否跟踪调试出来结果。真是皇天不负有心人,最后经过仔细跟踪调试,终于有了结果。能对坛友提供点帮助甚是欣慰。同时,大神、大版主亽亼也希望顺便写一篇总结性的小文章分享给大家。深感压力巨大,毕竟在各位大神面前班门弄斧之嫌。权当自己交作业了。
       MP3实乃纷繁复杂的一种多媒体文件格式,非我等菜鸟之辈能研究的透的。但有火哥等技术大神的指导,一步一个脚印的攀登,胜利的曙光就在前面!本篇小文只是管窥一豹,沧海一粟,聊以抛砖引玉而已。网上资料多如牛毛,但是基本都是转载的多,有深入研究的少,只好求助于google,搜索国外资料数日,没有太大收获。曾经联系一德国高手,但是那位教授说他的书早已没有剩余。非常遗憾。查阅大量资料后,自己先总结一段时间来的资料。算是一个作业吧,仓促而就,不要嫌弃。
==========================节选========================================分享下载链接在后面哦!
MP3文件格式及解码过程简述  by qduwg
MP3文件是有帧(frame)构成的,frame是文件最小组成单位。Mp3实际上是MPEG1的Layer-3层。为了降低失真度,MP3采用感官编码技术,先对音频文件进行频谱分析,然后过滤掉噪音电平,然后通过量化方式,把剩下的每一位打散排列,形成MP3文件。
一、 一、MP3文件结构
MP3由帧构成,每个帧包括FrameHeader帧头,FrameData帧数据,MP3文件一般分为三部分:ID3V2,Frame,ID3V1, ID3V2,ID3V1也属于帧,叫标签帧。Frame部分叫数据帧。在一个MP3文件内不一定有标签帧,但一定有数据帧。
1. ID3V2:包含作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。
2. Frame:一系列的帧,个数由文件大小和帧长决定;每个Frame的长度可能不相等,也可能相等,由位率bitrate决定;每个Frame又分为帧头和数据实体两部分,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。
3.ID3V1:包含了作者,作曲,专辑等信息,长度为128B。
二、二、MP3文件种类
根据位率是否相同,分成两类:位率相等叫CBR,constant bitrate,位率不等,叫VBR,variable bitrate. VBR有两种规范:Xing,VBRI。
三、标签帧
1.       ID3V2标签: 都有一个标签头和若干个标签帧,存放于MP3文件首部。
图1.jpg

1.1标签头 label header
在文件的首部顺序记录 10 个字节的 ID3V2.3 的头部。数据结构如下:
char Header[3];     /*必须为"ID3"否则认为标签不存在,如上图"49 44 33",文本为“ID3”*/
char Ver;          /*版本号 ID3V2.3 就记录 3,如上图地址03处记录为"03"*,/
char Revision;      /*副版本号此版本记录为 0*/
char Flag;         /*存放标志的字节,这个版本只定义了三位,稍后详细解说,这里为00*/
char Size[4];       /*标签大小,包括标签头的 10 个字节和所有的标签帧的大小,这里为+10=个字节,计算方法见下文*/
1).Flag标志字节
标志字节一般为 0,定义如下:  abc00000
a-表示是否使用 Unsynchronisation
b-表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置
c-表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)
2).标签大小
一共四个字节,读取顺序为big-endia(低地址向高地址读取)但每个字节只用 7 位,最高位不使用恒为 0。所以格式如下 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx。计算大小时要将 0 去掉,得到一个 28 位的二进制数,就是标签大小(不懂为什么要这样做,应该是MP3规范定义好的)。计算公式如下:
  Size = (Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x4000+(Size[2]&0x7F)*0x80 +(Size[3]&0x7F)
      = (Size[0]&0x7F)*2*16^5+(Size[1]&0x7F)*4*16^3 +(Size[2]&0x7F)*8*16 +(Size[3]&0x7F)
而整个帧的大小需要加上帧头的10个字节,即total_Size=Size+10

上述例子的标签大小字段为“00 00 21 34”,所以Size=0x10b4,整个帧的大小为0x10BE个字节,所以在0X10BE这个地址处将开始新的帧。
1.2、标签帧label frame
每个标签帧都有一个 10 个字节的帧头frame header和至少一个字节的不固定长度的内容组成。也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中获取内容尺寸后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。

帧头的定义如下:
char FrameID[4];   /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表,参见附录*/
char Size[4];       /*帧内容的大小,不包括帧头,不得小于1,计算见下文*/
char Flags[2];      /*存放标志,只定义了 6 位,解说在后*/

1).帧标识:用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下,具体可以参照后文附录4(帧标识的含义):
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

算法如下:  Size = Size[0]*0x1000000 +Size[1]*0x10000 +Size[2]*0x100 +Size[3]
           = Size[0]*16^6 +Size[1]*16^4 +Size[2]*16^2 +Size[3]
而整个帧的大小需要加上帧头的10个字节,即total_Size=Size+10。

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



附:帧标识的含义Declared ID3v2 frames
AENC Audio encryption
APIC Attached picture
COMM Comments
COMR Commercial frame
ENCR Encryption method registration
EQUA Equalization
ETCO Event timing codes
GEOB General encapsulated object
GRID Group identification registration
IPLS Involved people list
LINK Linked information
MCDI Music CD identifier
MLLT MPEG location lookup table
OWNE Ownership frame
PRIV Private frame
PCNT Play counter
POPM Popularimeter
POSS Position synchronisation frame
RBUF Recommended buffer size
RVAD Relative volume adjustment
RVRB Reverb
SYLT Synchronized lyric/text
SYTC Synchronized tempo codes
TALB Album/Movie/Show title
TBPM BPM (beats per minute)
TCOM Composer
TCON Content type
TCOP Copyright message
TDAT Date
TDLY Playlist delay
TENC Encoded by
TEXT Lyricist/Text writer
TFLT File type
TIME Time
TIT1 Content group description
TIT2 Title/songname/content description
TIT3 Subtitle/Description refinement

TOAL Original album/movie/show title
TOFN Original filename
TOLY Original lyricist(s)/text writer(s)
TOPE Original artist(s)/performer(s)
TORY Original release year
TOWN File owner/licensee
TPE1 Lead performer(s)/Soloist(s)
TPE2 Band/orchestra/accompaniment
TPE3 Conductor/performer refinement
TPE4 Interpreted, remixed, or otherwise modified by
TPOS Part of a set
TPUB Publisher
TRCK Track number/Position in set
TRDA Recording dates
TRSN Internet radio station name
TRSO Internet radio station owner
TSIZ Size
TSRC ISRC (international standard recording code)
TSSE Software/Hardware and settings used for encoding
TYER Year
TXXX User defined text information frame
UFID Unique file identifier
USER Terms of use
USLT Unsychronized lyric/text transcription
WCOM Commercial information
WCOP Copyright/Legal information
WOAF Official audio file webpage
WOAR Official artist/performer webpage
WOAS Official audio source webpage
WORS Official internet radio station homepage
WPAY Payment
WPUB Publishers official webpage
WXXX User defined URL link frame
TKEY Initial key
TLAN Language(s)
TLEN Length
TMED Media type


链接下载在这里:

回复

使用道具 举报

 楼主| 发表于 2016-1-14 20:31:52 | 显示全部楼层
@亽亼 已经按照您的提议,仓促写了这篇小作业。请审阅批评!
回复 支持 反对

使用道具 举报

发表于 2016-1-15 08:54:12 | 显示全部楼层
之前看 @qduwg 有发MP3相关帖子,看来是在研究MP3软解码这块,刚好论坛这方面资料较少就让 qduwg 随便总结一下
写文档总结工作量是很大的,需要参考很多文献,qduwg 都跑去问德国高手啦看来确实花了很多心思。
文档内容还是很丰富的,是个不错的参考资料
回复 支持 反对

使用道具 举报

发表于 2016-1-15 08:58:30 | 显示全部楼层
MPEG简介_ _如何计算CBR_VBR_MP3的播放时间_v1.4.pdf (824.78 KB, 下载次数: 29)
之前偶尔看到篇不错的文档,也是介绍MP3相关的,随便借个位置贴出来供参考

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-1-15 09:22:55 | 显示全部楼层
亽亼 发表于 2016-1-15 08:54
之前看 @qduwg 有发MP3相关帖子,看来是在研究MP3软解码这块,刚好论坛这方面资料较少就让 qduwg 随便总结 ...

感谢大版主的点评。网上资料基本多是关于帧头的介绍,关于side infromation所谓的边信息,介绍的相对较少了。其实关键就是在这部分内容的。MP3还是值得研究一番呢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 09:52 , Processed in 0.033516 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表