海康威视SDK二次开发实战包

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:海康威视SDK是为视频监控系统开发提供的一套工具集,支持远程访问、视频流处理和报警事件管理。开发者可以使用该SDK定制开发应用程序,如监控客户端、录像回放软件或报警系统。本开发包提供丰富的API接口和相关文档,便于将海康威视监控设备集成到应用中。用户将按照文档指导安装、配置SDK,学习API,连接设备,处理视频流和报警事件,并进行录像回放和错误处理。本包包含特定版本CH-HCNetSDKV . . . _build***_Win32,适用于Windows 32位系统。开发者需具备网络编程和多媒体处理知识,通过有效利用SDK构建兼容海康威视设备的监控系统。 海康威视sdk二次开发包.zip

1. 海康威视SDK介绍

海康威视作为全球领先的视频监控和智能分析解决方案提供商,其软件开发工具包(SDK)为开发者提供了一套强大的工具和接口,以开发定制化的视频监控应用。SDK不仅支持丰富的设备类型,还提供了一整套功能丰富的API,使得集成视频监控功能到新的或现有的软件系统变得更加简便。海康威视SDK的使用覆盖了众多场景,包括但不限于安全监控、交通管理、远程教育和医疗诊断,实现了视频监控的智能化和便捷化。本章将为读者提供海康威视SDK的概览,为深入学习和应用SDK打下基础。

2. SDK二次开发概览

2.1 二次开发的目的和应用领域

2.1.1 智能视频监控需求

随着安防技术的发展,智能视频监控已经不再是简单的画面记录,而是需要通过图像分析、行为识别等技术手段,实现对特定场景和行为的智能监测。智能视频监控需求的提升,催生了二次开发的必要性,以满足特定场景下客户对于定制化功能的需求。例如,智能交通管理系统通过分析车辆流量、车辆类型来优化交通信号灯的控制,从而提高道路通行效率。二次开发通过SDK提供的API接口,能够帮助开发者实现这些高级功能,打造符合行业需求的智能监控解决方案。

2.1.2 系统集成与定制化服务

在当前的安防市场,客户往往需要将监控系统集成到一个更广泛的业务流程中。例如,零售店铺可能需要将视频监控系统与库存管理系统相结合,通过视频分析来监控商品的摆放情况,及时调整商品布局。这种情况下,二次开发显得尤为重要,它可以确保SDK与客户的现有系统或特定业务需求无缝对接。通过集成SDK,开发者可以开发出满足企业定制化需求的软件,并且能与其他系统高效协同工作,提高整体业务效率。

2.2 开发环境的搭建

2.2.1 软件和硬件需求

进行SDK二次开发前,必须搭建合适的开发环境,以确保开发的顺利进行和后期产品的稳定运行。硬件方面,一般需要具备一定的计算能力,以便于处理视频数据和运行调试程序。此外,建议使用稳定且高速的网络连接,以保证开发过程中的资源下载以及与服务器的实时交互。软件需求方面,开发者需要根据SDK支持的平台和语言来安装相应的开发工具包,如编译器、调试器以及特定的库文件。还需安装SDK提供的开发包(SDK包),里面通常包含了所需的库文件、头文件以及示例代码,为开发者提供开发的起点。

2.2.2 开发工具的选择与配置

选择合适的开发工具是成功开发的第一步。对于C/C++语言的开发,通常需要以下几种工具: - 集成开发环境(IDE) :如Visual Studio、Eclipse或Code::Blocks,它们提供了代码编辑、编译、调试等功能。 - 版本控制系统 :如Git或SVN,方便代码的版本管理与团队协作。 - 构建工具 :如Make或CMake,用于自动化构建项目。

安装并配置好这些开发工具之后,接下来需要设置编译器和链接器的参数,以确保SDK能够正确地编译和链接。这通常涉及到配置包含路径(include directories)、库路径(library directories)以及指定需要链接的库文件(linker flags)。配置完成后,通过编译SDK包中的示例项目,来验证开发环境是否搭建正确。如果示例项目能够成功编译并运行,则说明开发环境搭建完成,可以开始进行二次开发了。

# 示例:使用CMake构建SDK示例项目
mkdir build && cd build
cmake ..
make

代码块展示了如何使用CMake构建项目的基本步骤,其中 cmake .. 命令用于生成Makefile, make 命令用于编译项目。正确的配置和执行这些命令是开发环境搭建过程中不可或缺的一部分。

graph LR
    A[开始开发环境搭建] --> B[安装IDE和构建工具]
    B --> C[配置编译器和链接器参数]
    C --> D[验证SDK示例项目]
    D --> |成功| E[开发环境搭建完成]
    D --> |失败| B[重新检查安装和配置]

上述mermaid流程图以图形化的方式呈现了开发环境搭建的流程,从开始到验证SDK示例项目,并根据结果决定是继续进行下一阶段或是返回前一阶段进行错误检查。

3. 安装和配置步骤

3.1 SDK包解压与目录结构

3.1.1 文件和目录清单

在海康威视SDK的安装包中,通常包含有多个文件和目录。用户在下载和解压SDK包之后,会遇到如下的主要文件和目录结构:

  • lib :包含SDK的动态链接库文件( .dll 文件在Windows系统下, .so 文件在Linux系统下)。
  • include :包含SDK的头文件,这些文件定义了SDK提供的API接口以及相关的数据结构。
  • sample :包含示例代码和文档,帮助开发者理解如何使用SDK进行开发。
  • doc :包含SDK的用户手册和API参考文档。
  • thirdparty :第三方依赖库,包含SDK运行依赖的其他库文件。
  • sample_config :配置文件,用于配置SDK运行时的参数。
  • readme.txt :安装和使用SDK前必读的文件,包含SDK的版本信息、安装要求和基本使用说明。

用户应该仔细阅读 readme.txt 文件,了解安装SDK的先决条件和具体步骤。随后,可以按照文档说明开始安装和配置SDK。

3.1.2 快速安装向导

对于初学者而言,海康威视SDK通常提供了快速安装向导。快速安装向导旨在帮助用户顺利地完成SDK的安装配置工作,以下是快速安装向导的基本步骤:

  1. 下载并解压SDK安装包。
  2. 运行安装向导程序,通常是一个名为 Setup.exe install.sh 的文件。
  3. 跟随安装向导的指引进行安装,确认安装路径和环境配置。
  4. 按照指示完成安装,安装向导会自动配置环境变量和必要的路径。

快速安装向导提供了一个图形化的操作界面,降低了配置难度,对于不熟悉命令行操作的开发者来说尤其有用。

3.2 开发环境的配置

3.2.1 驱动程序安装

安装完SDK后,根据开发环境的不同,可能还需要安装特定的驱动程序。例如,在Linux系统中,某些设备可能需要特定的驱动才能被正确识别和使用。通常情况下,驱动程序的安装步骤如下:

  1. 根据操作系统下载对应的驱动程序安装包。
  2. 解压安装包,并按照提供的说明文档执行安装。
  3. 重启系统,确保驱动程序被正确加载。
  4. 使用 lsusb lspci 等系统命令检查驱动程序安装是否成功。

驱动程序的正确安装是进行后续开发工作的基础。安装过程中如果遇到问题,建议查阅官方的安装手册或联系技术支持获取帮助。

3.2.2 编译器和SDK接口库配置

SDK的开发涉及到编程语言的编译器和集成开发环境(IDE)的配置,以及库文件的正确链接。以下是配置编译器和接口库的基本步骤:

  1. 确保已经安装了支持C/C++开发的编译器和IDE(如Visual Studio、Eclipse等)。
  2. 在IDE中创建一个新的项目,并配置项目以包含SDK的头文件和库文件。
  3. 在项目的编译设置中添加SDK的库路径,确保编译器在编译过程中能够找到SDK提供的库文件。
  4. 指定项目链接到SDK的库文件,通常是 .lib .a 文件。
  5. 根据需要调整其他编译选项,比如包含目录、宏定义等。
  6. 测试配置是否正确,通过编译运行一个简单的SDK示例程序。

SDK接口库的配置对于整个开发流程至关重要,如果配置不正确,可能会导致编译错误或运行时错误。开发者在这一阶段需要仔细检查所有的配置选项,确保无误。

示例代码块

下面是一个简单的示例代码块,展示如何在C++中引入海康威视SDK的头文件,并链接到相应的库文件:

#include "HCNetSDK.h"

// ... 其他必要的头文件和命名空间声明 ...

int main()
{
    // SDK初始化
    NET_DVR_Init();

    // ... SDK功能调用 ...

    // SDK清理工作
    NET_DVR_Cleanup();

    return 0;
}

在上述代码中, #include "HCNetSDK.h" 是引入海康威视SDK的主要头文件, NET_DVR_Init() NET_DVR_Cleanup() 函数分别用于初始化和清理SDK。在编译时,需要确保IDE配置了包含 HCNetSDK.lib 库文件的链接路径,并在链接阶段添加了这个库。

这个示例展示了如何在程序中引入和使用海康威视SDK提供的基本功能。在实际开发中,开发者需要根据具体需求编写更为复杂的逻辑,同时也要对可能出现的错误进行处理,确保程序的稳定性和健壮性。

4. API学习和应用

4.1 API的基本概念和分类

4.1.1 API的命名规范

应用程序接口(API)是应用程序与开发人员共享的一组预先定义的函数、协议和工具。海康威视SDK提供的API遵循一套命名规范,这些规范有助于开发人员快速理解和使用API。通常,命名规范会包含以下几个要素:

  • 功能前缀:指明API所属的功能模块,例如“CV”前缀表示与计算机视觉相关的API。
  • 功能名称:明确表述API完成的功能,如“StartCapture”表示启动捕获操作。
  • 参数标识:如需要传递给API的参数,通常会使用如“i”表示整型,“p”表示指针类型等。
  • 返回类型:函数返回的数据类型,比如“BOOL”表示返回布尔值。

理解这些命名规范对于阅读SDK文档,快速定位功能模块以及正确使用API至关重要。

4.1.2 API的功能模块划分

API按功能可以划分为多个模块,例如:

  • 媒体处理模块:负责视频流的捕获、播放、压缩、解压缩等操作。
  • 设备管理模块:用于设备的连接、断开、设备参数设置、状态获取等。
  • 事件处理模块:包括报警事件的注册、取消注册、处理等。

海康威视SDK的API按照模块进行划分,并提供详细的分类说明,以方便开发人员根据实际需求选择合适的接口。

4.2 API的调用示例与实践

4.2.1 基本的API调用流程

在本小节中,我们将通过一个简单的示例来学习如何调用海康威视SDK中的API来实现基本的视频捕获功能。以下是代码示例和逻辑分析:

#include "HCNetSDK.h" // 引入海康威视SDK的头文件

int main()
{
    // 初始化SDK
    SDK параmeters;
    memset(&SDK параmeters, 0, sizeof(SDK параmeters));
    NET_DVR_Init(&SDK параmeters);

    // 搜索网络中的设备
    NET_DVR_DEVICEINFO_V30 stDeviceInfo = {0};
    if (NET_DVR_GetDeviceManagerTotal() > 0) // 检查设备数量是否大于0
    {
        NET_DVR_GetFirstDeviceV30(&stDeviceInfo);
    }

    // 连接设备
    if(NET_DVR_Login_V30(stDeviceInfo.sDeviceName, 8000, "admin", "12345", 0) >= 0)
    {
        // 启动视频捕获
        NET_DVR_VideoStreamCtrl(nUserID, 1, NET_DVR_START焖辑);
    }

    // ... 这里省略了视频捕获的代码 ...

    // 断开连接并清理
    NET_DVR_Logout(nUserID);
    NET_DVR_Cleanup();

    return 0;
}

在上面的代码示例中:

  1. 首先,我们通过 NET_DVR_Init 函数对SDK进行了初始化。
  2. 使用 NET_DVR_GetDeviceManagerTotal 检查并获取网络中的设备数量,然后通过 NET_DVR_GetFirstDeviceV30 获取第一个设备的信息。
  3. 接下来,通过 NET_DVR_Login_V30 函数登录设备。
  4. 最后,通过 NET_DVR_VideoStreamCtrl 函数启动视频捕获功能。

需要注意的是,上述示例代码在实际应用中需要进行更多的错误检查和异常处理,以确保程序的健壮性。

4.2.2 高级功能的API实现

高级功能的API实现涉及到对特定功能的编程,例如人脸检测、车牌识别、多路同步显示等。这部分内容更加复杂,通常需要阅读SDK的具体文档,理解每个API的详细使用方法和参数含义。以人脸检测功能为例,可能需要以下步骤:

  1. 功能准备 :确保摄像头支持人脸检测功能,以及相应的SDK模块已经启用。
  2. 参数设置 :配置人脸检测的相关参数,如检测灵敏度、区域限制等。
  3. 注册回调 :注册回调函数,以便在检测到人脸时接收到通知。
  4. 启动功能 :通过特定的API启动人脸检测功能。
  5. 资源释放 :在不需要人脸检测功能时,及时释放资源,避免内存泄漏。
// 示例:注册人脸检测回调函数
// 以下是伪代码,用于展示概念
void NET_DVR_RegFaceDetectCallback(int nUserID, void* pUser,回调函数定义)
{
    // 实现回调函数逻辑,如接收到人脸检测事件时的处理
}

在实际应用中,高级功能API的使用还可能涉及到更复杂的逻辑,如与其他模块的交互和同步。因此,理解SDK提供的API文档和示例代码对于实现高级功能至关重要。

4.2.3 调用API的优化方法

在调用API时,需要考虑性能优化,特别是对于视频监控这类资源密集型应用。以下是一些优化API调用的通用方法:

  • 异步调用 :在可能的情况下,尽量使用异步调用代替同步调用,避免阻塞主线程。
  • 内存管理 :合理分配和回收内存资源,避免内存泄漏。
  • 缓存机制 :对于重复请求相同资源的操作,可以采用缓存机制来提高效率。
  • 批量处理 :将多个小的操作合并为一次大的操作来减少API调用次数。
  • 参数优化 :合理设置API调用的参数以提高性能,如调整视频分辨率和帧率。

在实现API调用时,考虑到这些优化策略,并根据具体情况进行调整,可以显著提升应用程序的性能和用户体验。

5. 设备连接与管理

在现代视频监控系统中,与设备的有效连接和管理是至关重要的。这不仅关系到数据传输的稳定性和实时性,也直接影响到监控系统的性能和用户体验。本章节将深入探讨设备连接的实现方法,设备参数和状态的管理技术。

设备连接的实现方法

设备的连接是整个监控系统运行的基础,它涉及到设备的搜索、接入以及连接协议的选择和配置。掌握这些步骤对于任何希望构建稳定监控系统的开发者来说都是不可或缺的。

设备搜索与接入

在设备搜索与接入阶段,SDK 通常提供了多种方法来识别和连接监控设备。一种常见的方法是通过网络扫描来发现局域网内的设备。搜索通常依赖于设备的 IP 地址或设备 ID。一旦检测到设备,就可以使用设备的相关信息进行接入操作。

// 伪代码示例:设备搜索与接入
Device deviceList[10]; // 用于存储搜索到的设备列表
int count = searchDevices(deviceList); // 搜索并返回设备数量

for (int i = 0; i < count; i++) {
    if (connectDevice(deviceList[i])) {
        // 成功连接设备
    }
}

以上代码块展示了使用 SDK 提供的搜索与接入函数的基本步骤。 searchDevices 函数会填充设备列表,而 connectDevice 函数则尝试连接每个设备。这需要一个设备列表,因为搜索可能返回多个设备。

连接协议的选择与配置

设备连接协议的选择和配置是确保设备能够正确通信的关键。开发者需要根据实际的网络环境和设备能力来选择合适的协议。例如,一些设备可能支持 HTTP、RTSP 或者更高级的专有协议。

// 伪代码示例:连接协议的选择与配置
ProtocolConfig config = new ProtocolConfig();
config.setProtocol(Protocol.RTSP); // 设置为 RTSP 协议
config.setAddress("***.***.*.***"); // 设置设备的 IP 地址
config.setPort(554); // 设置 RTSP 服务端口

// 应用配置并连接
DeviceControl deviceControl = new DeviceControl();
deviceControl.applyConfig(config);
if (deviceControl.connect()) {
    // 连接成功
}

在这个示例中, ProtocolConfig 类用于配置连接协议的相关参数,包括协议类型、IP 地址和端口号。随后通过 DeviceControl 类应用这些配置并尝试连接设备。这样的代码块需要在设备搜索之后,建立连接之前执行。

设备参数和状态管理

设备参数和状态管理是监控系统中的另一项核心任务。了解如何获取和设置设备参数,以及如何监控和维护设备状态,对于提高整个系统的可靠性和功能性至关重要。

设备属性的获取与设置

设备属性管理涉及对诸如分辨率、帧率、编码格式等参数的设置。这些设置决定了监控视频的品质和特性。同时,获取设备属性对于监控设备运行状态也十分重要。

// 伪代码示例:设备属性的获取与设置
// 获取当前设备属性
DeviceProperties properties = deviceControl.getProperties();

// 设置分辨率
properties.setResolution(1920, 1080);
// 设置帧率
properties.setFrameRate(30);

// 应用修改后的属性
deviceControl.setProperties(properties);

// 确认属性设置
DeviceProperties confirmedProperties = deviceControl.getProperties();
if (confirmedProperties.getResolution() == 1920 && confirmedProperties.getFrameRate() == 30) {
    // 属性设置成功
}

在这个代码示例中,我们首先获取当前设备的属性,然后修改这些属性,并将它们应用到设备上。最后,我们再次获取并确认属性已经更新。此代码段展示了如何对设备进行自定义配置,以满足特定的监控需求。

设备状态监控与维护

监控设备状态是保障监控系统稳定运行的关键一环。这包括监控设备是否在线、是否出现错误等。维护设备状态则涉及到重启设备、复位设置等操作。

// 伪代码示例:设备状态监控与维护
// 检查设备是否在线
bool isDeviceOnline = deviceControl.isOnline();

if (!isDeviceOnline) {
    // 设备离线处理逻辑
    deviceControl.restartDevice(); // 尝试重启设备
}

// 定期轮询设备状态
定期执行:{
    if (deviceControl.getDeviceStatus() == DeviceStatus.FAULT) {
        // 设备出现故障,进行处理
        handleDeviceFault(deviceControl);
    }
}

这个代码示例演示了如何监控设备在线状态,并在检测到设备离线时进行重启操作。同时,还提供了定期检查设备状态的逻辑。如果设备状态为故障,则会调用相应的处理函数。

通过这些设备连接与管理技术的实现,开发者可以确保监控系统能够稳定运行,及时响应各种运行状态的变化。这不仅提升了系统的可用性,也为后续的视频流处理、报警事件处理等高级功能提供了坚实的基础。

6. 视频流处理和操作

6.1 视频流的捕获与解码

6.1.1 视频格式与编解码技术

视频流的捕获与解码是监控系统中最重要的环节之一,它涉及到视频格式的理解和编解码技术的应用。现代视频监控系统普遍采用H.264或H.265等高效的编解码标准,这些标准在保证视频质量的同时,大幅度降低了数据的存储和传输压力。

在处理视频流时,需要明确视频的分辨率、帧率等关键参数,它们决定了最终捕获的视频质量与系统资源消耗的平衡。分辨率越高,图像细节越丰富,但同时对存储空间和解码能力的需求也越高。帧率则是视频连续性的表现,帧率越高,视频播放越流畅,但数据量也随之增加。

6.1.2 实时视频流的捕获处理

实时视频流的捕获涉及到使用SDK提供的API接口。以下是一个基本的视频流捕获流程代码示例:

#include "hc_net_sdk.h"

// 初始化网络SDK
HC_NetSdk *pSdk = HC_NetSdk_Create();

// 创建视频捕获会话
HC_VideoCapSession *pCapSession = HC_VideoCapSession_Create();

// 配置捕获参数,如分辨率、帧率等
HC_VideoCapCfg capCfg = {0};
capCfg.width = 1920;
capCfg.height = 1080;
capCfg.fps = 30;

// 设置编码格式
capCfg.codecType = HC_CODEC_H264;

// 绑定设备
HC_VideoDevice *pDevice = HC_VideoDevice_GetFirst(pSdk);
HC_VideoCapSession_BindDevice(pCapSession, pDevice);

// 启动捕获
HC_VideoCapSession_Start(pCapSession);

// 循环获取视频帧
HC_VideoFrame *pFrame = NULL;
while (1) {
    pFrame = HC_VideoCapSession_GetFrame(pCapSession);
    if (pFrame) {
        // 处理视频帧
        // 例如:显示、编码、存储等
        // ...

        // 释放视频帧资源
        HC_VideoFrame_Release(&pFrame);
    }
}

// 停止捕获,释放资源
HC_VideoCapSession_Stop(pCapSession);
HC_VideoCapSession_Destroy(&pCapSession);
HC_NetSdk_Destroy(&pSdk);

在这个过程中,视频流首先被捕获为原始数据,然后通过编解码技术转换为适合显示或进一步处理的格式。开发者可以根据实际需求选择合适的编解码器进行视频流的解码工作。

6.2 视频流的显示与控制

6.2.1 视频图像的显示接口

视频图像的显示是通过图形用户界面(GUI)组件完成的,常见的GUI库包括但不限于WinForm、MFC、Qt等。在SDK中通常会提供相关的API接口来将视频帧直接渲染到GUI中。

6.2.2 视频流的快进、回放与截图

对于视频流的控制,如快进、回放以及截图等,海康威视SDK提供了一系列功能强大的API来支持这些操作。这允许开发者在应用中添加录像回放功能,或者对实时视频流进行截图保存。

以下是进行视频流截图的示例代码:

// 获取当前显示的视频帧
HC_VideoFrame *pFrame = HC_VideoCapSession_GetFrame(pCapSession);
if (pFrame != NULL) {
    // 将视频帧保存为文件
    char szFileName[256] = {0};
    sprintf(szFileName, "screenshot_%d.jpg", screenshot_index++);
    HC_VideoFrame_SaveToFile(pFrame, szFileName);

    // 释放视频帧资源
    HC_VideoFrame_Release(&pFrame);
}

开发者可以利用SDK提供的视频流控制功能,使得视频监控系统更加灵活、实用,以满足不同场景下的需求。

6.2.3 视频流的快进、回放功能

快进和回放功能要求监控系统具备录像功能,并且能够在前端界面上对录制的视频进行控制。这些功能的实现,需要对视频文件进行读取和解码操作。

通常,快进功能是在播放过程中增加帧的跳过率,而回放则相反,减少跳过率,甚至逐帧播放。这涉及到视频文件中时间戳和索引的处理,以及对视频帧的快速定位和解码。

实现这一功能的代码示例如下:

// 假设我们已经有一个视频回放会话 pPlaySession

// 设置回放速度,正值为快进,负值为倒退
int speed = 2; // 正数为快进速度,负数为倒退速度

// 设置播放位置,单位为秒
double position = 10.0;

// 调整回放会话到指定位置
HC_VideoPlaySession_SetPlayTime(pPlaySession, position);

// 根据速度和方向开始回放
HC_VideoPlaySession_StartPlayEx(pPlaySession, speed);

// 循环获取并处理播放的视频帧
HC_VideoFrame *pFrame = NULL;
while (1) {
    pFrame = HC_VideoPlaySession_GetFrame(pPlaySession);
    if (pFrame) {
        // 处理视频帧,例如显示在界面上
        // ...

        // 释放视频帧资源
        HC_VideoFrame_Release(&pFrame);
    }
}

// 停止播放,清理资源
HC_VideoPlaySession_Stop(pPlaySession);
HC_VideoPlaySession_Destroy(&pPlaySession);

以上代码中,开发者可以通过调整速度参数和播放时间来控制视频流的播放节奏。这些控制接口为实现视频监控系统的快进、回放功能提供了强大的支持。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:海康威视SDK是为视频监控系统开发提供的一套工具集,支持远程访问、视频流处理和报警事件管理。开发者可以使用该SDK定制开发应用程序,如监控客户端、录像回放软件或报警系统。本开发包提供丰富的API接口和相关文档,便于将海康威视监控设备集成到应用中。用户将按照文档指导安装、配置SDK,学习API,连接设备,处理视频流和报警事件,并进行录像回放和错误处理。本包包含特定版本CH-HCNetSDKV . . . _build***_Win32,适用于Windows 32位系统。开发者需具备网络编程和多媒体处理知识,通过有效利用SDK构建兼容海康威视设备的监控系统。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值