目录:

    1.mp3 文件简介

    2.ID3 tag

      id3 v2

    3.音频帧

      要注意的地方

    4.参考

    5.一个临时解析方法

  一、MP3文件简介

    MP3(mpeg-1 Ⅲ 或者 mpeg-2 Ⅲ)是一种将音频以数字形式存储在设备上的文件格式。

    很简单的文件结构示意:

    [ID3 v2] frame_1 frame_2... frame_N [ID3 v1]

  二、ID3 tag

    id3 v1 和 v2 可任选其一,似乎现在大多数都是 v2 版本了,毕竟可扩展性更高。

    id3 v2 即是标签信息,里面包含有作者、版权、歌词、封面等等信息,如前面示意所示,它总是放在所有数据帧的最前面。

    这样的 MP3 文件都是以ID3 + 版本开头的,ID3 占 3 个字节,版本 2 字节,比如,下图中左边 16 进制数据 49 44 33 表示 ID3 v2, 03 00 就是版本信息,表示 id3 v2.3.0 版本:

    后面1个字节是 flags ,这个在这份文档[1]中解释十分详细。

    紧接着是 4 个字节以表示整个 ID3 标签块的大小,但不包括标签头,也就是不包括前面这10字节(ID3 占 3 字节 + 版本 2 字节 + 1个 flags 字节 + 大小 4 个字节)。

    接下来实际上就是各种音乐相关信息帧(详细解释请看后面截图部分),组成主要以下面字段(4 个字符,即4字节) + 大小(4 字节) + 标记(2字节):

  1. 4.20 AENC [[#sec4.20|Audio encryption]]
  2. 4.15 APIC [#sec4.15 Attached picture]
  3. 4.11 COMM [#sec4.11 Comments]
  4. 4.25 COMR [#sec4.25 Commercial frame]
  5. 4.26 ENCR [#sec4.26 Encryption method registration]
  6. 4.13 EQUA [#sec4.13 Equalization]
  7. 4.6 ETCO [#sec4.6 Event timing codes]
  8. 4.16 GEOB [#sec4.16 General encapsulated object]
  9. 4.27 GRID [#sec4.27 Group identification registration]
  10. 4.4 IPLS [#sec4.4 Involved people list]
  11. 4.21 LINK [#sec4.21 Linked information]
  12. 4.5 MCDI [#sec4.5 Music CD identifier]
  13. 4.7 MLLT [#sec4.7 MPEG location lookup table]
  14. 4.24 OWNE [#sec4.24 Ownership frame]
  15. 4.28 PRIV [#sec4.28 Private frame]
  16. 4.17 PCNT [#sec4.17 Play counter]
  17. 4.18 POPM [#sec4.18 Popularimeter]
  18. 4.22 POSS [#sec4.22 Position synchronisation frame]
  19. 4.19 RBUF [#sec4.19 Recommended buffer size]
  20. 4.12 RVAD [#sec4.12 Relative volume adjustment]
  21. 4.14 RVRB [#sec4.14 Reverb]
  22. 4.10 SYLT [#sec4.10 Synchronized lyric/text]
  23. 4.8 SYTC [#sec4.8 Synchronized tempo codes]
  24. 4.2.1 TALB [#TALB Album/Movie/Show title]
  25. 4.2.1 TBPM [#TBPM BPM (beats per minute)]
  26. 4.2.1 TCOM [#TCOM Composer]
  27. 4.2.1 TCON [#TCON Content type]
  28. 4.2.1 TCOP [#TCOP Copyright message]
  29. 4.2.1 TDAT [#TDAT Date]
  30. 4.2.1 TDLY [#TDLY Playlist delay]
  31. 4.2.1 TENC [#TENC Encoded by]
  32. 4.2.1 TEXT [#TEXT Lyricist/Text writer]
  33. 4.2.1 TFLT [#TFLT File type]
  34. 4.2.1 TIME [#TIME Time]
  35. 4.2.1 TIT1 [#TIT1 Content group description]
  36. 4.2.1 TIT2 [#TIT2 Title/songname/content description]
  37. 4.2.1 TIT3 [#TIT3 Subtitle/Description refinement]
  38. 4.2.1 TKEY [#TKEY Initial key]
  39. 4.2.1 TLAN [#TLAN Language(s)]
  40. 4.2.1 TLEN [#TLEN Length]
  41. 4.2.1 TMED [#TMED Media type]
  42. 4.2.1 TOAL [#TOAL Original album/movie/show title]
  43. 4.2.1 TOFN [#TOFN Original filename]
  44. 4.2.1 TOLY [#TOLY Original lyricist(s)/text writer(s)]
  45. 4.2.1 TOPE [#TOPE Original artist(s)/performer(s)]
  46. 4.2.1 TORY [#TORY Original release year]
  47. 4.2.1 TOWN [#TOWN File owner/licensee]
  48. 4.2.1 TPE1 [#TPE1 Lead performer(s)/Soloist(s)]
  49. 4.2.1 TPE2 [#TPE2 Band/orchestra/accompaniment]
  50. 4.2.1 TPE3 [#TPE3 Conductor/performer refinement]
  51. 4.2.1 TPE4 [#TPE4 Interpreted, remixed, or otherwise modified by]
  52. 4.2.1 TPOS [#TPOS Part of a set]
  53. 4.2.1 TPUB [#TPUB Publisher]
  54. 4.2.1 TRCK [#TRCK Track number/Position in set]
  55. 4.2.1 TRDA [#TRDA Recording dates]
  56. 4.2.1 TRSN [#TRSN Internet radio station name]
  57. 4.2.1 TRSO [#TRSO Internet radio station owner]
  58. 4.2.1 TSIZ [#TSIZ Size]
  59. 4.2.1 TSRC [#TSRC ISRC (international standard recording code)]
  60. 4.2.1 TSSE [#TSEE Software/Hardware and settings used for encoding]
  61. 4.2.1 TYER [#TYER Year]
  62. 4.2.2 TXXX [#TXXX User defined text information frame]
  63. 4.1 UFID [#sec4.1 Unique file identifier]
  64. 4.23 USER [#sec4.23 Terms of use]
  65. 4.9 USLT [#sec4.9 Unsychronized lyric/text transcription]
  66. 4.3.1 WCOM [#WCOM Commercial information]
  67. 4.3.1 WCOP [#WCOP Copyright/Legal information]
  68. 4.3.1 WOAF [#WOAF Official audio file webpage]
  69. 4.3.1 WOAR [#WOAR Official artist/performer webpage]
  70. 4.3.1 WOAS [#WOAS Official audio source webpage]
  71. 4.3.1 WORS [#WORS Official internet radio station homepage]
  72. 4.3.1 WPAY [#WPAY Payment]
  73. 4.3.1 WPUB [#WPUB Publishers official webpage]
  74. 4.3.2 WXXX [#WXXX User defined URL link frame]

    注意,这里的大小只是字段信息的大小,并且可能有很多信息帧。

    下面是用截图加解释的方式来证明这部分的组成成分。

    我们看下这个 mp3 文件,如下图:

    前面所说的头部分之后出现 TSSE 4 个字符,上面给出的表中也出现了 TSSE,它指的是使用的软/硬件编码方式,大小是 13 (00 00 00 0D)字节,实际上就是图中的 Lavf56.4.101(这说明使用的 ffmpeg 进行编码),正好 13 字节。

    接下来定位到下一个字段:

    APIC 也是上面中有的字段,它是指图片(并且注意到PNG,png 文件一定是以 137 80 78 71 13 10 26 10(89 50 4E 47 0D 0A 1A 0A)这 8 个字节开头,以及后面的 IHDR,它是 PNG 图片格式的组成成分头的部分),它的内容大小共有 530532(00 08 18 64)字节(不包括该帧的大小所占的 4 字节以及标记占的 2 字节),从 . 开始定位到该内容块的最一个字节的位置:

    可以看到下一个字段 TALB 也是出现在表中...等等,可以验证没有任何问题。

  三、音频帧

    frame 则是包含有音频数据以及与音频数据有关的信息的块,音频信息当然就是比如比特率、采样率、通道、CRC 校验等等。

    每一帧都是按 AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 组成,这个在文档[2]中也有详细解释,我主要想说要注意 2 点:

      1.如何在文件中找到音频帧头,这个因为帧头第一个字节一定是 255(FF),但也有可能其他地方也出现 FF,所以不能光用第一个字节判断,但也不能用 4 个字节来判断,有可能一些部分是 FF FB E0 00 ,有的却是 FF FB E2 44,但如果是文件是 MPEG-1 III,那么用前 2 个字节基本上不会错。

      2.按计算公式得到的字节大小不一定就等于音频数据大小。

  四、参考

    [1]: Informal Standard Document: id3v2.3 M. Nilsson 3rd February 1999 http://id3.org/id3v2.3.0

    [2]: http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html

  五、一个临时解析方法

  1. void ReadMpegAudio(char * filename, PBYTE audio)
  2. {
  3. std::ifstream file(filename, std::ios::binary);
  4. unsigned char id3_tag[] = { 255, 251 };
  5.  
  6. for (unsigned char c = file.get(); !file.eof(); c = file.get())
  7. {
  8. int k = 0;
  9. if (c == id3_tag[0])
  10. {
  11. c = file.get();
  12. if (c == id3_tag[1])
  13. {
  14. for (int j = 0; j < 2; j++)
  15. c = file.get();
  16. for (;; c = file.get())
  17. {
  18. unsigned char gc = c;
  19. if (c == id3_tag[0])
  20. {
  21. c = file.get();
  22. if (c == id3_tag[1])
  23. break;
  24. else
  25. audio[k++] = gc;
  26. }
  27. else
  28. audio[k++] = gc;
  29. }
  30. // std::cout << k << '\n';
  31. }
  32. else continue;
  33. }
  34. else continue;
  35. }
  36. }

  

MP3 文件格式解析的更多相关文章

  1. 多媒体文件格式解析之MP3

    音频文件格式MP3 1. MP3是什么? MP3是MPEG-1 Audio Layer 3的缩写,是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户的听觉 ...

  2. mp4文件格式解析(转载)

    mp4文件格式解析 原作:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的 ...

  3. ArcGIS三大文件格式解析

    原文:ArcGIS三大文件格式解析 Shape数据 Shapefile是ArcView GIS 3.x的原生数据格式,属于简单要素类,用点.线.多边形存储要素的形状,却不能存储拓扑关系,具有简单.快速 ...

  4. Android init.rc文件格式解析

    /***************************************************************************** * Android init.rc文件格式 ...

  5. MP3文件结构解析(超详细)

    转自:http://blog.csdn.net/u010650845/article/details/53520426 MP3文件结构解析(超详细) 1. MP3文件结构解析 1.1. 概述 1.1. ...

  6. C++PE文件格式解析类(轻松制作自己的PE文件解析器)

    PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...

  7. 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)

    解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...

  8. mp4文件格式解析(转)

    mp4文件格式解析 MP4文件格式带数据详解 MP4文件格式的解析,以及MP4文件的分割算法

  9. Qt的.pro文件格式解析

    Qt的.pro文件格式解析 在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下: 1.注释 .pro文件中注释采用#号,从"#&quo ...

随机推荐

  1. 牛客网 —— 爱奇艺2020校招C++方向笔试题 总结

    错了5,6个,主要集中在数据库和操作系统上.    C++还需要提高熟练度. 总结 第6题: 折半查找树:根据二分查找构造得到的树,它一定是一个二叉排序树,是一个特殊的二叉排序树.  (接近于平衡二叉 ...

  2. 解决苹果手机app store下载软件超过200M后必须使用wifi的终极方法(亲测有效)

      前言 最近使用苹果手机下载一款大小为300M左右的软件时弹出如下提示 因为平时主要使用wifi下载,偶尔用自己的流量也没有超过200M,所以用了这么久才发现苹果手机有这样一个限制. 这让我有些郁闷 ...

  3. DBeaver下载驱动文件失败

    今天首次使用DBeaver软件链接数据库时会进行下载驱动文件,例如如下图所示: 在上图中显示了下载驱动文件失败,提示“无法解决库文件,请检查网络设置”.其实,是可以正常上网的,可能是公司内网的限制,或 ...

  4. cookie、session和application

    https://cloud.tencent.com/developer/article/1493869 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今 ...

  5. poj2387- Til the Cows Come Home(最短路板子题)

    题目描述 Description Bessie is out in the field and wants to get back to the barn to get as much sleep a ...

  6. Spring IoC详解

    Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...

  7. [HAOI2011] 向量 - 裴蜀定理

    给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y) ...

  8. 163.扩展User模型-一对一方式扩展

    一对一外键 如果你对用户验证方法authenticate没有更多的要求,就是使用username和password就可以完成用户的登录验证工作,但是想要在原来的模型的基础上添加新的字段,那么就可以使用 ...

  9. javascript闭包的理解和实例

    所谓闭包,值得是词法表示包括不必要计算的变量的函数,也就是说,该函数可以使用函数外定义的变量. 顺便提示一下: 词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通 ...

  10. poj1321棋盘问题(dfs+摆放问题)

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...