【音视频第8天】mediasoup拥塞控制【未完待续】

【流媒体服务器Mediasoup】多人音视频架构、流媒体的比较、mediasoup介绍 (一) 目录 前言 多人音视频架构 流媒体服务器的比较 Mediasoup流媒体服务器架构及特点 前言 WebRtc有两种含义,其一是Google开源的流媒体实时通讯客户端,主要运用于浏览器之间的实时通讯,当然也可以通过提取完成移动端,PC端的通讯;另外WebRtc也是一套规范,这套规范只对客户端做了定义,如客户端应该是一种什么行为,应该是一种什么样的流程... 阅读详情

WebRTC的拥塞控制方式主要有以下几个:Transport-cc、BBR-congestion、remb(BBR已被google从webrtc移除了)。mediasoup支持Transport-cc和remb。

一、前言

实时通信的延时指标

在这里插入图片描述

视频服务质量指标

在这里插入图片描述
音视频服务质量与带宽之间的矛盾、实时性与服务质量之间存在矛盾

提高服务质量的因素

在这里插入图片描述

影响网络质量的因素

影响网络质量的因素
丢包率(重点)
延时拥塞有关)
抖动(JitterBuffer、NetEQ)
乱序(JitterBuffer、NetEQ )

链路质量差、带宽满、主动丢包、光纤被挖
解决丢包的方法:NACK、FEC。如果RTT很长就不要用NACK,就用FEC。带宽充足的情况下可以用FEC,但是丢包因为网络拥塞不能用FEC,会加重拥塞。
NACK
在这里插入图片描述
丢包了不会立刻去请求而是会等一段时间,10ms-20ms通过RTCP的Nack,告诉发送端,然后发送端从发送历史记录中根据号找,然后再找到发过来。

一、webRTC拥塞控制算法

减少数据量、适当增加时延和更准确的带宽评估被统称为拥塞控制
WebRTC中包含多种拥塞控制算法:

  • GCC:(Google Congestion Contro,Google拥塞控制)GCC根据其实现⼜可细分为基于发送端的拥塞控制算法Transport-CC(Transport-wide Congestion Control,传输带宽拥塞控制)和基于接收端的拥塞控制算法Goog-REMB(Google Receiver Estimated Maximum Bitrate Google接收端评估的最⼤码流)
  • BBR:(Bottleneck Bandwidth and Round-trip propagation time),瓶颈带宽和往返传播时间
  • PCC:(Performance-oriented Congestion Control),基于性能的拥塞控制。
    重点关注一下GCC

二、GCC

2.1 Goog-REMB

⼀种是接收端的延时拥塞控制算法
Receiver Estimated Max Bitrate (REMB) 是一种RTCP 反馈消息,作为接收方,告诉发送方它可以接收的带宽是多少。发送者不知道接收方的带宽情况,它需要有一个机制由接收方告诉它有多少带宽可供传输, 这样发送方可以根据这个估计的带宽来调整分辨率(90p, 180p, 360p, 720p等)和帧率(每秒24, 30, 40, 60帧等)

在这里插入图片描述
RemoteBirate Estimator模块:它是接收端延时拥塞控制算法的管理模块,即“总负责⼈”。
Inter Arrival模块:将数据包按帧进⾏分组,然后对相邻的两组数据包进⾏单向梯度计算
OverUse Estimator模块:它利⽤Inter Arrival模块的计算结果,通过卡尔曼滤波器估算出下⼀时刻发送队列的增⻓趋势。
OverUse Detector模块:⽤于检测当前网络的拥塞状态。
AIMD Rate Controller:该模块⽤于计算发送码流大小。它通过OverUse Detec tor模块检测出的当前⽹络状态来变更⾃⼰的状态,并计算出发送码流的大小。

2.2 Transport CC

⼀种是发送端的延时拥塞控制算法【未完待续】
参考:流媒体学习之路(mediasoup)——拥塞控制分析
WebRTC 拥塞控制之 REMB - 接收方带宽估计

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7) 流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7) 阅读详情

相关推荐

mediasoup simucast consumer 分析

mediasoup simucast 消费端处理逻辑mediasoup simucast 当前现状mediasoup simucast consumer 实现mediasoup simucast consumer 代码分析 mediasoup simucast 当前现状 webrtc具有Simulcast功能,可以将一个分辨率的流编码成多个分辨率并发送,观看端可以根据带宽去动态的选择某个分辨率,也可以自己选择某个分辨率。在webrtc M70及M70以上版本vp8,vp9,h264三种编码器都支持Simul

The_Old_man_and_sea的博客 2058

Mediasoup简介及其基本概念

流媒体服务器Mediasoup】 源码中重要类基本概念 、上层代码作用详解、底层C++类关系详解(四) Guo_IT 2020-02-24 17:02:24 1673 收藏 6 版权 目录 前言 MediaSoup的特性 特性一 特性二 特性三 MediaSoup SFU简单的架构说明 MediaSoup库中Lib目录下的JS作用 MediaSoup-JS类的关系图 MediaSoup js部分起到的作用 MediaSoup C++ 库类关系图 ...

流媒体巅峰之路 2万+

音视频开发常见的开源项目汇总

音视频开发常见的开源项目

世界那么大,我想去看看~【随心更新,看世界去了😄】 2720

WebRTC服务器Mediasoup-demo搭建包含移动端

Mediasoup-demo搭建在centos、ubuntu两个平台Mediasoup-sample-server搭建Mediasoup-ios客户端连接mediasoup服务器进行音视频通话Mediasoup-Andriod客户端连接mediasoup服务器进行音视频通话

mediasoup中文文档

mediasoup中文文档

基于mediasoup的多方通话研究 webRtc-附件资源

基于mediasoup的多方通话研究 webRtc-附件资源

mediasoup服务器转发流媒体数据及发送拥塞控制

webrtc

qq_22658119的博客 2065

IWR6843ISK+DCA1000EVM 本人遇到的所有报错和解决方案

本文详解了初次使用DCA1000EVM和mmave studio遇到的一系列的问题以及解决方法

2301_77883976的博客 3300

mediasoup服务器接收流媒体数据及接收拥塞控制

webrtc

qq_22658119的博客 1723

AI 生成 ECU 功能测试用例

本文分享了AI辅助汽车电子测试的实战经验。作者以某车企车身控制器(BCM)项目为例,对比了传统测试用例编写方式(需100小时)与AI辅助方式(仅3个工作日)的效率差异,实现76%的效率提升。文章详细展示了从需求文档生成测试用例的全过程,包括需求文档示例、AI提示词模板和AI生成的完整测试用例表格(涵盖正常功能、边界条件、异常场景等测试类型)。通过具体案例说明如何利用AI快速生成初稿后人工审核优化的方法,为ECU测试工程师提供了可复用的效率提升方案。

小明的博客 879

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

1.NGC上的预构建发布容器进行部署,见《2.通过pip进行部署。3.从源头构建再部署。在实际开发中,我们常常面临这样的场景:本地笔记本为 Windows 系统,虽然可以访问 GitHub,但受限于硬件性能,编译大型项目(如 TensorRT-LLM)耗时过长;而公司或实验室提供的 Linux 服务器性能强劲,适合编译任务,但却因网络策略限制无法连接外网,尤其是无法访问 GitHub。。

xinvictory的专栏 1203

mediasoup源码分析-初始化、建立连接及媒体数据的处理流程

mediasoup中的Transport有多种类型,以下只分析WebRtcTransport,且只分析音频、视频的传输。 线程模型 mediasoup使用的是多进程模型,服务器上有多个少CPU核,就启动多少个Worker进程。每个Worker进程采用单线程,运行一个事件循环,所有数据的处理,都是通过事件触发的。 MediaSoup的应用层和媒体处理层分别运行在不同的进程内,它们之间通过管道进行通信。 注意:应用进程和Worker进程之间可以使用普通的管道,也可以使用socketpair,这个部分的代码应该在

专注音视频基础、WebRTC、ffmpeg、流媒体服务器 6082

Chromium实用技巧篇-如何下载指定版本的Chromium(一)

通过本指南,您已成功掌握如何在Windows系统上下载并安装最新版本的Chromium浏览器。我们详细介绍了从进入Chromium官网,到查找最新版本号,再到下载和安装的每一个步骤。通过这些步骤,您不仅能够体验到最新的浏览器功能,还可以参与开源项目的开发,享受高速、稳定、安全的浏览体验。

守城小轩的技术窝棚 1万+

Mediasoup扩展性设计:如何支撑千万级并发用户的终极指南

在现代实时音视频通信领域,Mediasoup作为一款高性能的WebRTC SFU(Selective Forwarding Unit),以其卓越的扩展性设计成为支撑大规模并发用户的首选方案。本文将深入解析Mediasoup的架构奥秘,揭秘其如何实现千万级用户的稳定接入。 ## 🔍 什么是Mediasoup? Mediasoup是一个开源的WebRTC SFU媒体服务器,专注于提供极致的实时音

gitblog_00293的博客 344

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个工具的设置。最后简单演示了PyQt5的调用方式及三个工具的使用方法。

Python966的博客 3万+

久坐不慌,健康护航 —— 智能震动提醒坐垫的设计与实现

硬件核心:选用 ESP32 为主控,HX711 + 应变片实现精准压力检测,8050 三极管驱动震动马达,锂电池 + TP4056 满足便携供电需求;软件逻辑:核心是 “压力阈值判断 + 时间计时”,达到久坐阈值后触发震动提醒,流程图清晰体现了循环检测、状态重置的核心逻辑;代码特性:代码注释完善,阈值可灵活调整,支持串口调试,新手可直接编译烧录并根据实际场景校准。

weixin_42300449的博客 398

WebRTC服务器Mediasoup学习与实践

​​​​mediasoup学习与实践

uianster的博客 2638

PoE 的三大国际标准:PoE、PoE+、PoE++

很多人知道 PoE 能“一根网线,既供电又传数据”,但鲜少有人能说清楚:PoE 供电到底分几种标准?差别有多大?哪些设备要用 PoE,哪些必须上 PoE+ 或 PoE++?今天,我们就来一次彻底的“拆解”,把 PoE 的三大国际标准——讲得明明白白,顺便也帮你厘清网络工程中的常见“供电疑惑”。

网络技术联盟站 1548

mediasoup:构建下一代WebRTC视频会议系统的分布式SFU解决方案

在实时音视频通信领域,高并发、低延迟和可扩展性一直是技术团队面临的核心挑战。随着远程协作、在线教育和直播电商等场景的普及,传统的MCU架构和简单的P2P方案已难以满足大规模、高质量的视频会议需求。mediasoup作为一个现代化的**选择性转发单元(Selective Forwarding Unit)**,通过其创新的分布式架构和极致性能优化,为开发者提供了构建下一代WebRTC视频会议系统的完整

gitblog_00202的博客 346

NVIDIA Isaac Sim 入门教程 - 运动生成控制器(Motion Generators)

机器人任务通常在任务空间中根据所需的末端执行器轨迹进行定义,而控制动作则在关节空间中执行。这自然会产生关节空间和任务空间(操作空间)控制方法。然而,要利用运动控制成功执行交互任务,往往需要对机械臂及其环境都建立精确的模型。虽然可以知道足够精确的机械臂模型,但很难获得详细的环境描述 [SSVO09]。可以通过在交互过程中引入顺应行为来克服这种不匹配造成的规划错误。虽然顺应性可以通过机器人的结构(如弹性致动器、软机械臂)被动实现,但我们对侧重于主动交互控制的控制器设计更感兴趣。这些设计大致分为注释。

2506_90492529的博客 1578

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Rust 的函数式编程用法:范式、泛型类型类与光学设计

Rust 虽然在语言分类上是命令式(imperative)语言,但它的类型系统、迭代器与泛型设计处处渗透着函数式编程的思想。本文基于《Rust Design Patterns》一书的 [Functional Programming 章节](https://link.gitcode.com/i/f18259fedb7a90414f593d1831fed556),系统梳理 Rust 中的函数式编程范式

gitblog_00816的博客 875

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

mediasoup丢包率计算原理揭秘

mediasoup的丢包率计算机制是一个典型的“实时采样 + 平滑滤波”工程范式。为拥塞控制提供输入:平滑后的丢包率是WebRTC GCC(Google Congestion Control)等拥塞控制算法评估网络带宽、调整编码码率的关键依据之一。驱动自适应策略:当平滑丢包率持续超过阈值(如5%),SFU或客户端可触发降级策略,如切换至更低分辨率的视频流或启用FEC(前向纠错)。质量监控与告警:该指标是服务端监控全局网络健康度、定位区域性网络问题的重要量化工具。

320

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

webrtc客户端与mediasoup服务器连接过程(服务器接收流媒体数据之前的工作)

webrtc

qq_22658119的博客 3354

mediasoup-demo性能调优:解决实时音视频延迟与卡顿的10个实用技巧

mediasoup-demo是mediasoup官方演示应用,专为实时音视频通信打造。本文将分享10个实用技巧,帮助你优化mediasoup-demo性能,解决延迟与卡顿问题,提升实时音视频体验。 [![实时音视频通信背景图](https://raw.gitcode.com/gh_mirrors/me/mediasoup-demo/raw/148ce094f6c9028753bb20ab9bac

gitblog_00730的博客 299

webrtc服务器meidasoup框架介绍

webrtc

qq_22658119的博客 1218

如何构建高性能WebRTC视频会议系统:mediasoup完整指南

想要打造一个稳定可靠的WebRTC实时通信系统吗?😊 面对海量用户并发、复杂的网络环境和严格的延迟要求,选择合适的SFU(选择性转发单元)架构至关重要。今天,我将为你介绍mediasoup——一个开源、高性能的WebRTC视频会议解决方案,它能够轻松应对大规模实时通信的挑战。通过本文的完整指南,你将掌握mediasoup的核心架构、部署方法和性能优化技巧,快速搭建属于自己的视频会议系统。 ##

gitblog_00980的博客 409
上一篇: 【音视频第7天】mediasoup拥塞控制【未完待续】
下一篇: 【音视频第9天】WebRTC for the Curious(1)Media Communication
Magic_o
博客等级 码龄8年 65粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值