ID3V2是目前主流的mp3标签格式,特别是做为车载音乐播放器等一些无法连接到互联网的应用场景上,我们无法通过网络获得歌曲的信息,因此,读取ID3V2或者ID3V1标签就是一个很好的解决方案,这里主要记录的是在qt上通过代码实现这些信息的读取,借鉴了网上主流的方案,这里只是简单的介绍了下代码会用到的地方

一、ID3V2标签格式说明

1.1 标签头

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

char Header[3]; /*必须为"ID3"否则认为标签不存在*/

char Ver; /*版本号;ID3V2.3就记录03,ID3V2.4就记录04*/

char Revision; /*副版本号;此版本记录为00*/

char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/

char Size[4]; /*标签大小,包括标签帧和标签头。(不包括扩展标签头的10个字节)*/

我们可以利用Binary Viewer打开任意一个mp3文件:

观察前10个字节:

其中,49,44,33 对应的ascii码就是ID3,03代表ID3V2.3,说明这个音乐文件的标签是ID3V2.3格式;

后4个字节00,17,2B,1A记录的是整个标签的大小(字节),但每个字节只用7位,最高位不使用恒为0。所以格式如下:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

计算时要做适当的转换,通过移位操作实现:

    mp3_TagSize =   ((Header_size[0] & 0xff) << 21) |((Header_size[1] & 0xff) << 14) |((Header_size[2] & 0xff) << 7) |(Header_size[3] & 0xff);

其中Header_size[0]对应的是00字节,Header_size[3]对应的是最后一个字节(1A),以此类推;

1.2标签帧

每个标签帧都有一个10个字节的帧头和至少一个字节的不固定长度的内容组成,如图所示:

灰色框为帧头,蓝色框为帧内容

帧头的定义如下:

char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/

char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/

char Flags[2]; /*存放标志,只定义了6位,稍后详细解说*/

帧内容每个字节的8位全用,格式如下:

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

framecount = frameSize[0]*0x1000000+frameSize[1]*0x10000+frameSize[2]*0x100+frameSize[3];

1.3 帧标识

用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:

TIT2=标题 表示内容为这首歌的标题,下同

TPE1=作者

TALB=专集

TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字

TYER=年代 是用ASCII码表示的数字

TCON=类型 直接用字符串表示

COMM=备注 格式:"eng\0备注内容",其中eng表示备注所使用的自然语言

APIC = 专辑图片

二、图片读取

在网易云音乐和qq音乐下载的歌曲,一般都是以png和jfif(jpeg的一种衍生格式)储存在歌曲文件中的,我们要把图片提取并且存放,就必须知道图片的存储格式,这样才能生成指定的图片文件格式

jpeg格式解析可以参考博文:

https://blog.csdn.net/u012819339/article/details/46544061

png格式解析可以参考博文:

https://blog.csdn.net/bisword/article/details/2777121

我这里只做简单的判断:

png文件标志的前两个字节为89 50;

jpeg文件标志的前两个字节为FF,D8;

根据这两个特点可以判断出图片的类型

图中红色部分的14个字节是固定的,我们在读取图片的数据帧时直接跳过,接着到绿色部分,判断绿色部分的数据,根据数据可以得出图片类型,图中显然是jpeg格式图片,接着就可以读取图片内容了(绿色部分也要包含在图片内容的读取部分,红色不用)

总结:在代码中,只要在标签头的10个字节中判断文件开头是否为ID3V2,读取标签的总大小;

然后依次读取每个标签帧;

每个标签帧中又分为:读取标签头,获得标签类型,获得帧内容大小,读取帧内容;

下一篇将通过代码实现读取

QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(二)

QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(一)相关推荐

  1. QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(二)

    这篇承接上篇,主要记录的是代码,关于mp3ID3V2的简要介绍可以跳转到上一篇: QT 读取mp3ID3V2 获取mp3专辑图片.专辑名称.标题.作者(一) 前提说明:没有使用任何的外部库,纯代码实现 ...

  2. Android设备获取mp3中的专辑封面信息

    Mp3文件中包含图片信息.如下图: MP3文件的专辑封面数据是编码在MP3文件中的ID3中,需要在解析ID3 tag的时候将这段压缩的数据从MP3文件中copy出来,写到某个文件中去.具体流程可以参考 ...

  3. 【效率特工队】如何在很多张JPG图片中,批量获取所有JPG图片的名称提取到Excel表格,用这个方法一并解决

    很多电脑前工作者,婚纱摄影影楼的人面对一堆图片 如何快速批量提取图片信息到Excel表格中,如何批量获取图片大小尺寸信息 不知道如何如获取图片的文件路径.文件名.图片大小尺寸等很多图片信息 路径.分辨 ...

  4. java 获取mp3 封面_JAVA 读取MP3歌名,歌手,专辑,封面

    上传MP3文件后,后台读取MP3信息.需要使用的引入一个jar :   Jaudiotagger-2.2.6-SNAPSHOT.jar  下载地址 package com.hnzh.bnk.utils ...

  5. 从MP3中读取专辑图片

    好吧,最近帮朋友写毕设时碰到这个的问题的,在网上也是多番查询,都不尽人意,于是自己参考多番之后,写了一个 其实吧,这个读取专辑图片也不是很难得,首先判断MP3文件中是否含有ID3V2的标签,关于ID3 ...

  6. 读取MP3文件内的ID3V2专辑图片并显示

    这里说的ID3V2一般指的2.3版本,MP3文件后128字节是ID3V1信息,ID3V1大小固定所以信息含量较少,由于项目需要,要读取专辑图片并显示,我找到ID3V2的格式说明,也不知准备不准确,但我 ...

  7. linux给音乐添加封面,linux系统获取MP3的专辑封面图片

    linux系统获取MP3的专辑封面图片 背景 我们播放的MP3格式的音乐的时候,有的显示专辑封面图片,有的不显示,这是为什么呢?是这样的,我们看到的MP3文件不仅仅包含听到的那些声音,其实作为一个MP ...

  8. 解析mp3文件,获得mp3中的专辑图片

    这仍然也是操作的是字节,所以其他语言都是适用的. mp3文件的首尾都存有文件的信息,存在尾部的称为ID3V1,在首部的称为 ID3V2.专辑图片是存放在部的ID3V2.所以这里解析ID3v2 主要的知 ...

  9. Android开发之Glide加载U盘音乐的专辑图片的方法 | Glide加载content:图片 | Glide加载内容提供者 | Glide加载MP3专辑图片 | Glide加载音乐专辑图片

    老套路先(献)上图 1.说下核心,Glide提供了直接加载内容提供者的方法用于显示图片 2.Glide加载的图片的格式如下 content://com.yhsh.app.media.server.us ...

最新文章

  1. Java中使用memcache缓存
  2. MSF常用的监听模块命令
  3. 分布式一致性哈希算法
  4. linux升级补丁tar,Linux下Bash严重漏洞补丁升级方法
  5. 《统一沟通-微软-技巧》-14-Exchange 2010 With SP1-2-UM Integration-1
  6. ABB 机器人 通信指令(人机对话):
  7. java mysql lru_Java集合详解5:深入理解LinkedHashMap和LRU缓存
  8. 计算机网络 DNS协议 FTP DHCP
  9. 三星Galaxy Fold 2渲染图曝光:怎么折是个问题
  10. 无法使用prop_Adobe Launch配置流量变量(Prop)
  11. python中高阶函数与装饰器(3)
  12. Python入门学习—元组/字符串(FishC)
  13. cpu vtx测试软件,推荐几个好用的检测电脑CPU是否支持(Virtualization Technology)虚拟化技术的工具-推荐实用小软件 -亦是美网络...
  14. C语言中图形 * 的输出
  15. 大型医院his系统源码 医院信息管理系统源码 C/S架构
  16. 怎样添加网络扫描到计算机名,为扫描仪添加局域网功能
  17. 不想被淘汰,大咖有话说——程序猿一定要学大数据?
  18. c语言编辑二维数组转置,求C语言程序:编写一个函数,使给定的一个二维数组(3*3)转置。感激不尽...
  19. h5/web 原生定位、高德、腾讯地图定位
  20. UVA_12676_Inverting Huffman(哈夫曼树)

热门文章

  1. 批量导入快速生成题库,线上考试得力助手
  2. 什么是数据产品经理?需要什么能力?有哪些相关书籍可以读?
  3. 第2章 索引优化分析
  4. C#对象序列化、反序列化、保存、读取、对象直接保存、读取
  5. Centos7部署NFS-V4
  6. 书论04 崔瑗《草书势》
  7. Chrome撤销一律不翻译网页方法
  8. livp格式是什么?如何快速打开livp?livp格式怎么转换为jpg?
  9. 萌萌哒的Dash昆虫机器人,让孩子边玩边成才
  10. Linux网络环境的配置?