音乐播放器之示波器和读取专辑图片

本文介绍了如何在Android中使用Visualizer实现音乐示波器效果,并详细讲解了如何从MP3文件的ID3V2标签中读取专辑图片。通过解析ID3V2.3标签帧,找到并提取APIC帧中的图片数据。同时,文章还展示了处理WAVE和FFT数据的方法。
摘要由CSDN通过智能技术生成

Android api中提供了Visualizer来读取波形。至于读取专辑图片,mp3的ID3V2标签里包含了作者,作曲,专辑等信息,专辑图片可以从中读取,但也不是一定会有。
demo效果图
这里写图片描述

从MP3文件的ID3V2标签里读取图片

首先了解一下mp3的文件结构,MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)

  1. ID3V2 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。

  2. 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定;
    每个帧的长度可能不固定,也可能固定,由位率bitrate决定
    每个帧又分为帧头和数据实体两部分
    帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立 。

  3. 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];
  1. frameID

    用四个字符标识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值