x265-1.7版本-encoder/encoder.h注释

本文详细解析了x265编码器的源码结构,包括其内部类和函数的作用,以及如何实现高效的视频编码过程。重点介绍了熵编码、帧编码、动态图片缓冲区、预测算法和比特率控制等关键组件。

注:问号以及未注释部分 会在x265-1.8版本内更新

/*****************************************************************************
 * Copyright (C) 2013 x265 project
 *
 * Authors: Steve Borho <steve@borho.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
 *
 * This program is also available under a commercial proprietary license.
 * For more information, contact us at license @ x265.com.
 *****************************************************************************/

#ifndef X265_ENCODER_H
#define X265_ENCODER_H

#include "common.h"
#include "slice.h"
#include "scalinglist.h"
#include "x265.h"
#include "nal.h"

struct x265_encoder {};

namespace x265 {
// private namespace
extern const char g_sliceTypeToChar[3];

class Entropy;

struct EncStats
{
    double        m_psnrSumY;
    double        m_psnrSumU;
    double        m_psnrSumV;
    double        m_globalSsim;
    double        m_totalQp;
    uint64_t      m_accBits;
    uint32_t      m_numPics;

    EncStats()
    {
        m_psnrSumY = m_psnrSumU = m_psnrSumV = m_globalSsim = 0;
        m_accBits = 0;
        m_numPics = 0;
        m_totalQp = 0;
    }

    void addQP(double aveQp);

    void addPsnr(double psnrY, double psnrU, double psnrV);

    void addBits(uint64_t bits);

    void addSsim(double ssim);
};

class FrameEncoder;
class DPB;
class Lookahead;
class RateControl;
class ThreadPool;

class Encoder : public x265_encoder
{
public:

    int                m_pocLast;         // 当前已经读入的视频帧数(从0开始计数,初始化为-1)time index (POC)
    int                m_encodedFrameNum; // 计数当前编码的帧数 (从1开始计数)
    int                m_outputCount;

    int                m_bframeDelay;//延迟帧数:p->bframes ? (p->bBPyramid ? 2 : 1) : 0;  一般等于2
    int64_t            m_firstPts;  //第一帧,其值等于最先进入的pts号(一般等于0)
    int64_t            m_bframeDelayTime;//延迟的pts号个数 一般等于2
    int64_t            m_prevReorderedPts[2];//存储前两帧的PTS,用于计算DTS

    ThreadPool*        m_threadPool;
    FrameEncoder*      m_frameEncoder[X265_MAX_FRAME_THREADS];//存储frame并行的个数,用于帧级编码的多线程
    DPB*               m_dpb;

    Frame*             m_exportedPic;

    int                m_numPools;
    int                m_curEncoder;//记录当前是哪个FrmaeEncoder,每完成一个m_curEncoder = (m_curEncoder + 1) % m_param->frameNumThreads;

    /* cached PicYuv offset arrays, shared by all instances of
     * PicYuv created by this encoder */
    //当前只为指针,其存储空间在某一个frame的m_fencPic中,整个空间在编码器中只申请一次
    /*如:一幅图像416x240 总过有7x4个LCU 
    m_cuOffsetY[0] = 0 m_cuOffsetY[1] = 64 m_cuOffsetY[2]= 128 m_cuOffsetY[7] = 40960 = 640*64 (640是步长含有扩边值)
    m_cuOffsetC[0] = 0 m_cuOffsetC[1] = 32 m_cuOffsetC[2]= 64  m_cuOffsetC[7] = 13312 = 416*64 (416是步长含有扩边值)
    m_buOffsetY[0] = 0 m_buOffsetY[1] =  4 m_buOffsetY[2]= 2560 (按照4x4块计算 zigzag排序  2560 = 640*4)
    m_buOffsetC[0] = 0 m_buOffsetC[1] =  2 m_buOffsetY[2]= 832 (按照2x2块计算 zigzag排序   832  = 416*2)
    **/   
    intptr_t*          m_cuOffsetY; //申请空间为一帧LCU个数,按照行列对应亮度LCU的pixel地址
    intptr_t*          m_cuOffsetC; //申请空间为一帧LCU个数,按照行列对应色度LCU的pixel地址
    intptr_t*          m_buOffsetY; //申请空间为一个LCU的part个数(默认256个4x4),为当前亮度位置与LCU首地址的偏移地址 (按照zigzag4x4排序)
    intptr_t*          m_buOffsetC; //申请空间为一个LCU的part个数(默认256个4x4),为当前色度位置与LCU首地址的偏移地址 (按照zigzag2x2排序)

    /* Collect statistics globally */
    EncStats           m_analyzeAll;
    EncStats           m_analyzeI;
    EncStats           m_analyzeP;
    EncStats           m_analyzeB;
    FILE*              m_csvfpt;
    int64_t            m_encodeStartTime;

    // weighted prediction
    int                m_numLumaWPFrames;    // number of P frames with weighted luma reference
    int                m_numChromaWPFrames;  // number of P frames with weighted chroma reference
    int                m_numLumaWPBiFrames;  // number of B frames with weighted luma reference
    int                m_numChromaWPBiFrames; // number of B frames with weighted chroma reference
    FILE*              m_analysisFile;
    int                m_conformanceMode;
    VPS                m_vps;
    SPS                m_sps;
    PPS                m_pps;
    NALList            m_nalList;
    ScalingList        m_scalingList;      // quantization matrix information

    int                m_lastBPSEI;
    uint32_t           m_numDelayedPic;//当前列表中有多少帧未编码 每当读入一帧++,每当编码完毕一帧减--

    x265_param*        m_param;
    x265_param*        m_latestParam;
    RateControl*       m_rateControl;
    Lookahead*         m_lookahead;    //用于帧类型决策以及framecost计算
    Window             m_conformanceWindow;

    bool               m_bZeroLatency;     // x265_encoder_encode() returns NALs for the input picture, zero lag
    bool               m_aborted;          // 用于检错处理,出错(如内存申请失败等)置为true  初始化为false fatal error detected
    bool               m_reconfigured;      // reconfigure of encoder detected

    Encoder();
    ~Encoder() {}

    void create();
    void stopJobs();
    void destroy();

    int encode(const x265_picture* pic, x265_picture *pic_out);

    int reconfigureParam(x265_param* encParam, x265_param* param);

    void getStreamHeaders(NALList& list, Entropy& sbacCoder, Bitstream& bs);

    void fetchStats(x265_stats* stats, size_t statsSizeBytes);

    void writeLog(int argc, char **argv);

    void printSummary();

    char* statsString(EncStats&, char*);

    char* statsCSVString(EncStats& stat, char* buffer);

    void configure(x265_param *param);

    void updateVbvPlan(RateControl* rc);

    void allocAnalysis(x265_analysis_data* analysis);

    void freeAnalysis(x265_analysis_data* analysis);

    void readAnalysisFile(x265_analysis_data* analysis, int poc);

    void writeAnalysisFile(x265_analysis_data* pic);

    void finishFrameStats(Frame* pic, FrameEncoder *curEncoder, uint64_t bits);

protected:

    void initVPS(VPS *vps);
    void initSPS(SPS *sps);
    void initPPS(PPS *pps);
};
}

#endif // ifndef X265_ENCODER_H


D:\Develop\jdk\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\Develop\IntelliJ IDEA 2024.1.7\lib\idea_rt.jar=62359:D:\Develop\IntelliJ IDEA 2024.1.7\bin" -Dfile.encoding=UTF-8 -classpath D:\Projects\library\target\classes;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.7.10\spring-boot-starter-web-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-starter\2.7.10\spring-boot-starter-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot\2.7.10\spring-boot-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.10\spring-boot-autoconfigure-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.7.10\spring-boot-starter-logging-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\xiaohehua\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\xiaohehua\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\xiaohehua\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\xiaohehua\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\xiaohehua\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\xiaohehua\.m2\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.7.10\spring-boot-starter-json-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.10\spring-boot-starter-tomcat-2.7.10.jar;C:\Users\xiaohehua\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.73\tomcat-embed-core-9.0.73.jar;C:\Users\xiaohehua\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.73\tomcat-embed-el-9.0.73.jar;C:\Users\xiaohehua\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.73\tomcat-embed-websocket-9.0.73.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-web\5.3.26\spring-web-5.3.26.jar;C:\Users\xiaohehua\.m2\repository\org\webjars\jquery\3.5.1\jquery-3.5.1.jar;C:\Users\xiaohehua\.m2\repository\org\webjars\bootstrap\4.5.3\bootstrap-4.5.3.jar;C:\Users\xiaohehua\.m2\repository\org\webjars\popper.js\1.16.0\popper.js-1.16.0.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-webmvc\5.3.30\spring-webmvc-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-aop\5.3.30\spring-aop-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-beans\5.3.30\spring-beans-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-context\5.3.30\spring-context-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-core\5.3.30\spring-core-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-jcl\5.3.30\spring-jcl-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-expression\5.3.30\spring-expression-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-jdbc\5.3.30\spring-jdbc-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\spring-tx\5.3.30\spring-tx-5.3.30.jar;C:\Users\xiaohehua\.m2\repository\org\mybatis\mybatis\3.5.13\mybatis-3.5.13.jar;C:\Users\xiaohehua\.m2\repository\org\mybatis\mybatis-spring\2.1.1\mybatis-spring-2.1.1.jar;C:\Users\xiaohehua\.m2\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar;C:\Users\xiaohehua\.m2\repository\com\google\protobuf\protobuf-java\3.21.9\protobuf-java-3.21.9.jar;C:\Users\xiaohehua\.m2\repository\org\thymeleaf\thymeleaf\3.1.2.RELEASE\thymeleaf-3.1.2.RELEASE.jar;C:\Users\xiaohehua\.m2\repository\ognl\ognl\3.3.4\ognl-3.3.4.jar;C:\Users\xiaohehua\.m2\repository\org\javassist\javassist\3.29.0-GA\javassist-3.29.0-GA.jar;C:\Users\xiaohehua\.m2\repository\org\attoparser\attoparser\2.0.7.RELEASE\attoparser-2.0.7.RELEASE.jar;C:\Users\xiaohehua\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\xiaohehua\.m2\repository\org\thymeleaf\thymeleaf-spring5\3.1.2.RELEASE\thymeleaf-spring5-3.1.2.RELEASE.jar;C:\Users\xiaohehua\.m2\repository\org\springframework\security\spring-security-crypto\5.7.1\spring-security-crypto-5.7.1.jar;C:\Users\xiaohehua\.m2\repository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;C:\Users\xiaohehua\.m2\repository\javax\servlet\jstl\1.2\jstl-1.2.jar;C:\Users\xiaohehua\.m2\repository\org\projectlombok\lombok\1.18.28\lombok-1.18.28.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.15.2\jackson-databind-2.15.2.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.15.2\jackson-annotations-2.15.2.jar;C:\Users\xiaohehua\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.15.2\jackson-core-2.15.2.jar com.example.library.LibraryApplication Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:36) at org.apache.commons.logging.LogAdapter$Log4jLog.<init>(LogAdapter.java:165) at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:178) at com.example.library.LibraryApplication.main(LibraryApplication.java:10) Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 8 more 进程已结束,退出代码为 1 这是什么问题,应该怎么解决
06-08
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 37 compatible libraries Scanning dependencies... Dependency Graph |-- ESP32Encoder @ 0.11.8 Building in release mode Compiling .pio/build/esp32-c3-devkitm-1/src/main.cpp.o Linking .pio/build/esp32-c3-devkitm-1/firmware.elf /Users/gengwenhao/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/bin/ld: .pio/build/esp32-c3-devkitm-1/src/main.cpp.o: in function `setup()': /Users/gengwenhao/Documents/PlatformIO/Projects/9KEY_ENCODER/src/main.cpp:22: undefined reference to `ESP32Encoder::attachHalfQuad(int, int)' /Users/gengwenhao/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/bin/ld: /Users/gengwenhao/Documents/PlatformIO/Projects/9KEY_ENCODER/src/main.cpp:25: undefined reference to `ESP32Encoder::clearCount()' /Users/gengwenhao/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/bin/ld: /Users/gengwenhao/Documents/PlatformIO/Projects/9KEY_ENCODER/src/main.cpp:31: undefined reference to `ESP32Encoder::getCount()' /Users/gengwenhao/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/bin/ld: .pio/build/esp32-c3-devkitm-1/src/main.cpp.o: in function `_GLOBAL__sub_I_encoder': /Users/gengwenhao/Documents/PlatformIO/Projects/9KEY_ENCODER/src/main.cpp:70: undefined reference to `ESP32Encoder::ESP32Encoder(bool, void (*)(void*), void*)' collect2: error: ld returned 1 exit status *** [.pio/build/esp32-c3-devkitm-1/firmware.elf] Error 1 =================================================== [FAILED] Took 1.36 seconds ===
最新发布
08-04
<think>我们正在解决ESP32Encoder库在PlatformIO中出现的未定义引用错误。这种错误通常发生在链接阶段,表明编译器找到了函数声明,但没有找到其实现。以下是一些常见原因及解决方法: ### 1. **检查库的安装** - 确保已正确安装ESP32Encoder库。在PlatformIO中,可以通过`platformio.ini`文件添加依赖。 - 在`platformio.ini`中添加: ``` lib_deps = madhephaestus/ESP32Encoder @ ^0.12.0 ``` ### 2. **检查库的兼容性** - 确保所安装的库版本支持ESP32-C3。由于ESP32-C3是RISC-V架构,某些库可能不支持。ESP32Encoder库从0.12.0版本开始支持ESP32-C3[^1]。 ### 3. **检查头文件包含** - 在代码中正确包含头文件: ```cpp #include <ESP32Encoder.h> ``` ### 4. **链接器错误的具体分析** - 错误信息类似`undefined reference to 'ESP32Encoder::ESP32Encoder()'`,这通常意味着链接器找不到库的实现。可能的原因: - 库未正确安装:检查`.pio/libdeps`目录下是否存在`ESP32Encoder`文件夹。 - 构建系统未链接库:确保PlatformIO能够自动链接已安装的库。 ### 5. **清理并重新构建** - 在PlatformIO中,执行清理并重新构建: ``` pio run --target clean pio run ``` ### 6. **检查硬件支持** - 确保在`platformio.ini`中正确设置了板子型号: ``` board = esp32-c3-devkitm-1 platform = espressif32 ``` ### 7. **更新PlatformIO和平台** - 更新PlatformIO核心和Espressif32平台: ``` pio upgrade pio platform update espressif32 ``` ### 8. **使用正确的命名空间** - 根据库的文档,使用正确的类名。例如: ```cpp ESP32Encoder encoder; ``` ### 9. **检查库的依赖** - 某些库可能依赖其他库。ESP32Encoder依赖于`driver`库,但PlatformIO通常会自动处理。 ### 10. **查看库的示例** - 参考官方示例代码,确保使用方式正确。 ### 示例代码 ```cpp #include <Arduino.h> #include <ESP32Encoder.h> ESP32Encoder encoder; void setup() { encoder.attachSingleEdge(0, 1); // 根据实际引脚调整 } void loop() { Serial.println(encoder.getCount()); delay(100); } ``` ### 如果问题仍然存在 - 查看库的源代码,确认函数实现是否存在。 - 在GitHub上搜索类似问题。 §§相关问题§§ 1. 如何为ESP32-C3在PlatformIO中添加第三方库? 2. 如何更新PlatformIO的核心和平台? 3. ESP32Encoder库在ESP32-C3上使用时需要注意什么?</think>### ESP32Encoder库在PlatformIO中的链接错误解决方案 您在ESP32-C3-DevKitM-1开发板上使用ESP32Encoder库时遇到的`undefined reference`错误,通常是由于链接器找不到库函数的实现代码导致的。以下是系统化的解决步骤: #### 1. **检查库安装与依赖** - 在`platformio.ini`中添加库依赖(使用最新兼容版本): ```ini lib_deps = madhephaestus/ESP32Encoder @ ^0.12.0 ``` - 执行清理重建: ```bash pio run --target clean && pio run ``` - **注意**:ESP32-C3需要库版本≥0.12.0才能支持RISC-V架构[^1] #### 2. **验证硬件配置** - 确保`platformio.ini`正确定义开发板: ```ini [env:esp32-c3] platform = espressif32 board = esp32-c3-devkitm-1 framework = arduino ``` #### 3. **检查代码包含关系** - 在`.cpp`文件中正确包含头文件: ```cpp #include <ESP32Encoder.h> // 注意不是"ESP32Encoder.h" ``` - 全局初始化编码器对象(避免局部声明): ```cpp ESP32Encoder encoder; // 全局对象声明 void setup() { encoder.attachSingleEdge(0, 1); // GPIO0和GPIO1 } ``` #### 4. **解决架构兼容性问题** - 如果是旧版库导致的RISC-V兼容问题: 1. 打开`.pio/libdeps/esp32-c3/ESP32Encoder/src/ESP32Encoder.h` 2. 确保存在以下宏定义: ```cpp #if CONFIG_IDF_TARGET_ESP32C3 #define _ENCODER_USE_RMT #endif ``` #### 5. **更新开发环境** - 升级PlatformIO核心: ```bash pio upgrade ``` - 更新ESP32平台: ```bash pio platform update espressif32 ``` #### 6. **验证最小可运行示例** ```cpp #include <Arduino.h> #include <ESP32Encoder.h> ESP32Encoder encoder; void setup() { Serial.begin(115200); ESP32Encoder::useInternalWeakPullResistors = UP; // 启用内部上拉 encoder.attachSingleEdge(0, 1); // 使用单边沿计数模式 } void loop() { Serial.printf("Count: %d\n", encoder.getCount()); delay(100); } ``` > **常见错误模式**: > `undefined reference to ESP32Encoder::attachSingleEdge(...)` > ➜ 通常表示库未正确链接,检查`.pio/libdeps`目录是否存在库文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值