音视频开发之音频编码原理

从零构建:如何在VSCode中为HBuilderX迁移的UniApp项目搭建TypeScript支持环境 本文详细指导如何将HBuilderX中的UniApp项目迁移至VSCode并搭建TypeScript支持环境。通过pnpm包管理器初始化项目、配置tsconfig.json和vite.config.ts文件,实现工程化迁移与TypeScript深度集成,提升开发效率和代码质量。 阅读详情

音频编码原理

本篇博客为面向大众的科普性文章。涉及声音原理、音频文件属性、音频格式等方面。预计阅读时间为10分钟。

1.何为声音

中学物理中我们知道,声音是物体振动产生的声波。声音通过介质(空气、固体、液体)传入到人耳中,带动听小骨振动,经过一系列的神经信号传递后,被人所感知。

声音是一种波。物体振动时会使介质(如空气)产生疏密变化,从而形成疏密相见的纵波。

既然声音是波,那么我们就可以用图的形式来表示它。

给定空间中某一点,该点的空气疏密随时间的变化如下:

img波形图

下图是一个正弦波,其周期为0.002s,频率为500HZ。

img

该声音很像视频中的“消音”处理。

频率(音调):声音1秒内周期性变化的次数

人耳的听觉范围在20Hz-20kHz。 低频的声音沉闷厚重,高频的声音尖锐刺耳。 高于 20kHz的声音为超声波。

振幅(响度):声音的大小

有的时候,我们用分贝(dB)形容声音大小。值得注意的是,dB是一个比值,是一个数值,没有任何单位标注。(功率强度之比的对数的10倍)

img

  • 音调:声音频率的高低叫做音调(Pitch),是声音的三个主要的主观属性,即音量(响度)、音调、音色(也称音品) 之一。表示人的听觉分辨一个声音的调子高低的程度。音调主要由声音的频率决定,同时也与声音强度有关

  • 音量:人主观上感觉声音的大小(俗称音量),由“振幅”(amplitude)和人离声源的距离决定,振幅越大响度越大,人和声源的距离越小,响度越大。(单位:分贝dB)

  • 音色:又称声音的品质,波形决定了声音的音色。声音因不同物体材料的特性而具有不同特性,音色本身是一种抽象的东西,但波形是把这个抽象直观的表现。音色不同,波形则不同。典型的音色波形有方波,锯齿波,正弦波,脉冲波等。不同的音色,通过波形,完全可以分辨的。

波长越长

同等条件下,波长(频率)是决定音调高低的因素。

图片

同等条件下,振幅是决定音量高低的因素。

图片

同等条件下,波纹是决定音色因素。

图片

通过上面简单的分析,我们已经知道声音的音量实际上就是由声波的振幅决定的,我们需要调整声波的振幅。播放一个视频,需要经历下面几步:

  • 输入视频url
  • 确定视频的封装格式
  • 开始解封装
  • 识别视频的轨道数据
  • 分离轨道数据,音频轨道、视频轨道
  • 解码视频数据为原始数据,解码音频数据为原始数据
  • 做好音视频同步
  • 渲染视频原始数据,播放音频原始数据

通道数 麦克风

上面加黑标红的部分就是我们改变声音振幅的地方,只有将声音数据解码为原始数据,我们加工原始数据的音频流,然后送到AudioTrack或者OpenSL ES内部播放即可。

2.声音采集与存储

采样,指把时间域或空间域的连续量转化成离散量的过程 。

对声音的采样常用麦克风等设备将声音信号转换成电信号,再用模/数转换器将电信号转换成一串用1和0表示的二进制数字(数字信号)。

我们每秒对声音采样上万次,获得上万个按照时间顺序排列的二进制数字。于是,我们就将连续变化不断的声音转化成了计算机可储存并识别的二进制数字。

:

该声音由84700个不同的数字组成。 其中的一段数字如下:(二进制数字已转换为十进制)

… 413, 263, 137, 15, -124, -253, -369, -463, -511, -545, -587, -632, -678, -701, -687, -659, -623, -579, -539, -473, -380, -282, -162, -35, 78, 211, 341, 430, 499, 548, 551, …

如果用图像的形式表示该音频,则图像如下:(横轴是时间,纵轴为振幅,两个图像分别代表左右声道。由于声音频率较大,所以在图像中的信号不是“正弦”,而是实心的。)

img

2.1 采样频率

采样频率指录音设备在一秒钟内对声音信号的采样次数。采样频率越高,声音的还原就越真实越自然。

目前主流的采样频率有22.05KHz、44.1KHz、48KHz三种。

22.05 KHz为FM广播的声音品质,44.1KHz为理论上的CD声音品质。48KHz为人耳可辨别的最高采样频率。

直观理解:一段连续的声音如下

img一段声音

我们等间隔地对其采样

img

最终,我们真正采样到的音频如下

img

如下图可见,采样频率越高,我们获得的声音品质越好。

img

2.2 量化位数

我们不可能获得所有时间下声音的强度,因此声音是等时间间隔、离散采样的。同样,采样获得的数据不可能无限的精确,如数字为63.2222222….,这无法在计算机中储存。因此,采样获得的数据同样也是离散的。

量化位数是音频文件的另一个参数。量化位数越大,声音的质量越高。常用的量化位数有8位、16位和32位。

量化位数指用几位二进制数来存储采样获得的数据。量化位数为8即指用8位二进制数来存储数据,如00010111

还是之前的例子,有一段正弦声波,假设量化位数为3,即存储的数据只有000/001/010/011/100/101/110/111这8种可能。

img

现在,还是等距离采样,不过采样的点只能落在最近的红线上。

img

此时,每个点纵坐标的取值只有二的三次方,即只有8中可能。

img

由下图可见,量化位数越大,声音效果越好。

img

另外值得注意的是,不同量化位数存储的数据不可直接比较。

如4位量化位数存储的1111,其十进制是15,8位量化位数存储的10000000,其十进制是64。不是因为64>15,所以后者对应的声音比前者大。而是应该二者分别除以其总取值范围后在比较。

img

前者对应的声音比后者大。

2.3 声道数

声道分为单声道与双声道。

单声道即为左右耳听到的声音相同。

双声道两耳听到的信息不同。相同的声音时间、采样频率和比特率的情况下,双声道文件的存储空间是单声道的两倍。但其会给人空间感,游戏和电影中常采用双声道,可达到“听声辨位”的效果。

示例声音如下:

img

3 采样频率

采样定理在1928年由美国电信工程师H.奈奎斯特首先提出来的,因此称为奈奎斯特采样定理。

1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理,因此在苏联文献中称为科捷利尼科夫采样定理。

1948年信息论的创始人C.E.香农对这一定理加以明确地说明并正式作为定理引用,因此在许多文献中又称为香农采样定理。

​ 奈奎斯特采样定理解释了采样率和所测信号频率之间的关系。 阐述了采样率fs必须大于被测信号感兴趣最高频率分量的两倍。

该频率通常被称为奈奎斯特频率fN。即:

奈奎斯特采样定理

  fs >= 2fH

根据奈奎斯特采样定理,需要数字化的模拟信号的带宽必须被限制在采样频率fs的一半以下,否则将会产生混叠效应,信号将不能被完全恢复。这就从理论上要求一个理想的截频为fs/2的低通滤波器。实际中采用的通频带为0fs/2的低通滤波器不可能既完全滤掉高于的fs/2的分量又不衰减接近于fs/2的有用分量。因此实际的采样结果也必然与理论上的有差别。如果采用高于fs的采样频率,如图1中为2fs,则可以很容易用模拟滤波器先滤掉高于1.5fs的分量,同时完整保留有用分量。采样后混入的界于0.5fs1.5fs之间的分量可以很容易用数字滤波器来滤掉。这样输入模拟滤波器的设计将比抗混叠滤波器简单的多。

为更好理解其原因,让我们来看看不同速率测量的正弦波。

1. 假设 fS = fN

img

可以看出,无论我们从哪一点开始采样,每次采集到的数据都是一样的,对应的频率成分为0Hz。

2. 假设 fS = (4/ 3) * fN

img

以上采样到的曲线仍然无法还原原有波形的样子。

3. 假设 fS = 2 * fN

img

如上图,将这些采样点连成线条,得到的信号形状为三角波,虽然信号的频率成分没有失信,但是很难保证信号的幅值不失真。因为这两个采样点很难位于正弦信号的波峰与波谷处。也就是说,在很大程度上,采样后的信号的幅值是失真的。

我们再考虑如下情况:

假设一条正弦曲线为sin(2π/t),频率为1Hz。我们以2Hz的频率对该曲线进行采样(每隔0.5s),可以得到3个红色采样数据,如下图:

img

对于这三个点,我们不能确定它对应的正弦曲线是sin(2π/t),因为sin(4π/t)等倍频曲线也会穿过这三个红色采样点:

img

混叠

如果信号的采样率低于两倍奈奎斯特频率,采样数据中就会出现虚假的低频成分。 这种现象便称为混叠。

下图显示了800 kHz正弦波1MS/s时的采样。虚线表示该采样率时记录的混叠信号。 800 kHz频率与通带混叠,错误地显示为200 kHz正弦波。

img

绝大多数信号都是能够进行傅里叶变换的,就意味着,不管一个信号多么复杂,总可以分解为若干个正(余)弦信号的和,对应了信号的频率分量。因此,Nyquist采样定理只需找到信号最大的频率分量,再用2倍于最大频率分量的采样频率对信号进行采样,从理论上解决了,离散信号能够重建出连续信号的问题。

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码) 本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。 阅读详情

相关推荐

详解从无人机倾斜实景三维建模→模型修复→成果网络发布展示分享全流程

1、倾斜实景三维建模软件:CC(Smart3D)软件2、实景三维模型网页在线发布展示、分享平台:图新地球网页端(Wish3D·Earth平台)图新地球网页端(Wish3D·Earth平台)是基于 WebGL技术研发的国产实景三维模型Web端发布展示平台,可实现TB级倾斜实景三维数据快速加载,支持多种格式的三维模型,如OSGB实景模型、OBJ人工模型、SKP人工模型、RVT格式BIM模型等,同时支持模型单体化、三维模型测量分析、水面特效、日照分析等特殊效果呈现,此外也可以根据您的需要进行本地化部署级功能定制。

GISWorld3D的博客 4370

音频属性采样率、通道数、位数、比特率、帧等

【音频】 指人耳可以听到的声音频率在20HZ~20kHz之间的声波,称为音频。 【采样频率】 来源:音频采样,是把声音从模拟信号转换为数字信号。 定义:采样率,就是每秒对声音进行采集的次数,同样也是所得的数字信号的每秒样本数。 常用的采样率有: 8,000 Hz - 电话所用采样率, 对于人的说话已经足够 11,025 Hz - AM调幅广播所用采样率 22,050 Hz和24,000 Hz - FM调频广播所用采样率 32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mo

Joseph__Lagrange的博客 1万+

泛微OAe9-自定义资源看板

OA中,有一个很好用的功能:会议室预约。对于一间设立的会议室,同一时间段内,肯定会有不同的人预约同一间会议室,并且,在资源看板里,能看清各个时间段会议室的占用情况,可是会议室资源是有限的,显然不可能让多个人在同一时间段内预约同一间会议室,如会议室已占用,其他人再次申请时,应当拒绝预约。

小松鼠的博客 1841

语音处理/语音识别基础(二)- 声音的存储

本文总结声音的存储,对如下问题做出回答。 1.声音有哪些属性? 2.声音转换成电脑文件(wav/mp3)的过程是怎么样的? 3.PCM格式的音频文件和WAV格式文件的内容有什么差异? 声音是物体振动产生的声波。声音通过介质(空气、固体、液体)传入到人耳中,带动听小骨振动,经过一系列的神经信号传递后,被人所感知。 声音是一种波。物体振动时会使介质(如空气)产生疏密变化,从而形成疏密相间的纵波。 频率(音调):声音1秒内周期性变化的次数 人耳的听觉范围在20Hz-20kHz。 低频的声音沉

千里之行 7853

SDK报错(1)undefined reference to `f_mount‘

按文中说法是ff.c文件中用了一个if语句来判断是否启用ff.h头文件,但是却没有地方进行宏定义来满足这个if条件。利用SDK读取sd卡时,添加了xilffs库,而且包含了ff.h头文件,还是对fat库的函数报错。网上有的说在ARM v7 gcc linker中添加xilffs的方法可以解决,但我试了没有用。如下图,我们可以在ff.c中自己添加一个宏定义来实现这个条件。最后在赛灵思论坛找到了一个解决方法,原文连接如下。这时候保存编译之后,报错就消失了。ff.c 文件在bsp工程下。

EfunStudy的博客 1472

【气动弹性实战】基于Nastran与Patran的机翼颤振仿真:从模态分析到临界速度预测

本文详细介绍了基于Nastran与Patran的机翼颤振仿真全流程,从气动弹性问题解析、机翼建模技巧到模态分析与临界速度预测。通过实战案例展示如何利用SOL 145求解器进行颤振分析,并分享网格划分、材料属性设置等工程经验,帮助工程师有效解决飞行器设计中的气动弹性耦合问题。

weixin_33725722的博客 589

数字音频的基本知识

数字音频基本知识1.声音2.声音的采集和存储3.参考 1.声音 声音是一种波形。 1)频率(音调):声音1秒内周期性变化的次数。人耳的听觉频率范围在20Hz-20kHz。 低频的声音沉闷厚重,高频的声音尖锐刺耳。 2)振幅(响度):声音的大小。通常使用分贝(dB)形容声音大小。dB是一个比值,是一个数值,没有任何单位标注。 2.声音的采集和存储 1)采样:将连续量转化成离散量的过程。对声音的采样常用麦克风等设备将声音信号转换成电信号,再用模/数转换器将电信号转换成二进制表示的数字信号。每秒对声音采样上万次,

weixin_50754041的博客 2736

【自监督学习完整教程】第 1 章:初识自监督学习

摘要: 自监督学习(SSL)是一种利用无标签数据自动生成伪标签进行模型训练的方法,有效降低了人工标注成本。本文对比了监督学习、无监督学习和SSL的差异,重点阐述了SSL通过设计PretextTasks(如图像旋转预测)从数据中提取深层特征的原理。实践部分以PyTorch实现图像旋转预测任务为例,展示了SSL的训练流程。实验表明,SSL能够学习通用视觉特征,适用于计算机视觉、自然语言处理等领域,尤其在标注数据稀缺的场景中表现优异。

u012133341的博客 257

数据存储——存储图像

简要介绍图像数字化的过程

qq_45562910的博客 3284

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:多旋翼无人机在风扰动下的稳定性分析

本文介绍了使用Simulink仿真多旋翼无人机在风扰动下稳定性的方法。通过构建包含飞行器动力学模型、PID控制系统和环境模拟模块的仿真系统,分析了无人机在不同风速条件下的飞行性能。详细说明了从创建模型、设置动力学方程、设计PID控制器到添加风扰动模型的完整流程,并提供了性能评估指标。该方法可用于验证控制系统有效性,优化飞行稳定性参数,为无人机控制系统的设计和调试提供参考。

MHD0815的博客 324

智能温室:温室环境监测_(7).土壤监测技术包括pH值和电导率

土壤的pH值是指土壤溶液的酸碱度,它对植物的营养吸收和生长发育有着重要的影响。在智能温室中,土壤监测是非常重要的一个环节,因为土壤的pH值和电导率直接影响植物的生长和健康。本节将详细介绍如何利用传感器和数据处理技术来监测土壤的pH值和电导率,并提供具体的代码示例。在智能温室中,监测到的土壤pH值和电导率数据需要传输到中央控制系统进行进一步的处理和分析。通过以上步骤,您可以构建一个完整的智能温室土壤监测系统,实时监控土壤的pH值和电导率,确保植物在最佳的生长环境中。校准通常包括在已知电导率的标准溶液中进行。

zhubeibei168的博客 1402

【音视频基础】音频编码原理

AAC前面有个数据头,一般是ADTS格式的头。对于直播系统,一般使用AAC,我们使用的都是ADTS格式。注意,读出来Audio Object Types值还需要加1,才是对应的类型。如果读出来Audio Object Types值是1,那么对应的是AAL LC类型。ADTS头解析网站PS:\1. 有时候我们无法播放一段AAC数据,可能是缺少了ADTS头信息,这是我们就需要想办法加上这个头信息。

C/C++Linux、音视频、DPDK 671

光学系统仿真软件:Finesse_(6).噪声分析与优化

在Finesse中,噪声源的定义可以通过在光学元件的参数中添加噪声项来实现。以下是一个简单的示例,展示了如何在激光器和反射镜中定义噪声源。# 定义噪声传递函数# 绘制噪声传递函数plot NTF1在这个例子中,定义了一个噪声传递函数NTF1,描述了激光器L1到反射镜M1的噪声传递过程。plot NTF1命令绘制了噪声传递函数的频谱图。# 定义耦合路径# 绘制耦合噪声频谱图plot C1在这个例子中,定义了一个耦合路径C1,描述了激光器L1和反射镜M1之间的噪声耦合关系。plot C1。

kkchenjj的博客 872

嵌入式音视频开发——音频编码原理

音频压缩编码技术通过去除冗余信号(如人耳无法感知的频率和被掩蔽的音频)来减小数据量。主要分为无损压缩(如FLAC、ALAC)和有损压缩(如MP3、AAC、Opus)。无损压缩保留所有原始信息,压缩比约2:1-3:1;有损压缩利用听觉特性去除次要信息,压缩比可达1/10以上。常见编码器包括OPLUS(OPPO专有,适用于蓝牙音频)和AAC(广泛兼容,音质优于MP3)。这些技术有效解决了嵌入式系统在存储和传输高数据量音频(如CD音质1.4Mbps)时面临的挑战。

abloun的博客 1262

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Android音视频开发】音频编码原理

在【Android音视频开发】 这一系列文章的开头,介绍一下音视频编码的原理是很有必要的,有利于对后续出现的概念的理解。此处先讲音频,视频编码的原理将在另一篇文章中讲述。

欢迎进入JesseAndroid的博客 2570

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

音视频开发:音频编码原理+采集+编码实战

音视频开发:音频编码原理+采集+编码实战

m0_73443478的博客 1245

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

即时通讯音视频开发(七):音频基础及编码原理入门

前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙。原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的。有关实时音视频开发时的技术难题请参见《音视频云声网Agora:从demo到实用,中间还差1万个WebRTC》:http://www.52im.net/article-119-1.html 本文是一篇讲述基础音频知识和编码原理的文章。 基础概念 比特率: 表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来.

qq_42795723的博客 897

音视频系统学习的浪漫马车之总目录

过去的一年,个人经历了很多事情,导致整个博客更新停滞了一年,今年,博客重新起航,并且重点将是音视频开发相关的系统博客系列,个人尽力将自己学习的知识以及学习过程的感悟和理解写在博客系列中,所谓独乐乐不如众乐乐,希望接下来至少一年的时间里,大家能够和我一同开启音视频开发的浪漫之旅,让音视频的马车带我们跑起来吧,以下是旅途计划站点(仅为大概,具体以实际更新为准)~ 首先是开胃菜,个人维护的一个音视频开源项目,系列文章讲到的知识点会运用到这个项目实战中,初学者可以通过此对音视频有点感觉,后续看系列文章也可以从该项目

易水南风的专栏 1820

即时通讯音视频开发(十五):聊聊P2P与实时音视频的应用情况

前言 随着移动互联网的快速发展以及智能终端性能的逐步提高,智能终端间进行实时音视频通讯成为移动互联网发展的一个重要方向。那么如何保证智能终端之间实时音视频数据通讯成为一个很现实的问题。 实际上,实时音视频通讯 = 音视频处理 + 网络传输。包括采集、编码、网络传输、解码、播放等环节。而网络传输是整个应用中非常重要的一环,基于当前网络带宽和服务端器资源的昂贵特性,通常情况下,实时音视频应用的网络通讯,都会结合P2P技术,从而大幅降低运营成本。 有关实时音视频开发时的技术难题请参见《音视频云声网Agora:.

qq_42795723的博客 1140

Android音视频架构-学习路线规划

接触Android音视频这一块已经有一段时间了,跟普通的应用层开发相比,的确更花费精力。期间为了学习音视频的录制,编码,处理也看过大大小小的几十个项目。总体感觉就是知识比较零散,对刚入门的朋友比较不友好。所以才萌生了写这个Android音视频系统文章的想法,虽然给自己挖了一个深坑,但是相信坚持下来必定能很好的提升自己。另一方面,系统的学习效果肯定要远好于零零散散的补充知识 先来看我自己总结的一个...

coding_man_xie的博客 3612

音视频开发入门基础知识(音频入门篇)

本文主要介绍音频开发中的基础知识。

u010140427的博客 1722

【Android音视频开发】【001】音视频格式和采集编码流程

这篇博客我们会讲解音视频从录制到播放的工作流程和原理,并涉及一些基本的音视频格式 声波的特征 音调:即通常说的高低音,本质是音波频率不同 音量:即通常说的声音大小,本质是音波强度不同 音色:即每个人的声音特色,取决于音调和音量的变化细节 从波形图观察声音特征 音调越高,波形越密集,代表频率高 音量越大,波形越高,代表强度大 音色不同,波形的形状不同,代表震动细节不一样 音频数据...

天天向上 Up Up Up (*^▽^*) 668

安卓音视频整理

这是关于安卓音视频的一个系列文章,大家可以从这里随意跳跃: 0.安卓音视频整理 1.安卓音视频整理(一)—— 音频模块 2.安卓音视频整理(二)—— 音视频编解码 3.安卓音视频整理(三)—— 图像模块 4.安卓音视频整理(四)—— 音视频播放器 5.安卓音视频整理(五)—— MediaSDK的封装 摘要:今天开始,我将会整理一下我在音视频开发中的一些知识积累,主要会包括 基础概念、音频模块、图像模块、音视频编解码、音视频播放器、MediaSDK的封装 这些内容。 本系列文章将会重点围绕上图的内

york2017的博客 746

音视频基础

通过 av_read_frame() 从媒体文件中获取得到的一个 packet 可能包含多个(整数个)音频帧或单个视频帧,或者其他类型的流数据。图像格式转换的目的,是为了解码后的视频帧能被 SDL 正常显示,因为FFmpeg解码后得到的图像格式不一定就能被SDL支持,这种情况下不作图像转换是无法正常显示的。:搜索流信息:读取一段视频文件数据,尝试解码,将读取到的流信息填入pFormatCtx->streams;音频:PCM->ACC数据,视频:YUV->H264,音视频封装:FLV / MP4。

阿东的学习记录 1666

35K的鸿蒙音视频开发岗位面经分享~

一个月前,阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的和 SDK,官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。此外,阿里云播放器 SDK 也在华为开发者联盟官网生态伙伴 SDK 专区同步上线,面向所有鸿蒙开发者免费开放。据悉,该产品是音视频领域首个适配 HarmonyOS NEXT 的 SDK。

maniuT的博客 2733

C++音视频流媒体开发面试题:音视频基础

音视频开发八股文面试题

hw5230的博客 1313
上一篇: 音频编码之aac编码原理
下一篇: 01.音视频开发之课程大纲_第1课
简@
博客等级 码龄13年 36粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值