H264参数SPS(序列参数集)和PPS(图像参数集)说明

音视频开发—H264 SPS 和 PPS 参数说明 H264 中SPS 和 PPS的一些主要参数参数说明 阅读详情

H264参数SPS(序列参数集)和PPS(图像参数集)说明

https://blog.youkuaiyun.com/heanyu/article/details/6191576

 

https://blog.youkuaiyun.com/H514434485/article/details/51063069

H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set)

对应H264标准文档 7.3.2.1 序列参数集的语法进行解析

 

H.264码流第二个 NALU是 PPS(图像参数集Picture Parameter Set)

对应H264标准文档 7.3.2.2 序列参数集的语法进行解析

 

H.264码流第三个 NALU 是 IDR(即时解码器刷新)

对应H264标准文档 7.3.3 序列参数集的语法进行解析

H2.64中I帧和IDR帧的区别

   I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。

  对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

 

在分离H.264码流的时候,直接存储AVPacket后的文件可能是不能播放的。

如果视音频复用格式是TS(MPEG2 Transport Stream),直接存储后的文件是可以播放的。

复用格式是FLV,MP4则不行。

经过长时间资料搜索发现,FLV,MP4这些属于“特殊容器”,需要经过以下处理才能得到可播放的H.264码流:

1.分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter(比特流过滤器)处理。有两种处理方式:

(1)使用bitstream filter处理每个AVPacket(简单)

把每个AVPacket中的数据(data字段)经过bitstream filter“过滤”一遍。关键函数是av_bitstream_filter_filter()。示例代码如下

 

上述代码中,把av_bitstream_filter_filter()的输入数据和输出数据(分别对应第4,5,6,7个参数)都设置成AVPacket的data字段就可以了。

需要注意的是bitstream filter需要初始化和销毁,分别通过函数av_bitstream_filter_init()和av_bitstream_filter_close()。

 

经过上述代码处理之后,AVPacket中的数据有如下变化:

*每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}

*每个IDR帧数据前面添加了SPS和PPS

 

(2)手工添加SPS,PPS(稍微复杂)

将AVCodecContext的extradata数据经过bitstream filter处理之后得到SPS、PPS,拷贝至每个IDR帧之前。下面代码示例了写入SPS、PPS的过程。通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。

具体代码如下:

 

拷贝4个字节(0x00000001)

当封装格式为MPEG2TS的时候,不存在上述问题。

2、SPS和PPS

SDP中的H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。

3、相关函数介绍

(1)av_bitstream_filter_init

输入参数:比特流过滤器的名字

输出参数:根据比特流过滤器的创建并初始化一个比特流过滤器的上下文。

(2)av_bitstream_filter_filter

参数1:比特流过滤器的上下文

参数2:avcodeccontext输出流的编码器上下文.。

参数3:指定筛选器配置的参数,可能为空. 

参数4:指针被更新以指向过滤缓冲区. 

参数5:指针以字节形式更新到已过滤的缓冲区大小. 

参数6:包含数据到过滤器的缓冲区 

参数7:在字节缓冲区大小 

参数8:设置为非零,如果缓冲区对应于一个关键帧数据包

1、学习路线

step1、初步了解h264,了解h264数据帧分类和识别

step2、h264语法相关算法解析,这里对理解h264的视频帧很重要。通俗的说h264数据定义是由一组Bit组成,但是某个字段不是固定专有几个bit,它是根据其值通过算法转义保存。

step3、sps、pps帧语法定义
2、h264简介

     在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL占一个字节。

    NAL单元(NALU):NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。 数据流是储存在介质上时: 每个NALU 前添加起始码:0x00000001(或者0x000001),用来指示一个 NALU的起始和终止位置。我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。

    编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:

0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解码器检测到0x000003时,把03抛弃,恢复原始数据(脱壳操作)。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。

NALU头由一个字节组成, 它的语法如下:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
F: 1 个比特.
  forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
NRI: 2 个比特.
  nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心
这个属性.
Type: 5 个比特.
 nal_unit_type. 这个 NALU 单元的类型. 简述如下:
0    没有定义
1     一个非IDR图像的编码条带 (bp帧)
slice_layer_without_partitioning_rbsp( )     
2     编码条带数据分割块A
slice_data_partition_a_layer_rbsp( )     
3     编码条带数据分割块B
slice_data_partition_b_layer_rbsp( )     
4     编码条带数据分割块C
slice_data_partition_c_layer_rbsp( )     
5     IDR图像的编码条带 (i帧)
slice_layer_without_partitioning_rbsp( )     
6     辅助增强信息 (SEI)
sei_rbsp( )     
7     序列参数集 (sps帧)
seq_parameter_set_rbsp( )     
8     图像参数集
pic_parameter_set_rbsp( pps帧)     
9     访问单元分隔符
access_unit_delimiter_rbsp( )     
10     序列结尾
end_of_seq_rbsp( )     
11     流结尾
end_of_stream_rbsp( )     
12     填充数据
filler_data_rbsp( )     
13     序列参数集扩展
seq_parameter_set_extension_rbsp( )     
14...18     保留     
19     未分割的辅助编码图像的编码条带
slice_layer_without_partitioning_rbsp( )     
20...23     保留     
24    STAP-A   单一时间的组合包
25    STAP-B   单一时间的组合包
26    MTAP16   多个时间的组合包
27    MTAP24   多个时间的组合包
28    FU-A     分片的单元
29    FU-B     分片的单元
30-31 没有定义

当遇到 00 00 00 01 67表示sps帧

当遇到 00 00 00 01 68 表示pps帧
3、h264语法相关算法解析
1、无符号指数哥伦布熵编码
1.1 编码过程

1、将待编码的数加1转换为最小的二进制序列(假设一共M位);
2、此二进制序列前面补充M-1个0;
3、enjoy!
1.1.1 示例

对 4 进行无符号指数哥伦布熵编码
1、将4加1(为5)转换为最小的二进制序列即 101 (此是M=3)
2、此二进制序列前面补充M-1即两个0
3、得出的4的无符号指数哥伦布熵编码的序列为 00101
1.2 解码过程

1、获取二进制序列开头连续的N个0
2、读取之后的N+1位的值,假设为X
3、X-1获取解码后的值
1.2.1 示例

如对 00101进行无符号指数哥伦布熵解码
1、获取开头连续的N个0, 此时N = 2
2、再向后读取N+1位的值,即 101,为5
3、 5 - 1 =4 获取其解码后码值,enjoy!
1.3 其他

注意0的无符号指数哥伦布熵编码的二进制序列为 1
2 有符号指数哥伦布熵编码
2.1 编码过程

1、将待编码的数的绝对值转换为最小的二进制序列(假设一共M位)
2、在此二进制序列后补充一位符号位0表示正,1表示负
3、在此二进制序列前补充M个0
4、enjoy
2.1.1 示例1

如对4进行有符号指数哥伦布熵编码
1、4的绝对值转为最小二进制序列,即 100 (此时M = 3)
2、后面补充符号位,0 即 1000
3、前面补充M个0, 即 0001000
4、enjoy
2.1.2 示例2

如对-15进行有符号指数哥伦布熵编码
1、-7的绝对值转为最小二进制序列,即 1111 (此时M = 4)
2、后面补充符号位,1,即 11111
3、前面补充M个0,即 000011111
4、enjoy
2.2 解码过程

1、获取二进制序列开头连续的N个0
2、读取之后的N位的值,假设为X
3、获取最后1位符号位
4、获取解码后码值
2.2.1 示例1

如对二进制序列 0001000 进行有符号指数哥伦布熵解码
1、获取开头连续的N个0, 此时N = 3
2、再获取N为数值,即 100 即为4
3、获取最后的符号位,0,即为正值
4、故此序列解码后的码值为4
2.2.2 示例2

如对二进制序列 000011111 进行有符号指数哥伦布熵解码
1、获取开头连续的N个0, 此时N = 4
2、再获取N为数值,即 1111 即为15
3、获取最后的符号位,1,即为负值
4、故此序列解码后的码值为-15

 
4、sps语法

 
5、pps语法

 

 
---------------------  
作者:yuanbinquan  
来源:优快云  
原文:https://blog.youkuaiyun.com/yuanbinquan/article/details/60148345?utm_source=copy  
版权声明:本文为博主原创文章,转载请附上博文链接!

EasyPusher手机直播之SPS/PPS、关键帧的判断 最近遇到使用EasyPusher推送视频的时候发现播放的时候只有声音没有画面,这个很奇怪,刚开始以为是手机不兼容的原因,后来在同一部手机上也出现了这种情况,然后就思考了变量在哪儿导致的问题,我修改了分辨率,之前640x480是有画面的,现在修改为320x240就不行了,就跟踪了一下解码后的数据,发现原来问题出在关键帧以及SPS/PPS判断上了。 之前判断://outData是编码器编码后的数据帧 阅读详情

相关推荐

【ffmpeg】SPS与PPS的概念

PPS(图像参数集)和SPS(序列参数集)是H.264/H.265视频编码标准中的关键数据结构,分别存储单帧图像和整个视频序列的解码参数。

Bl_a_ck的博客 2475

H.264 SPS、PPS详解

h.264 sps pps详解

weixin_39399492的博客 8191

ffmpeg学习 编码为h264裸流添加sps、pps

在h264流中,有两种NALU极其的重要,序列参数集(Sequence Paramater Set,SPS)和图像参数集(Picture ParamaterSet,PPS)。 SPS中的信息至关重要,记录了编码的prfile、level、图像宽高等,如果其中的数据丢失或出现错误,那么解码过程很可能会失败。每一帧编码后数据所依赖的参数保存于PPS中。 一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。封装文件一般进保存一次,位于文件头部,而对于实时流,通常是从流中间开始解码,因此需要在每个I

热爱生活,忠于自己 6517

h.264中的SPS和PPS

​ 在H.264流中,有两种NALU极其重要,H264码流可以分为两层,VCL层和NAL层,NAL的全称是Network abstractionlayer,叫网络抽象层,它保存了H264相关的参数信息和图像信息,NAL层由多个单元NALU组成,NALU由了NALU头(00 00 00 01或者00 00 01)、sps(序列参数集)、pps(图像参数集合)、slice、sei、IDR帧、I帧(在图像运动变化较少时,I帧后面是7个P帧,如果图像运动变化大时,一个序列就短了,I帧后面可能是3个或者4个

thehunters的专栏 5357

H264 Bitstream Structure

The。

菜鸡搞计算机 64

【清华大学软院】15-19年推免试题历年整理

整理的题目为清软预推免机试(外校)硕士机考题目。 年代 题目1 题目2 题目3 2019 质因数分解 二叉搜索树 区间DP(折叠字符串) 2018 日期转换 高精度模拟 区间DP(戳气球) 2017 进制素数 被遗漏的数字 DP(收集苹果) 2016 大数运算 DP DFS 2015 进制素数: http://acm.hdu.edu.cn/showproblem.php?pid=1230 2017年题目(这个是找的最准确的题目): 1题见【链接】 2题见【链接】

云端筑梦师 2257

MP4文件中h264的 SPS、PPS获取

MP4文件中h264的 SPS、PPS获取

m0_73443478的博客 686

VH6501实战:手把手教你用CANoe脚本精准触发CAN总线干扰(附避坑点)

本文详细介绍了使用VH6501和CANoe脚本精准触发CAN总线干扰的实战技巧,包括触发位置控制、ValidityMask配置和干扰序列设置等关键步骤。通过具体代码示例和常见问题排查指南,帮助工程师避开实际应用中的常见陷阱,提升CAN总线干扰测试的准确性和效率。

weixin_33709219的博客 371

05-编码篇-H264文件分析

一般情况下,一帧图像包括多个切片,一个切片又包括切片头和切片数据,一个切片数据是由多个宏块Macroblock构成,宏块又包括宏块类型、预测类型、CPB、QP和宏块数据,而宏块数据是就是YUV的颜色分量。在一个h264视频中,最前面的数据是起始码,起始码是在NALU头部之前,假如NALU对应的Slice为一帧的开始,用十六进制00,00,00,01四个字节表示,否则用00,00,01的三个字节表示。通过前面的分析,我们可以看出常规情况下,是将视频以帧的单位进行处理,比如I帧,P帧,B帧等。

sishen4199的博客 1252

养龙虾经验:OpenClaw用户必看的3个“省token”救命配置

本文分享了3个优化OpenClaw使用成本的配置方案:1)启用上下文压缩功能,可选择全局或单个代理设置,支持safeguard/adaptive两种压缩模式;2)修改SOUL.md提示词,要求模型回答简洁直接;3)限制对话历史长度。方案一效果最佳,可减少长对话的token消耗,但可能影响连贯性。三种方案可单独或组合使用,需根据实际场景调整参数。文章最后邀请读者分享使用痛点,将针对高频问题撰写解决方案。

wpplvhq的专栏 1418

软考中级信息系统监理师(第二版)-第21章基础设施工程监理

由于网络信息技术的飞速发展,变化日新月异,网络设计不但要保证目前网络传输容量的要求,也要考虑今后网络的发展,满足当前以及今后相当一段时间内的网络需求,便于向新技术的升级和衔接,同时又需要保护原有的投资。通用布缆系统工程中,承建单位的竣工文档主要包括以下内容:承建合同,招标文件,投标文件,设计方案,工程实施组织设计方案,工程施工报告,隐蔽工程记录,变更记录,自测报告,信息点分布图(表),园区、楼宇、水平配线表,楼层平面图及无线设备点位图,无线设备信息表,竣工图纸等。多排安装时,列间距不应小于1200mm。

2301_78583973的博客 1402

H264格式 详细介绍

原文地址:http://blog.youkuaiyun.com/yangzhongxuan/article/details/8003494 名词解释 场和帧 :    视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。 片:             每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。

phymat.nico的专栏 1万+

机器学习 线性回归 头歌实训

第1关:简单线性回归与多元线性回归 第2关:线性回归的正规方程解 第3关:衡量线性回归的性能指标 第4关:scikit-learn线性回归实践 - 波斯顿房价预测

weixin_57270536的博客 1万+

h264 I帧的判断

From:http://blog.youkuaiyun.com/dxpqxb/article/details/13289205 H264数据的NALU 头的格式如图2 所示:                                                                                                               

JoeBlackZQQ的专栏 3599

C#上位机+国产PLC+AI:构建自主可控的智能生产线解决方案

全栈国产化智能产线方案并非遥不可及,基于成熟的国产硬件、丰富的.NET生态、快速发展的国产大模型,完全可以搭建出稳定可靠且具备智能能力的生产系统。落地建议采用三步走策略:基础国产化阶段:替换PLC与上位机,实现基础监控与控制功能,解决卡脖子问题,快速验证国产化方案稳定性数据沉淀阶段:完善数据采集与存储,建立设备台账、故障库、工艺库,积累高质量领域数据智能升级阶段:引入国产大模型与知识库,落地故障诊断、工艺优化、预测性维护等智能应用,持续提升产线效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 525

构建基于知识图谱的金融风险关联网络可视化系统

知识图谱是一种用于表示实体及其关系的图形结构,能够将分散的数据组织成易于理解和查询的形式。语义性:通过实体和关系的描述,赋予数据语义。结构化:以图的形式组织数据,便于计算机处理。动态性:支持实时更新,能够反映数据的最新状态。风险关联网络是指将金融风险事件、实体及其关系以图形形式表示的网络。关联性:能够展示风险事件之间的相互影响。动态性:能够实时反映风险变化。可视化:便于金融从业者直观理解风险分布。可视化系统是指通过图形界面展示数据或信息的系统。提供直观的数据显示。帮助用户快速理解复杂数据。

AI天才研究院 1061

H264编解码SPS、PPS参数说明

H264编解码参数说明一、H264码流分层1、NAL层2、 VCL层3、 码流基本概念①、 SODB(String Of Data Bits)②、 RBSP(Raw Byte Sequence Payload)③、 NALU 单元SPS/PPS/Slice Header二, SPS中两个重要的参数分别是 Profile 与 Level1、 H264 Profile2、 H264 Level3、 分辨率4、 帧相关的①、 帧数 log2_max_frame_num_minus4②、 参考帧数 max_num_

永远积极向上、永远热泪盈眶、永远豪情满怀、永远坦坦荡荡 9418

深入探讨:StoreKit 2的交易处理与收据验证

iOS应用开发中,StoreKit 2带来收据处理和交易验证的新变化。本文通过实例分析,对比传统StoreKit与StoreKit 2的差异,指出直接访问sandboxReceipt文件可能引发错误。解决方案是使用Transaction对象和SKReceiptRefreshRequest,详细介绍了如何初始化ReceiptLoader、处理交易更新及验证收据的完整流程,帮助开发者适应新框架,确保购买流程安全可靠。

m0_74337424的博客 358

sps和pps一篇好的解释

H264码流中SPS PPS详解<转> 转载地址:https://zhuanlan.zhihu.com/p/27896239   1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如...

luzubodfgs的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

H264码流中SPS PPS详解

来源:H264码流中SPS PPS详解 - 知乎 1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示: 在这里我们可以看到对解码视频起关键作用的SPS和PPS。 双击SPS内容如下: 双击PPS内容如下: 那么从上面的sps中我们知道图像的宽,高。 宽=(19+1 )*16=320

smartDMer的专栏 6557

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

h264bitstream高级应用:如何修改H.264视频序列参数集(SPS)与图像参数集(PPS)

**h264bitstream**是一个功能强大的C语言库,专门用于读取和写入H.264视频比特流,特别是用于检查和修改视频头部信息。如果你是视频处理开发者或需要对H.264视频进行深度分析,掌握这个库的SPS和PPS修改技巧将大大提升你的工作效率。🎯 ## 📊 什么是SPS和PPS? 在深入了解h264bitstream的修改技巧之前,我们先来快速了解一下这两个关键概念: | 参数集类

gitblog_01042的博客 982

H264码流解析(三):解析SPS和PPS

上两篇里面写了划分NALU和指数哥伦布编码,这一篇主要写解析SPS和PPS。 1、下载bs.h头文件 下载bs.h头文件,并在项目中使用 2、解析SPS 先看SPS的结构,再7.3.2.1.1里面包含了SPS结构的介绍 其中scaling_list函数在7.3.2.1.1.1里,如图所示 vui_parameters函数在E1.1里,如图所示 hrd...

yp18792574062的博客 6858

H264参数语法: SPS、PPS

牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两

三少GG 3万+
上一篇: 《数据结构与算法分析》学习笔记
下一篇: H264知识总结
zero_china
博客等级 码龄16年 10粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值