MP3学习总结

目录

1 前言

2 格式解析

2.1 ID3V1

2.2 ID3V2

2.2.1 ID3V2.3标签头内容

2.2.2 ID3V2.3标签帧结构

2.2.3 标签帧标识符

2.3 数据帧

2.3.1 编码方式:CBR与VBR

2.3.2 有效音频数据帧

3 解码原理

4 常见问题

5 参考资料

6 附录[1]

6.1 VBR帧

6.2 MPEG 音频版本表

6.3 比特率索引表(单位 Kbps)

​6.4 采样率索引表

6.5 每帧数据的采样数

6.6 channel 模式表

6.7 标签帧的标识以及其意义对照表


1 前言

该文档旨在提供一个对MP3整体的认识,方便入门,文章引用已标明,如有错误纰漏,非常欢迎指出。

MP3全称为MPEG Audio Layer 3,是一种音频编码方案。MPEG有三种音频编码方案,包括Layer1、Layer2、Layer3。通常MP3指的是Layer3。

2 格式解析

MP3主要由多个数据帧组成,一个数据帧包括帧头与数据块。在MP3文件的开头,可能包括ID3V2元数据,而文件末尾可能包括128字节的ID3V1元数据MP3最开始只有数据帧,对于应用者而言,无从得知该mp3文件的相关信息,包括演唱者,作曲家,专辑名等,因此产生了ID3V1标签,固定128个字节,放在文件最后,该标签可以提供如上的信息。然而,固定的128个字节ID3V1标签所能提供的信息实在有限,越来越不满足应用的需要,ID3V2应运而生,该标签存在于文件首部,作为ID3V1的补充。毕竟,文件尾部已经被占用了。

 

2.1 ID3V1

ID3v1是第一个版本的音频标签,长度为固定的 128 字节,位置在 MP3 文件的尾部。

名称字长长度字节位置说明
Tag31~3ID3V1标识符“TAG”的Ascii码
Title304~33歌曲名的音频
Artist3034~63歌手名的音频
Album3064~93专辑名的音频
Year494~97日期信息音频
Comment2898~125注释信息,有时为30字节
Reserved1126=0说明有音轨,下一字节就是音轨;≠0表示注释是30个字节
Track1127音轨(字节型数值),歌曲在专辑里的序号
Genre1128歌曲风格(字节型数值)
注释:
1.如果MP3的注释=30字节,那么就要占用 Reserved 和 Track 两个字节,这要看 Reserved 是否=0,如果=0,那么注释有 28 个字节。如果不是,那么注释有 30 个字节。当注释=30 个字节的时候,那就没有 Track 了。
2.如果 MP3 文件后面虽然有“TAG”三个字母,但字母后面全是0,那就不是一个合法的 ID3V1 信息,应该认为没有 ID3V1 信息。
3.ID3V1 的各项信息都是顺序存放,没有任何标识将其分开,一般用 0补足规定的长度。比如歌曲名有 20 个字节,则在歌曲名后要补足 10 个 0,否则将造成信息错误。
4.歌曲风格共 148 种,用编号表示,详情可上网查询。其数据存放按照顺序一个个存放,如果长度不足则补 0,ID3v1 应该已经比较少用了。

2.2 ID3V2

ID3V2由10个字节的标签头与多个标签帧组成,标签帧不固定长度,包括10个字节的帧头与至少1字节的帧内容。

2.2.1 ID3V2.3标签头内容

名称字节长度字节位置说明
Header31~3ID3V2.3标识符"ID3"的Ascii码
Ver14版本号
Revision15副版本号
Flag16标志字节,一般没意义,=00
Size47~10标签内容长度,高位在前,不包括标签头的10个字节
注释
1.Size 字段的计算公式如下(从左至右):
size =字节1的值*0x200000+字节2的值*0x4000+字节3的值*0x80+字节4的值(每个字节只用7位,最高位不使用,恒为0)
2.如果所有标签帧的总长度<标签内容长度,则须用0填满。

2.2.2 ID3V2.3标签帧结构

名称字节长度字节位置说明
FrameID41~4帧标识符的Ascii码
Size45~8帧内容及编码方式的合计长度,高位在前,不包括帧头
Flags29~10标志,只使用了6位,一般均=0
帧内容  至少 1 个字节

ID3V2长度不固定,尾部可能有补空数据。

注释
1.标签帧大小计算公式:Size = Size[0]*0x1000000+Size[1]*0x10000+Size[2]*0x100+Size[3]。
2.标签帧之间没有特殊的分隔符,要得到一个完整的标签帧内容必须先从帧头中得到帧内容长度。
3.帧内容均为字符串,常以 00 开头。
4.Flags一般没用,通常为0.

2.2.3 标签帧标识符

名称意义名称意义
TALB专辑TCOM作曲家
TCON流派TCOP版权
TDAT日期TENC编码
TEXT歌词作者TFLT文件类型
TIT2标题TIT3副标题
TLAN语言TLEN长度
TMED媒体类型TOWM文件所有者
TRCK音轨TSIZ大小
注释
1.帧内容是数字的,都用 Ascii 字符表示。
2.有的 TCON(风格、流派)的帧内容是直接用字符串表示的,如“genre”,而有的则是用编号表示的,如“28 31 32 29”就是用字符串“(12)”表示 12 号风格,我们在解析的时候要注意。
3.TRCK(音轨)的帧内容格式是:N/M。其中,分母表示专辑中共有 M 首歌曲,分子表示专辑中的第 N 首曲。

2.3 数据帧

2.3.1 编码方式:CBR与VBR

MP3有两种编码方式,一种是CBR,一种是VBR,前者是恒定码率,后者是可变码率。

恒定码率的帧大小是固定的,除去ID3V1与ID3V2,有效数据帧总长度为帧大小与帧数据的乘积,从而可算得MP3播放时长,跳播容易。一般有效数据帧第一帧即为音频数据,但也有例外,有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用"Info"来做CBR的标记。

VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing"这个关键字(也有用"Info"来标识的,现在很多流行的小软件也可以进行VBR压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的,也就是说,MP3数据帧如果是VBR编码,则第一帧是VBR帧。。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了 。[1]

CBR相关计算公式:
LayerII 与 LayerII
帧长 = (每帧采样次数 * 比特率 / 8 / 采样率) + 补白 
LayerI 
帧长 = (每帧采样次数 * 比特率 / 8 / 采样率) + 补白 * 4
CBR 总播放时长计算公式:
播放时长 = (文件大小 – ID3标签大小) * 8 / 比特率
​
VBR相关计算公式:
VBR 总播放时长计算公式:
播放时长 = 有效数据帧总帧数 * 每帧采样数 / 采样率 
每一帧的播放时长计算公式:
帧播放时长 = 采样数 / 采样频率 * 1000 毫秒

关于VBR帧、INFO帧、VBRI帧的结构与实例分析,参见参考文献[1],该文章对照着MP3二进制数据,解析了VBR帧与VBRI帧。另外也可以见附录1,引用自文献[1]。

2.3.2 有效音频数据帧

每个帧都有一个帧头,长度是四个字节,帧后面可能有2字节的CRC校验,取决于帧头的第16位,为0则无校验,为1则有校验,后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。

帧头结构

typedef FrameHeader
{
    unsigned int sync:11;                        //同步信息
    unsigned int version:2;                      //版本
    unsigned int layer: 2;                           //层
    unsigned int error protection:1;           // CRC校验
    unsigned int bitrate_index:4;              //位率
    unsigned int sampling_frequency:2;         //采样频率
    unsigned int padding:1;                    //帧长调节
    unsigned int private:1;                       //保留字
    unsigned int mode:2;                         //声道模式
    unsigned int mode extension:2;        //扩充模式
    unsigned int copyright:1;                           // 版权
    unsigned int original:1;                      //原版标志
    unsigned int emphasis:2;                  //强调模式
}HEADER;

帧头信息

帧头信息如下表所示,该图引用于博文[1]。

帧边信息(通道信息)

在帧头后边是Side Info(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。当解码器在读到上述信息后,就可以进行解码了。帧边信息解码的主要目的在于找出解这帧的各个参数,包括主数据开始位置,尺度因子长度等。帧边信息如下图所示。

3 解码原理

MP3音频解码可以用下图表示总体流程,具体可参见文档《mp3解码算法原理详解》

 

在博文《MP3解码详细过程》中,也有大概地论述MP3解码流程,如下所述:

PCM信号进行MP3压缩时,以1152个PCM采样值为单位,封装成具有固定长度的MP3数据帧,帧是MP3文件的最小组成单位。在解码时,利用数据帧里的信息就可以恢复出1152个PCM采样值。这1152个采样值被分为2个粒度组,每个粒度组包含576个采样值。一个MP3数据帧分为5个部分:帧头、CRC校验值、边信息、主数据、附加数据。

1 数据流的同步以及帧头信息的读取

MP3数据流的同步以帧为单位,每一帧的帧头都包含同步信息。这个同步信息是连续的12比特的‘1’组成。MP3音频解码过程中的第一步就是使解码器与输入数据流同步。在启动解码器后,可以通过搜索数据流中的12比特长的同步字来完成。在取得同步以后跟着的数据就是帧头信息,包括采样率、填充位、比特率等信息。

2 主数据的读取

在MP3编码过程中使用了比特池技术,所以当前帧的主数据不一定全部都在当前帧中,在解码过程中,必须结合主数据开始指针的值来确定主数据的开始位置。主数据包含的数据有缩放因子、哈夫曼数据及附加数据。这些字段在主数据中有固定的格式。

3 哈夫曼解码和反量化

在MP3编码过程中,根据心理声学模型的输出,对离散余弦变换的输出样本以粒度为单位进行的量化和分配,再对量化的结果进行哈夫曼编码。量化和编码主要是通过循环迭代完成的,循环模块分为三层来描述,最高层为帧循环,它调用外层迭代循环,而外层迭代循环又调用内层迭代循环。但在解码过程中,哈夫曼解码和反量化过程是分开实现的。每个粒度组的频率线都是用不同的哈夫曼表来进行编码的,因此在解码过程中,需要采用不同的解码方法。反量化频谱过程就是基于所得到的哈夫曼解码数据,根据逆量化全缩放公式和帧边信息,对于不同的窗类型采用不同的公式以恢复576个频率线的真实值。

4 立体声处理

5 重排序和反混叠

反量化过程中得出的频谱值不是按相同顺序排列的。在编码的MDCT过程中,对于长窗产生的频谱值先按子带然后按频率排列;对于短窗,产生的频谱值按子带、窗、频率的顺序排列。为了提供哈夫曼编码效率,短窗中的数据被重新排列,按照子带、频率、窗的顺序排列。解码时,重排序及时将短窗中的频谱值重新排列。同样,在编码的MDCT过程中,为了得到更好的频域特性,对长窗对应每个子带进行了去混叠处理,为了得到正确的音频信号,在解码时必须对长窗对应的子带进行混叠重建。

6 逆向离散余弦变换

逆向离散余弦变换主要是使用逆向离散余弦变换的公式,对反量化得出的信号进行变换。逆向离散余弦变换的计算十分复杂,为了提高效率,可以对计算做一些优化。

7 频率反转和子带合成

频率反转是对逆向离散余弦变换的输出值中的奇数号子带(0到31号子带中的1,3,5,...,31)中的奇数号样本值(每个子带中的0到17号样本值的1,3,5,...,17号样本值)进行反相处理,用来补偿编码时为提高离散余弦变换效率而进行的频率反转。子带合成滤波器将32个带宽相等的子带中的频域信号反变换成时域信号。子带合成是逆向离散余弦变换后的一个通道中32个子带的样值,经过一系列的计算还原出32个PCM数字音频信号的过程。子带合成过程先将32个子带样值进行逆向离散余弦变换,生成64个中间值,将这64个中间值转入到一个长为1024点的类似先进先出FIFO的缓存,再在这1024个值中抽取一半,构成一个512个值的矢量,再进行加窗运算,最后将加窗结果进行叠加生成32个时域输出。

4 常见问题

1.MP3的同步标识是什么?

“FF FA xx xx”或者“FF FB xx xx”

2.采样率有哪些?

在当今的主流采集卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。

3.MP3的编码原理大概是怎样的?

MP3音频压缩包含编码和解码两部分,编码是将原始信号转换成电平信号的过程,解码即是逆过程,MP3 采用了感知音频编码(PerceptualAudio Coding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。[1]

4.MP3一帧的时长是多少秒?一帧大小是多大?[1]

根据公式,帧时长=每帧采样数/采样频率,易知MPEG1 Layer3在44.1kHz的条件下:

帧时长=1152/4=0.026s

一帧数据的采样个数根据音频的Layer与MPEG标准不同而不同。如下表所示:

NoneMPEG 1MPEG 2(LSF)MPEG 2.5(LSF)
Layer 1384384384
Layer 2115211521152
Layer 31152576576

帧长度是压缩时每一帧的长度,包括帧头的4个字节。它将填充的空位也计算在内。Layer 1的一个空位长4字节,Layer 2和Layer 3的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化

计算公式如下:

Layer 1:Len(字节) = ((每帧采样数/8比特率)/采样频率)+填充4

Layer2/3:Len(字节) = ((每帧采样数/8*比特率)/采样频率)+填充

例:MPEG1 Layer3 比特率128000,采样率44100,填充0,帧长度为:((1152/8*128K)/44.1K+0=417字节

5.VBR头结构是怎样的?

VBR文件头位于MP3文件中第一个有效帧的数据区 ,引用自参考文献[1]。

6.ID3是怎么来的?

起初MP3并不能保存歌手名称、专辑名称、歌名、备注等附加信息,直到1996年,一个叫做Eric Kemp的人制作了Studio3软件,它可以在MP3文件的最后部分增加固定的128字节小块数据,用来记录音乐的信息。很快,MP3ext的作者Michael Mutschler又将这个标记进行了扩展,并正式将其命名为ID3,而且还使用注释的最后两个字节来记录CD和音乐的来源,其版本被定为ID3v1.1。不过ID3v1版本的限制太多,比如歌曲名长度被限制在30个英文字母,稍长一点的曲名就会被截掉,让人头痛不已。在这种情况下,它的升级版本ID3v2出现了。它首先解除了128个字节的限制,各个字段的长度也是弹性可变的,使可包含的音乐信息更为丰富,除了歌名、专辑名、演唱者外,还可保存歌词、均衡器设置、图片等信息。ID3v2的设计更灵活,扩展性更强,并且支持Unicode,因此歌词信息支持多语言。ID3v2甚至能包含一个文件,所以未来的MP3可能会附带有视频文件,让你不仅能听,还可以看。微软的Windows Midia Player就能很好地支持ID3v2,甚至在Windows XP中,你不需要打开任何播放器,只要进入一个存放MP3的文件夹,系统就能读取ID3v2的信息来对文件分类排列。

5 参考资料

1.《MP3文件结构解析》(https://blog.csdn.net/aigoogle/article/details/21384895)

2.《MP3解码算法原理详解》(https://wenku.baidu.com/view/0dc1c929647d27284b735149.html)

3.《MP3解码详细过程》(https://blog.csdn.net/aigoogle/article/details/21384895?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task)

6 附录[1]

6.1 VBR帧

 

标准声音帧头:Mp3时,为“FF FA xx xx”或者“FF FB xx xx”

36-39:Mp3的就是这种情况,第5至36的数据存储的是前面提到过的32字节的边信息,无效边信息时是32字节的“00”

45-48:帧数(包括第一帧)

VBR规模:VBR规模,用于位率变动音频质量指示,最差 0,最好 100,大端[可选]

举例说明: https://blog.csdn.net/xsjm206/article/details/6719958

曲子是:刘德华 - 虹桥机场的咖啡厅.mp3(5,898,130字节,时长3分14秒)

 

a. 第37至40地址为“58 69 6E 67”,就是“Xing”标志了;

b. 第41至44地址为“00 00 00 0F”,这里是Flag了,表示该帧存储了帧数、文件长度、目录表和VBR规模信息。

c. 第45至48地址为“00 00 1D 11”,这里是文件的总帧数(包括第一帧),是big-endia的,(116^3+1316^2+1*16+1)帧。

d. 第49至52地址为“00 59 FD DE”,这里是文件的总大小,也是Big-Endian的,(516^5+916^4+1516^3+1316^2+13*16+14)=5,897,694(字节)。

e. 第53至152地址,就是100字节的目录表了(称作TOC表),如图蓝色的部分。

TOC (Table of Contents)

TCO 索引的计算方式如下:文件长度 100 比如文件持续 240 秒,我需要跳到 60 秒,文件长度为 5000000 字节 计算如下TOC[(60/240)*100] =TOC[25] 然后相对于文件中的位置大约是在 (TOC[25]/256) * 5000000 如果要自己重建的话,基本是把这个步骤反过来做就可以了。要求准确的话,就需要根据时间点找到正确帧的位置然后再计算, 定位帧的做法都是从第一帧开始搜索。

f. 第153至156字节地址为“00 00 00 64”,,音频质量指示质量指示器,为 0(最好)-100(最差)的 Big-Endian 值,没想到这个文件的音质是最差的100。

g. 接下来是Lame版本的相关信息。

Info 帧

​ info帧,结构和Xing帧是相同的,从一些网上的资料显示:这种类型的帧有点怪,在CBR文件中的第一个数据帧可以是Info帧,在VBR文件中的第一个数据帧也有可能是Info帧。根据文章xx,第一个数据帧为Info帧的文件大概率是CBR文件,比如Kugoo软件制作的铃声的第一帧都是Info帧,而且是CBR文件。

VBRI帧

据了解,目前此头信息,只有用 Fraunhofer 的编码器生成的 MPEG音频文件,才会用到此头。其和Xing 头不一样,其放在第一个MPEG头的后面,大小正好是 32字节。其位置,长度和示例,都是以字节为单位。下表是 VBRi 头的具体格式及含义,单位为字节:

位置(字节)长度(字节)含义示例
044个 ASCII字符的 VBR 头ID: “VBRI”无NULL结尾VBRI
42版本 ID,大端,类型:DWORD00 01
62延迟,类型:float0D B1
82音频质量指示00 64
104文件总大小,大端,类型:DWORD00 5F 09 68
144总的帧数,大端,类型:DWORD00 00 26 8C
182TOC 表的表项数目,大端,类型:WORD00 9A
202TOC 表项的缩放因子,大端,类型:DWORD00 02
222单个 TOC 表项的大小,单位字节,最大为 4,大端,类型:DWORD00 02
242帧数/表项,大端,类型:WORD00 40
26 用于检索的 TOC 表,整型值,可以通过每个表项大小乘以表项个数得到此TOC 表的总大小,大端9A * 02 = 0X134

如下图所示,蓝色部分包括了4个字节的帧头,32个字节的空字节,以及26个字节的不包括TOC表的VBRI帧内容。从地址0x6BC开始,0x6BC--0X6BF为VBRI字符。从0X6D7至0X80A为TOC表内容。文件总大小为0X5F0968字节,不包括ID3与TAG,也就是说,如果用HXD看整个文件的大小,实际上是大于0X5F0968字节的。

6.2 MPEG 音频版本表

indexcontent
00MPEG 2.5
01reserved
10MPEG 2
11MPEG 1

6.3 比特率索引表(单位 Kbps)

Bitrate IndexMPEG 1MPEG 2,2.5   
 LayerILayerIILayerIIILayerILayerII&LayerIII
0000FREE    
0001323232328
00106448404816
00119656485624
010012864566432
010116080648040
011019296809648
01112241129611256
100025612811212864
100128816012814480
101032019216016096
1011352224192176112
1100384256224192128
1101416320256224144
1110448384320256160
1111FREE    

​6.4 采样率索引表

采样率索引MPEG-1 (Hz)MPEG-2 (Hz)MPEG-2.5 (Hz)
00441002205011025
01480002400012000
1032000160008000
11reservedreservedreserved

6.5 每帧数据的采样数

--MPEG 1MPEG 2 (LSF)MPEG 2.5 (LSF)
Layer I384384384
Layer II115211521152
Layer III1152576576

6.6 channel 模式表

indexcontent
00Stereo
01Joint Stereo (Stereo)
10Dual channel (Two mono channels)
11Single channel (Mono)

6.7 标签帧的标识以及其意义对照表

index   content
AENC    [Audio encryption]
APIC    [Attached picture]
COMM    [Comments]
COMR    [Commercial frame]
ENCR    [Encryption method registration]
EQUA    [Equalization]
ETCO    [Event timing codes]
GEOB    [General encapsulated object]
GRID    [Group identification registration]
IPLS    [Involved people list]
LINK    [Linked information]
MCDI    [Music CD identifier]
MLLT    [MPEG location lookup table]
OWNE    [Ownership frame]
PRIV    [Private frame]
PCNT    [Play counter]
POPM    [Popularimeter]
POSS    [Position synchronisation frame]
RBUF    [Recommended buffer size]
RVAD    [Relative volume adjustment]
RVRB    [Reverb]
SYLT    [Synchronized lyric/text]
SYTC    [Synchronized tempo codes]
TALB    [Album/Movie/Show title]
TBPM    [BPM (beats per minute)]
TCOM    [Composer]
TCON    [Content type]
TCOP    [Copyright message]
TDAT    [Date]
TDLY    [Playlist delay]
TENC    [Encoded by]
TEXT    [Lyricist/Text writer]
TFLT    [File type]
TIME    [Time]
TIT1    [Content group description]
TIT2    [Title/songname/content description]
TIT3    [Subtitle/Description refinement]
TKEY    [Initial key]
TLAN    [Language(s)]
TLEN    [Length]
TMED    [Media type]
TOAL    [Original album/movie/show title]
TOFN    [Original filename]
TOLY    [Original lyricist(s)/text writer(s)]
TOPE    [Original artist(s)/performer(s)]
TORY    [Original release year]
TOWN    [File owner/licensee]
TPE1    [Lead performer(s)/Soloist(s)]
TPE2    [Band/orchestra/accompaniment]
TPE3    [Conductor/performer refinement]
TPE4    [Interpreted, remixed, or otherwise modified by]
TPOS    [Part of a set]
TPUB    [Publisher]
TRCK    [Track number/Position in set]
TRDA    [Recording dates]
TRSN    [Internet radio station name]
TRSO    [Internet radio station owner]
TSIZ    [Size]
TSRC    [ISRC (international standard recording code)]
TSSE    [Software/Hardware and settings used for
TYER    [Year]
TXXX    [User defined text information frame]
UFID    [Unique file identifier]
USER    [Terms of use]
USLT    [Unsychronized lyric/text transcription]
WCOM    [Commercial information]
WCOP    [Copyright/Legal information]
WOAF    [Official audio file webpage]
WOAR    [Official artist/performer webpage]
WOAS    [Official audio source webpage]
WORS    [Official internet radio station homepage]
WPAY    [Payment]
WPUB    [Publishers official webpage]
WXXX    [User defined URL link frame]

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值