Android api中提供了Visualizer来读取波形。至于读取专辑图片,mp3的ID3V2标签里包含了作者,作曲,专辑等信息,专辑图片可以从中读取,但也不是一定会有。
demo效果图
从MP3文件的ID3V2标签里读取图片
首先了解一下mp3的文件结构,MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)
ID3V2 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。
一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定;
每个帧的长度可能不固定,也可能固定,由位率bitrate决定
每个帧又分为帧头和数据实体两部分
帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立 。ID3V1在文件结尾的位置,包含了作者,作曲,专辑等信息,长度为128Byte。
ID3V2.3
ID3V2.3标签一般包含一个标签头和若干个标签帧。
ID3V2.3{
header{
header;
reVersion;
flag;
size;
}
frames[
frame{
header{
frameID;
size;
flag;
}
data;
}
......
]
}
标签头
文件开始的10个字节就是标签头,顺序下来的结构如下:
public byte[] header = new byte[3]; /* 字符串 "ID3" */
public byte version; /* 版本号ID3V2.3 就记录3 */
public byte reVersion; /* 副版本号此版本记录为0 */
public byte flag; /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */
public byte[] size = new byte[4];/* 大小,除了标签头的10 个字节的标签帧的大小
大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
大小为:
(size[0] & 0x7F) * 0x200000
+ (size[1] & 0x7F) * 0x4000
+ (size[2] & 0x7F) * 0x80
+ (size[3] & 0x7F);*/
标签帧
从10个字节的标签头后开始,长度为标签头里定义的size,里面包含了多个标签帧。
标签帧的结构也类似,一个10字节的帧头,后面接着帧头里定义的size长度的帧数据。
帧头的结构如下:
public byte[] frameID = new byte[4];
public int[] size = new int[4]; /*4个字节的长度,这次每个字节都用全8位,0-255,java的byte是-128-127*/
public byte[] flag = new byte[2];
frameID
用四个字符标识