pyqt5 制作视频剪辑软件,切割视频

AI驱动视频剪辑:Codex接入DeepSeek实现语义化自动剪辑 如果你是一名视频创作者或开发者,最近一定被各种AI工具刷屏了。从自动生成脚本到AI配音,技术似乎正在重塑内容生产的每一个环节。但有一个痛点始终存在: 剪辑 。脚本可以AI写,配音可以AI配,但把素材精准地剪成成片,依然高度依赖人工,耗时耗力。 最近,一个名为 Codex 的项目进入了我的视野。它不是一个全新的AI模型,而是一个巧妙的技术整合方案—— 将强大的代码生成模型 DeepSeek 的能力,接入到视频剪辑的工作流中 。简单来说,它试图让AI理解你的剪辑意图,并自动或半自动地帮你完成时间线操作、转场添加 阅读详情

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能,

代码如下:

# coding=UTF-8
"""
theme: pyqt5实现动作起始帧和结束帧的定位,将定位到的帧数保存json文件
time:  2024-6-27
author: cong
"""
import json
import re
import sys
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaPlaylist
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

# 使用 QMediaPlayer 可以进行视频文件解码,视频播放必须将视频帧在某个界面组件上显示,
# 有 QVideoWidget 和 QGraphicsVideoItem 两种视频显示组件,也可以从这两个类继承,自定义视频显示组件。
# QMediaPlayer 也可以结合 QMediaPlaylist 实现视频文件列表播放。


class VideoWin(QWidget):
    save_flag = 0
    save_start_count = 1
    save_end_count = 2


    def __init__(self):
        super(VideoWin, self).__init__()
        self.setWindowTitle("MediaPlayer")
        # 播放画面
        self.player = QMediaPlayer()
        self.video_widget = QVideoWidget(self)  # 定义视频显示的widget,界面组件
        self.video_widget.setFixedSize(1280,720)
        self.player.setVideoOutput(self.video_widget)  # 视频播放输出的widget,就是上面定义的

        # 当前播放的进度,显示调整视频进度条
        self.label_time = QLabel()
        self.timeSlider = QSlider()
        self.timeSlider.setOrientation(Qt.Horizontal)
        self.timeSlider.setValue(0)
        self.timeSlider.setMinimum(0)
        self.player.positionChanged.connect(self.get_time)
        self.timeSlider.sliderPressed.connect(self.player.pause)
        self.timeSlider.sliderMoved.connect(self.change_time)
        self.timeSlider.sliderReleased.connect(self.player.play)

        # 打开视频
        self.open_button = QPushButton('打开')
        self.open_button.clicked.connect(self.open_file)
        # 快进
        self.right_button = QPushButton('快进')
        self.right_button.clicked.connect(self.up_time)
        # play
        self.play_button = QPushButton('播放')
        self.play_button.clicked.connect(self.player.play)
        # pause
        self.mid_button = QPushButton('暂停')
        self.mid_button.clicked.connect(self.player.pause)
        # 快退
        self.left_button = QPushButton('快退')
        self.left_button.clicked.connect(self.down_time)
        # 保存开始时间
        self.start_button = QPushButton('保存动作开始时间')
        self.start_button.clicked.connect(self.save_start_time)
        # 保存结束时间
        self.end_button = QPushButton('保存动作结束时间')
        self.end_button.clicked.connect(self.save_end_time)
        # 所有时间选定,最终保存按钮
        self.done_button = QPushButton('完成并保存')
        self.done_button.setFixedSize(100,40)
        self.done_button.clicked.connect(self.save_json)




        # 视频路径 entry 布局
        self.path_entry = QLineEdit()

        # 创建一个网格布局
        grid_layout = QGridLayout()
        self.entry_names = [f'entry_{i + 1}' for i in range(80)]
        for i in range(80):

            if (i+1) % 2 == 1:
                label = QLabel(f"start_frame_d{int((i+1)// 2 + 1)}:")
            else:
                label = QLabel(f"end_frame_d{int((i+1) / 2)}:")
            self.entry_names[i] = QLineEdit(self)
            grid_layout.addWidget(label, i // 2, (i % 2) * 2)
            grid_layout.addWidget(self.entry_names[i], i // 2, (i % 2) * 2 + 1)
        # 上述按钮布局
        button_layout = QHBoxLayout()
        button_layout.addWidget(self.open_button)
        button_layout.addWidget(self.right_button)
        button_layout.addWidget(self.play_button)
        button_layout.addWidget(self.mid_button)
        button_layout.addWidget(self.left_button)
        button_layout.addWidget(self.start_button)
        button_layout.addWidget(self.end_button)

        # 左侧布局
        left_layout = QVBoxLayout()
        left_layout.addWidget(self.video_widget)
        left_layout.addWidget(self.label_time, alignment=Qt.AlignRight)

        left_layout.addWidget(self.timeSlider)

        left_layout.addLayout(button_layout)

        left_layout.addSpacing(100)

        left_layout.addWidget(QLabel("视频路径:"))
        left_layout.addWidget(self.path_entry)

        # 中间布局
        middle_layout = QVBoxLayout()
        middle_layout.addLayout(grid_layout)
        # 右侧布局
        right_layout = QVBoxLayout()
        right_layout.addWidget(self.done_button)
        # 总布局
        all_layout = QHBoxLayout()
        all_layout.addLayout(left_layout)
        all_layout.addLayout(middle_layout)
        all_layout.addLayout(right_layout)
        self.setLayout(all_layout)
        self.showMaximized()

    # 打开视频
    def open_file(self):
        a = QFileDialog.getOpenFileUrl()[0]
        self.video_path = a.toString()
        self.player.setMedia(QMediaContent(a))  # 选取视频文件
        msg = QMessageBox.information(self, '提示', "已经打开视频文件")
        self.path_entry.setText(self.video_path)


    # 调节播放进度
    def change_time(self, num):
        self.player.setPosition(num)

    # 快进
    def up_time(self):
        # print(self.player.duration())
        # num = self.player.position() + int(self.player.duration() / 20)
        num = self.player.position() + 200
        self.player.setPosition(num)

    # 快退
    def down_time(self):
        # num = self.player.position() - int(self.player.duration() / 20)
        num = self.player.position() - 200
        self.player.setPosition(num)

    # 获取进度条进度
    def get_time(self, num):
        self.timeSlider.setMaximum(self.player.duration())
        self.timeSlider.setValue(num)
        frame_count = int(num / 1000 * 30)
        # d = QDateTime.fromMSecsSinceEpoch(num).toString("mm:ss")
        # print(d)
        all = self.player.duration()
        total_count = int(all / 1000 * 30)
        # all_d = QDateTime.fromMSecsSinceEpoch(all).toString("mm:ss")
        self.label_time.setText(str(frame_count) + '/' + str(total_count))


    def closeEvent(self, event):  # 关闭前需要self.player.pause()操作,否则报错
        self.player.pause()
        reply = QMessageBox.question(self, '提示',
                                     "是否退出",
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def save_start_time(self):

        if self.save_flag == 0:
            self.save_flag = 1
            start_time = self.player.position()
            start_frame = int(start_time / 1000 * 30)
            self.entry_names[self.save_start_count-1].setText(str(start_frame))
            self.save_start_count += 2
            QMessageBox.information(self, "保存成功", f"已保存当前时间点:第{start_frame}帧 ")

        else:
            QMessageBox.information(self, "保存失败", f"请先保存动作结束时间 ")

    def save_end_time(self):
        if self.save_flag == 1:
            self.save_flag = 0
            end_time = self.player.position()
            end_frame = int(end_time / 1000 * 30)
            self.entry_names[self.save_end_count-1].setText(str(end_frame))
            self.save_end_count += 2
            QMessageBox.information(self, "保存成功", f"已保存当前时间点:第{end_frame}帧 ")
        else:
            QMessageBox.information(self, "保存失败", f"请先保存动作开始时间 ")

    def save_json(self):
        result = {}
        single_part = {}

        video_path = self.video_path
        print('当前保存结果来源于视频文件', video_path)
        result['video_path'] = video_path
        result['split_result'] = []
        # video_path: 'file:///D:/SplitVideo/dmh2.avi'
        file_path = re.split('/', video_path)[-1] + '.json'
        for i in range(len(self.entry_names)):
            if self.entry_names[i].text() != '':
                if (i + 1) % 2 == 1:
                    label_key = f"start_frame_d{int((i + 1) // 2 + 1)}:"
                else:
                    label_key = f"end_frame_d{int((i + 1) / 2)}:"
                single_part[label_key]= int(self.entry_names[i].text())
                # print(self.single_part)
        result['split_result'].append(single_part)

        with open(file_path, 'w') as f:
            json.dump(result, f)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.aboutToQuit.connect(app.deleteLater)
    win = VideoWin()
    win.show()
    sys.exit(app.exec())


基于日志解析与FFmpeg的游戏精彩片段自动化剪辑方案 在游戏开发与内容创作领域,自动化处理海量录像素材是提升效率的关键。其核心原理是通过解析游戏运行时产生的日志文件,利用正则表达式精准识别关键事件(如击杀、胜利)及其时间戳,构建事件时间线。这项技术的价值在于将人工从繁琐的剪辑中解放出来,实现批量化、标准化的素材生产。其典型应用场景包括竞技游戏高光集锦制作、游戏数据复盘分析与内容创作者的工作流优化。本文以《我的世界》起床战争模式为例,详细阐述了如何结合Python脚本与FFmpeg工具,构建一个从事件检测、时间定位到视频切割、元数据管理的完整自动化流水线,为处理 阅读详情

相关推荐

【PyQt】使用PyQt6视频百叶窗效果一键生成应用

通过本教程已经学会了如何使用 PyQt6 构建一个应用程序,该程序可以自动处理音频并生成带有百叶窗效果的视频。整个流程包括从用户界面获取参数,验证输入路径的有效性,提取音频高潮部分,获取音频节拍,复制和调整图片尺寸,生成基础视频以及应用百叶窗效果切割图片并合成最终视频。通过这个应用程序,用户可以自动化地完成音频高潮部分的提取和视频生成过程,显著提高工作效率。用户可以自由选择百叶窗效果的方向,使得生成的视频更加个性化和动态化。此外,简洁的操作流程和友好的用户界面使得即使没有编程基础的用户也可以轻松上手。

Mr数据杨 1209

Python结合PyQt5实现视频播放器

Python结合PyQt5实现视频播放器

zouxun660的博客 6491

Python在Windows环境下驱动乐视三合一摄像头的深度图像处理实践

本文详细介绍了在Windows系统下,使用Python驱动乐视三合一摄像头进行深度图像处理的完整实践流程。从环境配置、驱动安装、OpenNI与OpenCV库的部署,到深度与彩色数据流的读取、可视化、三维点云转换以及背景移除等应用开发,为开发者提供了从零开始掌握深度摄像头编程的实战指南。

gitlab7runner的博客 232

Qt 时间线自定义实现

写了好久,先记录一下

aijiangaa111的博客 484

Docker离线部署OpenWebUI操作步骤

docker离线部署openwebui

m0_49333265的博客 4353

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

PyQt5OpenCV视频播放解决方案:让视频播放更简单高效

PyQt5OpenCV视频播放解决方案:让视频播放更简单高效 去发现同类优质开源项目:https://gitcode.com/ 在现代软件开发中,视频播放功能已成为许多应用程序的标配。今天,我要向大家推荐一个开源项目——PyQt5 + OpenCV 视频播放解决方案(pyqt5-opencv-video),它为开发者提供了一个便捷、高效的视频播放框架。 项目介绍 PyQt5 + OpenCV 视频...

gitblog_06787的博客 882

SAP ABAP VL09 BAPI VL 216

ls_batch_item-fact_unit_denom = ls_lips_split-umvkn. "销售数量转换为 SKU 的值(分母)ls_batch_item-fact_unit_nom = ls_lips_split-umvkz. "销售数量转换成SKU的分子(因子)ls_batch_item-sales_unit_iso = ls_lips_split-meins. "被拆分DN基本单位。

ChampaignWolf的专栏 2300

基于python的库pyqt5短视频标注系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、本文介绍二、PYQT5介绍三、使用步骤1.引入库2.使用2.界面展示参考文献 前言 这里时基于pyqt5写的一个视频标注系统,在步入AI时代的大环境中,CV技术目前很成熟,并且很多项目都可以落地使用,用于工业化中,之前写过关于图像分类的介绍,兴趣的朋友可以去首页看。 星光不问赶路人,时光不负有心人! 一、本文介绍 本文代码: 本文先介绍一下视频分类前视频标注的一个小工具,将自己本地未标注的视频通过自定义标签,将视频人工.

TF666666的博客 5159

基于 FPGA Vivado 信号发生器设计(附源工程)

今天给大侠带来基于 FPGA Vivado 信号发生器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于 FPGA Vivado 信号发生器设计(附源工程),掌握基于添加文件和IP的Vivado工程设计流程,掌握基于Tcl的Vivado工程设计流程,学习信号发生器的基本组成结构。获取本篇相关源工程代码,可在公众号内回复“信号发生器设计源工程”。 设计原理 信号发生器...

7990

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1536

Shotcut时间线功能详解:高效剪辑的核心操作技巧

你是否曾在剪辑视频时因时间线操作繁琐而效率低下?是否在处理多轨道素材时感到混乱不堪?Shotcut作为一款跨平台(Qt)、开源(GPLv3)的视频编辑器,其时间线功能是实现高效剪辑的关键。本文将深入剖析Shotcut时间线的核心功能与操作技巧,帮助你掌握多轨道管理、精确剪辑、快捷键操作等专业技能,让你的视频剪辑效率提升至少30%。 读完本文后,你将能够: - 熟练配置和管理多轨道时间线 - 掌握...

gitblog_00515的博客 1205

第十届MathorCup高校数学建模挑战赛-B题:养老服务床位需求预测与运营模式研究

当养老床位数增加时存在的商机,提出了相应的养老服务床位的运营商业模式。就业的可能性,建立多目标规划模型,尽可能同时满足三方面的要求。务床位的需求、制定合理的养老服务床位发展规划,是构建和谐社会、幸福社会。问题一的床位需求与市场类型的分类结果,查找关于国内养老院的相关数据,探。求,又能持续发展养老事业,同时还能促进社会就业的养老服务床位运营的商业。养老服务床位数的增加能够带来的就业方面因素的影响,并对这些因素进行一个。你们的模型及其结论为科学依据,对政府管理部门针对养老床位规划提出合理的。

getusushu的博客 1139

VidCutter终极指南:如何用这款免费开源工具实现专业级视频剪辑

在当今数字内容爆炸的时代,视频编辑已成为创作者和普通用户的日常需求。然而,大多数专业视频编辑软件要么价格昂贵,要么操作复杂,让许多用户望而却步。VidCutter作为一款免费开源、跨平台的视频剪辑工具,完美解决了这一痛点。这款基于Python和Qt开发的软件不仅支持Windows、macOS和Linux三大操作系统,还提供了直观的用户界面和强大的视频处理能力,让视频剪辑变得简单高效。 VidCu

gitblog_00622的博客 936

【YOLO26科研级突破】集成BiFPN双向特征金字塔,让多尺度特征融合效率与精度双跃升

打开确保模型解析器能识别BiFPN模块。通过将BiFPN双向特征金字塔集成到YOLO26中,我们实现了一个“全尺度双向特征流动+加权融合+精准检测”的目标检测模型。这个改进不仅在工程上能大幅提升多尺度、复杂场景下的检测精度,更在科研上提供了“双向特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

LXY_LOVE36的博客 200

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VidCutter 终极指南:跨平台视频剪辑与拼接完整教程

还在为复杂的视频编辑软件头疼吗?🤔 你是否遇到过这样的烦恼:只想快速剪掉视频中的多余片段,却需要安装庞大的专业软件;或者需要合并几个短视频,却找不到简单好用的工具?今天我要为你介绍一个真正实用的解决方案——VidCutter,这款开源工具将彻底改变你对视频剪辑的认知! ## 痛点解决:为什么选择VidCutter? 视频编辑不应该是一件复杂的事情。传统软件往往界面臃肿、学习曲线陡峭,而在线工

gitblog_00940的博客 252

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

FFmpeg开发笔记(八十五)基于PyQt和FFmpeg的开源视频剪辑器OpenShot

vda16wCB5的博客 206

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

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

FFmpeg视频剪辑实战:从关键帧识别到自动化批量处理

视频处理是现代多媒体应用的核心技术之一,其基本原理涉及音视频编码、流媒体传输和容器格式等概念。通过分析视频的关键帧结构和时间戳信息,可以实现精准的内容定位与切割。FFmpeg作为业界领先的开源多媒体框架,提供了强大的命令行工具集,能够高效处理视频剪辑、格式转换和质量优化等任务。在工程实践中,结合自动化脚本可以显著提升批量视频处理的效率,特别适用于内容创作、在线教育和媒体制作等场景。本文以视频评论制作为例,详细解析如何使用FFmpeg进行关键帧识别和时间点切割,并通过脚本实现多片段自动合并,为开发者提供了一套

weixin_34115824的博客 437

安装VidCutter,这是Linux Ubuntu的视频切割器

安装VidCutter,这是Linux Ubuntu的视频切割器 如何在Ubuntu Linux上剪切和修剪视频。安装VidCutter,这是用于Linux的视频切割器,可用于在Linux Ubuntu上裁剪视频。VidCutter是一个基于Qt5的跨平台应用程序,可快速轻松地进行视频修剪/分割和合并/合并,以进行简单的快速编辑。适用于Windows的基于FFmpeg的后端,使用Python3和出色的PyQt5 GUI框架编写。 VidCutter应用程序可用于拆...

drivery的专栏 1892

QuickCut视频剪辑软件:免费开源的全能视频处理神器,告别复杂操作

还在为视频处理烦恼吗?专业软件太复杂,免费软件有水印,手动操作太繁琐?QuickCut视频剪辑软件正是为你量身打造的开源解决方案!这款轻量级视频处理神器集压缩、转码、分割、合并、自动字幕等强大功能于一身,让普通人也能轻松完成专业级视频处理。无论是UP主、自媒体创作者还是普通用户,都能在3分钟内上手使用,彻底告别视频处理的烦恼。 ## 痛点分析:为什么你需要QuickCut? 在视频创作日益普及

gitblog_00026的博客 229

python视频处理的第三方库_Python视频编辑库MoviePy的使用

moviepy官网:是一个用于视频编辑的Python库:切割、连接、标题插入、视频合成、非线性编辑,视频处理和定制效果的创建。Github:MoviePyMoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频合成(又名非线性编辑),视频处理,和自定制效果。可以看gallery中的一些实例来了解用法。MoviePy可以读写所有的音频和视频格式,包括GIF,通过py...

weixin_39572168的博客 342

Rust+Tauri构建本地视频剪辑器的技术实践

视频剪辑软件本质上是音视频处理与交互界面的深度耦合系统。其核心原理在于帧级解码控制、GPU加速渲染与低开销跨语言通信。技术价值体现在隐私可控、离线运行、无水印导出及跨平台轻量部署,显著区别于Electron类框架的高内存占用和WebAssembly方案的性能瓶颈。典型应用场景包括内容创作者本地化剪辑、教育机构多媒体课件制作、以及对数据主权敏感的专业工作流。WolfCut项目正是基于Rust实现高性能音视频处理内核,并通过Tauri构建安全轻量桌面壳,验证了‘Rust做引擎、Tauri做壳、Web做交互’这一

weixin_33862993的博客 368

开源视频制作工具ZJT智剧通实战:从故事板到AI口型同步全流程指南

在视频制作与影视后期领域,故事板(分镜图)是视觉化剧本的核心工具,用于规划镜头序列、角色动作与时长,是沟通创意、控制成本的关键蓝图。其原理在于将叙事分解为连续的视觉单元,辅助团队预览节奏与效果。随着AI技术的发展,视频修改,特别是口型同步等需求,得以通过深度学习模型实现自动化,显著提升了配音替换、局部修正的效率。这为独立创作者和小型团队带来了专业级工作流程的技术价值。开源工具ZJT智剧通正是聚焦于此,它整合了故事板管理与AI辅助视频修改功能,提供了一个永久免费的一站式平台。其应用场景覆盖从分镜设计、项目规划

weixin_34026276的博客 435

VidCutter终极指南:三步掌握高效免费视频剪辑工具

VidCutter是一款现代、简单且跨平台的视频剪切与合并工具,专为普通用户和技术爱好者设计。这款开源软件提供了直观的界面和强大的功能,让你无需复杂的学习曲线就能完成专业的视频编辑任务。无论是快速剪辑家庭视频、制作社交媒体内容,还是处理教学素材,VidCutter都能提供流畅的体验。 ## 为什么选择VidCutter? 在众多视频编辑工具中,VidCutter以其独特的优势脱颖而出: -

gitblog_00073的博客 373

Python音频剪辑工具HzChopGUI:本地化GUI实现与批量处理实践

音频处理是多媒体技术的基础领域,涉及对声音信号的数字化采集、编辑与分析。其核心原理包括采样、量化、编码等数字信号处理技术,通过算法实现音频的切割、合并、转码等操作。在技术价值上,音频处理工具能够帮助内容创作者高效完成素材编辑,降低专业软件的学习成本,提升工作效率。常见的应用场景包括播客制作、短视频剪辑、教学课件音频处理等。本文聚焦于HzChopGUI这一Python实现的本地化音频剪辑工具,它通过图形界面降低了操作门槛,并支持通过脚本扩展实现批量处理功能,为轻量级音频编辑需求提供了实用的解决方案。

weixin_34326179的博客 420

Python中使用moviepy进行视频分割

场景 moviepy官网: https://pypi.org/project/moviepy/ 是一个用于视频编辑的Python库:切割、连接、标题插入、视频合成、非线性编辑,视频处理和定制效果的创建。 Github: https://github.com/Zulko/moviepy 实现 首先你需要安装moviepy 打开cmd输入: pip install moviepy ...

BADAO_LIUMANG_QIZHI的博客 2651
上一篇: python opencv 持续点选开始帧,结束帧,切割视频成几个小段
下一篇: pytorch dataset, dataloader demo
Deepcong
博客等级 码龄9年 8593粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值