QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(一)
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专辑图片、专辑名称、标题、作者(一)相关推荐
- QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(二)
这篇承接上篇,主要记录的是代码,关于mp3ID3V2的简要介绍可以跳转到上一篇: QT 读取mp3ID3V2 获取mp3专辑图片.专辑名称.标题.作者(一) 前提说明:没有使用任何的外部库,纯代码实现 ...
- Android设备获取mp3中的专辑封面信息
Mp3文件中包含图片信息.如下图: MP3文件的专辑封面数据是编码在MP3文件中的ID3中,需要在解析ID3 tag的时候将这段压缩的数据从MP3文件中copy出来,写到某个文件中去.具体流程可以参考 ...
- 【效率特工队】如何在很多张JPG图片中,批量获取所有JPG图片的名称提取到Excel表格,用这个方法一并解决
很多电脑前工作者,婚纱摄影影楼的人面对一堆图片 如何快速批量提取图片信息到Excel表格中,如何批量获取图片大小尺寸信息 不知道如何如获取图片的文件路径.文件名.图片大小尺寸等很多图片信息 路径.分辨 ...
- java 获取mp3 封面_JAVA 读取MP3歌名,歌手,专辑,封面
上传MP3文件后,后台读取MP3信息.需要使用的引入一个jar : Jaudiotagger-2.2.6-SNAPSHOT.jar 下载地址 package com.hnzh.bnk.utils ...
- 从MP3中读取专辑图片
好吧,最近帮朋友写毕设时碰到这个的问题的,在网上也是多番查询,都不尽人意,于是自己参考多番之后,写了一个 其实吧,这个读取专辑图片也不是很难得,首先判断MP3文件中是否含有ID3V2的标签,关于ID3 ...
- 读取MP3文件内的ID3V2专辑图片并显示
这里说的ID3V2一般指的2.3版本,MP3文件后128字节是ID3V1信息,ID3V1大小固定所以信息含量较少,由于项目需要,要读取专辑图片并显示,我找到ID3V2的格式说明,也不知准备不准确,但我 ...
- linux给音乐添加封面,linux系统获取MP3的专辑封面图片
linux系统获取MP3的专辑封面图片 背景 我们播放的MP3格式的音乐的时候,有的显示专辑封面图片,有的不显示,这是为什么呢?是这样的,我们看到的MP3文件不仅仅包含听到的那些声音,其实作为一个MP ...
- 解析mp3文件,获得mp3中的专辑图片
这仍然也是操作的是字节,所以其他语言都是适用的. mp3文件的首尾都存有文件的信息,存在尾部的称为ID3V1,在首部的称为 ID3V2.专辑图片是存放在部的ID3V2.所以这里解析ID3v2 主要的知 ...
- Android开发之Glide加载U盘音乐的专辑图片的方法 | Glide加载content:图片 | Glide加载内容提供者 | Glide加载MP3专辑图片 | Glide加载音乐专辑图片
老套路先(献)上图 1.说下核心,Glide提供了直接加载内容提供者的方法用于显示图片 2.Glide加载的图片的格式如下 content://com.yhsh.app.media.server.us ...
最新文章
- Java中使用memcache缓存
- MSF常用的监听模块命令
- 分布式一致性哈希算法
- linux升级补丁tar,Linux下Bash严重漏洞补丁升级方法
- 《统一沟通-微软-技巧》-14-Exchange 2010 With SP1-2-UM Integration-1
- ABB 机器人 通信指令(人机对话):
- java mysql lru_Java集合详解5:深入理解LinkedHashMap和LRU缓存
- 计算机网络 DNS协议 FTP DHCP
- 三星Galaxy Fold 2渲染图曝光:怎么折是个问题
- 无法使用prop_Adobe Launch配置流量变量(Prop)
- python中高阶函数与装饰器(3)
- Python入门学习—元组/字符串(FishC)
- cpu vtx测试软件,推荐几个好用的检测电脑CPU是否支持(Virtualization Technology)虚拟化技术的工具-推荐实用小软件
-亦是美网络...
- C语言中图形 * 的输出
- 大型医院his系统源码 医院信息管理系统源码 C/S架构
- 怎样添加网络扫描到计算机名,为扫描仪添加局域网功能
- 不想被淘汰,大咖有话说——程序猿一定要学大数据?
- c语言编辑二维数组转置,求C语言程序:编写一个函数,使给定的一个二维数组(3*3)转置。感激不尽...
- h5/web 原生定位、高德、腾讯地图定位
- UVA_12676_Inverting Huffman(哈夫曼树)