GStreamer应用开发手册学习笔记之一

Gstreamer 应用开发:1-基础介绍 介绍开始围绕如何用命令实现一个音视频混合,或者单独的音频,和单独的视频文件如何实现播放,并逐步开始使用C语言程序来实现之前我们用命令行来实现的功能 阅读详情
Gstreamer应用开发手册

I. 介绍
GStreamer 是一个非常强大而且通用的流媒体应用程序框架。 
GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件。 
但是, 由于追求模块化和高效率, 使得GStreamer在整个框架上变的复杂, 也同时因为复杂度的提高, 
使得开发一个新的应用程序显得不是那么的简单。
这个指南试图帮助你了解GStreamer的框架(version 0.10.3.1)以方便你在GStreamer框架的基础上做开发。 
第一章节将重点关注如何开发一个简单的音频播放器, 通过对整个过程的讲解,力图使你能够理解有关GStreamer的一些概念。
在之后的章节中,我们将讨论一些关于媒体播放(playback)控制的高级问题, 这些问题包括了录音、录象和编辑等等。

第1章. 序言
本章将从技术的角度来描述本手册的总体结构。

1.1. GStreamer是什么 ?
GStreamer是一个创建流媒体应用程序的框架。
其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。
GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。
在编写处理音频、视频或者两者皆有的应用程序时, GStreamer可以让你的工作变得简单。
GStreamer并不受限于音频和视频处理, 它能够处理任意类型的数据流。
管道设计的方法对于实际应用的滤波器几乎没有负荷, 它甚至可以用来设计出对延时有很高要求的高端音频应用程序。
GStreamer最显著的用途是在构建一个播放器上。
GStreamer已经支持很多格式的文件了, 包括: MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、 mod等等。
从这个角度看,GStreamer更象是一个播放器。
但是它主要的优点却是在于: 它的可插入组件能够很方便的接入到任意的管道当中。
这个优点使得利用GStreamer编写一个万能的可编辑音视频应用程序成为可能。
GStreamer框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。
所有的插件都能够被链接到任意的已经定义了的数据流管道中。
GStreamer的管道能够被GUI编辑器编辑, 能够以XML文件来保存。这样的设计使得管道程序库的消耗变得非常少。
GStreamer核心库函数是一个处理插件、数据流和媒体操作的框架。
 GStreamer核心库还提供了一个API, 这个API是开放给程序员使用的---
当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它。

1.2. 谁需要读这个手册?
本手册是从一个程序开发人员的角度来描述GStreamer的: 
它叙述了如何利用GStreamer的开发库以及工具来编写一个基于GStreamer的应用程序。
对于想学习"如何编写插件"的朋友们, 我们建议你去参考<<插件编写指南(Plugin Writers Guide)>>。

1.3. 预备知识
为了更好的理解本手册的内容, 你应该具备基本的C语言基础。
由于GStreamer一直采用GObject编程模式, 所以本手册也假定你已经理解了GObject的基本概念。
你可能还需要一些GTK+和GDK的知识, 这方面的知识你可以参照Eric Harlow的书Developing Linux Applications with GTK+ and GDK。
另外, 当你读完本手册后, 请读一下GStreamer Plugin Writer's Guide。 
当然,你还需要关注一下其它的GStreamer文档。

1.4. 本手册结构
为了帮助你更好的学习本手册, 我们将本手册分为几个大的部分, 
每一部分阐述了一个在GStreamer应用程序开发过程中特殊而又有用的话题。
如下所示:
Part I --- GStreamer 应用程序开发手册 (0.10.9.1)给你一个关于GStreamer总的概况叙述。
Part II --- GStreamer 应用程序开发手册 (0.10.9.1)阐述GStreamer应用程序开发的基本概念。
           本章结束后, 你将可以使用GStreamer来开发你自己的音频播放器。
Part III --- GStreamer 应用程序开发手册 (0.10.9.1)我们将继续讨论一些有关GStreamer深层次的主题, 
这些主题告诉了我们为什么GStreamer能在众多的竞争者当中脱颖而出。
我们将使用动态参数和动态接口来讨论应用程序中管道的交讯问题, 我们还将讨论线程同步、时钟同步、以及其他同步问题。
这些问题的讨论不仅向你讲述如何使用GStreamer的API, 
而且还将告诉你一些基于GStreamer应用程序开发过程中所经常遇到的问题的解决办法,
 通过这些知识的学习使你更加深刻的理解GStreamer的基本概念。

​Part IV --- GStreamer 应用程序开发手册 (0.10.9.1)我们将进入GStreamer 的高级编程领域。
你不需要对GStreamer所有的细节都了解清楚,但是基本的GStreamer概念仍然是需要的。
我们将讨论XML、playbin、 autopluggers等话题。
​
​Part V --- GStreamer 应用程序开发手册 (0.10.9.1)你将学习到一些有关GStreamer与GNOME、KDE、OS、X或者Windows集成的知识, 

当然你还将学习到一些有关调试和如何处理常见问题的方法。通过这些知识的学习, 将更好的方便你使用GStreamer 

第2章. 动机和目标
从历史的角度来看,Linux在多媒体方面已经远远落后于其他的操作系统。
Microsoft's Windows 和Apple's MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。
另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在专业级别的软件上与MS Windows 和MacOS去竞争。
GStreamer正是为解决Linux多媒体方面当前问题而设计的。


2.1. 当前的问题
我们描述了当今Linux平台下媒体处理的一些典型问题。


2.1.1. 大量的代码复制
对于那些想要播放一个声音文件的Linux用户来说,他们必须搜索各种声音播放器来播放不同格式文件,
而在这些播放器中,大部分的都一遍又一遍地重复使用了相同的代码。
对于那些想在应用程序中嵌入视频剪辑的Linux开发人员来说,他们必须要用粗略的hacks来运行外部的视频播放器,
因为没有一套可用的库提供给开发人员来创建可定制的播放器。


2.1.2. “一个目标”媒体播放器/媒体库
典型的MPEG播放器可以播放MPEG视频和音频,多数的播放器实现了完整的底层构造来达到他们的唯一目标:播放。
没有一套有效的机制可以提供对于音频和视频数据过滤和效果处理,更没有制定在视频或音频数据中添加滤波器或特殊效果的任何规定。
如果你希望将MPEG-2视频流转为AVI文件,那么你的最佳选择是,将所有的MPEG-2解码算法从播放器分离出来,并复制到你的AVI编码器中,因为这类算法不能简单的在应用程序之间共享。
开发人员曾经尝试着创建一个可以处理多种媒体类型的库,但由于缺乏通用的API,所以如何集成就成了重要的工作了。
因为在集成的过程中,我们需要关注一些特殊的媒体类型(avi文件,libmpeg2,...),而集成这些媒体类型文件需要一个统一的接口。
GStreamer允许将这些库与通用的API一起打包,这样就简化了集成和复用。


2.1.3. 没有统一的插件管理机制
典型的播放器对于不同的媒体类型会有不同的插件,两个媒体播放器会实现各自不同的插件机制,
所以编解码器不能方便的交换。每一个典型的媒体播放器的插管理件系统是具有其特定应用程序的需求。
缺少统一的插件机制,已经严重阻碍了二进制编解码器的发展,因为没有一家公司希望将代码移植到不同的插件机制。
GStreamer当然也采用自己的插件系统,它为插件开发者提供了一个非常丰富的框架,从而保证这些插件能够广泛应用,
并与其他插件能够无缝的交互。GStreamer为插件提供的框架是非常灵活,它足以满足大多数插件的需求。


2.1.4. 拙劣的用户感
因为上述问题的原因,使得应用程序开发人员将相当多的时间花在如何处理后端、插件机制等等问题上。
从而耽误了大部分的项目时间,这样就常常导致后端和用户界面都只完成了一半,于是就导致了拙劣的用户感。


2.1.5. 没有网络透明度的规定
当前还没有一个底层框架出现,来允许对网络透明媒体的操作。
有趣的是,一个分布式的MPEG编码器能够复制非分布式编码器的相同的算法。
并没有关于使用 GNOME 和 KDE 桌面平台的技术的规定被制定出来,因为GNOME 和 KDE 桌面平台本身还在改进和完善,
所以很难将多媒体恰当地集成到很多用户的环境中。注意到GStreamer还提供很多种方法,
这些方法提供将GSreamer与不同的桌面系统进行集成(见附录里的集成一节),而这些方法往往都不是网络透明化。
GStreamer内核在最底层没有采用网络透明技术,只是在顶层加了作为本地使用,
这就是说,创建一个核心组件的包就变得比较容易了。GStreamer允许管道在TCP协议上分离,
使用tcp插件来实现GStreamer数据协议,这个被包含在gst-plugins模块,目录gst/tcp


2.1.6. 与Windows™的产品还存在差距
我们要想看到Linux桌面系统的成功就要立足于可靠的媒体处理。
我们必须为商业编解码器和多媒体应用扫清障碍,这样Linux才能成为多媒体领域的一个选择。


2.2. 设计目标
我们将阐述在GStreamer开发中的目标.


2.2.1. 结构清晰且威力强大
GStreamer提供一套清晰的接口给以下一些开发人员:
希望构建媒体管道的应用程序员。程序员可以使用一系列强有利的工具来创建媒体管道,而不用去写一行代码,
从而使得复杂的媒体控制变得非常简单。
插件程序员。GStreamer向插件程序员提供了简洁而简单的API来创建self-plugin(自包含)插件,
同时还集成了大量的调试和跟踪机制和工具。GStreamer也提供了一系列现实例子。


2.2.2. 面向对象的编程思想
GStreamer是依附于GLib 2.0对象模型的,熟悉GLib或者旧版本的GTK+的程序员对GStreamer将会驾轻就熟。
GStreamer采用了信号与对象属性的机制。
所有对象的属性和功能都能在运行态被查询。
GStreamer与GTK+的编程方法非常相似,需要对象模型,对象所有(ownership of objects),参考计算(reference counting)...


2.2.3. 灵活的可扩展性能
所有的GStreamer对象都可以采用GObject继承的方法进行扩展。
所有的插件都可以被动态装载,可以独立的扩展或升级。


2.2.4. 支持插件以二进制形式发布
作为共享库发布的插件能够在运行态直接加载,插件的所有属性可以由GObject属性来设置,而无需(事实上决不)去安装插件的头文件。
我们更多的关注在插件能够独立化,运行的时候还需要很多与插件相关的因素。


2.2.5. 高性能
高性能主要体现在:
   .  使用GLib的g_mem_chunk和非模块化分配算法使得内存分配尽可能最小。
   .  插件之间的连接非常轻型(light-weight)。
      数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。
   .  提供了一套对目标内存直接进行操作的机制。
      例如,插件可以向X server共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。
   .  refcounting和写拷贝将memcpy减少到最低。子缓冲区有效地将缓冲区分离为易于管理的块。
   .  使用线程联合(cothreads)减少线程消耗。
      线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗600个cpu周期的标准。
   .  使用特殊的插件从而支持硬件加速。
   .  采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。
   .  所有的判断数据都不用互斥锁。


2.2.6. 核心库与插件(core/plugins)分离
GStreamer内核的本质是media-agnostic,我们了解的仅仅是字节和块,以及包含基本的元件,
GStreamer内核的强大功能甚至能够实现底层系统工具,像cp。
所有的媒体处理功能都是由插件从外部提供给内核的,并告诉内核如何去处理特定的媒体类型。


2.2.7. 为多媒体数字信号编解码实验提供一个框架
GStreamer成为一个简单的框架,编解码器的开发人员可以试验各种不同的算法,
提高开源多媒体编解码器开发的速度,如Theora and Vorbis。 


​


【gstreamer】入门介绍 gstreamer 概念介绍 阅读详情

相关推荐

从零开始成为GStreamer专家——基于Windows的GStreamer从源码下载、编译到开发

写一个自己的Hello,Word! 代码下载 一、GStreamer下载 到Sign up · GitLabfreedesktop.org GitLab loginhttps://gitlab.freedesktop.org/users/sign_up上注册一个用户。 在PC机上用ssh-keygen -t rsa -C "yourname@yourhost.com"生成id_rsa.pub值,把这个值贴到下面Key框里,如果这一步不会,请搜索参考ssh-keygen的用法。 git clo...

intel1985的专栏 1万+

Gstreamer基础讲解

gstreamer介绍

qq_37117214的博客 1万+

Gstreamer应用开发手册1:关于Gstreamer

在之前的Gstreamer基础教程中,介绍了gstreamer基础相关的知识,目的是起到入门的作用。接下来在应用开发手册系列教程中,将更多的从技术角度,介绍更多的概念和功能,起到更好的学习效果。 1 什么是gstreamer GStreamer 是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了 DirectShow 的设计思...

ZONGXP的博客 2695

Gstreamer概述

Gstreamer概述

jinking01的专栏 4261

Gstreamer应用开发手册13:管道中添加删除数据

手动在管道中添加/删除数据 许多人希望使用自己的源将数据注入到管道中,也有人希望获取管道的输出并在应用程序中处理它。强烈建议不要使用这些方法,但GStreamer会为它们提供支持。由于没有基类的任何支持,因此你需要彻底了解状态更改和同步。如果它不起作用,则有百万种方法可以使自己陷入困境。最好只编写一个插件并让基类对其进行管理。有关此主题的更多信息,请参见《插件编写者指南》。 你可以将两个可能的...

ZONGXP的博客 3666

Gstreamer应用开发手册8:缓冲

缓冲 缓冲的目的是在管道中累积足够的数据,以便可以流畅地进行播放而不会中断。从(慢速)非实时网络源读取数据时通常可以完成此操作,但也可以用于实时资源。 GStreamer为以下用例提供支持: 开始播放之前,在内存中缓冲多达特定数量的数据,以使网络波动最小化。请参阅流缓冲。 通过快速搜索下载的数据将网络文件下载到本地磁盘。这类似于quicktime / youtube播放器。请参阅下载缓冲。...

ZONGXP的博客 2121

GStreamer应用开发手册学习笔记之二

第3章. 基础概念介绍 本章将介绍GStreamer的基本概念。 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念。 3.1. 元件(Elements) 元件(element)是GStreamer中最重要的概念。 你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传...

北雨南萍 1336

【AI助力科研】不看一篇文献,手把手教你用chatGPT写文献综述!

这篇文章以【AI助力科研】为题,介绍了如何利用ChatGPT编写文献综述的方法。作者通过详细的指导,展示了不需要阅读大量文献,只需依靠ChatGPT模型即可完成文献综述的过程。该方法旨在提高科研工作者的效率,减少阅读负担,并且能够生成具有逻辑性和准确性的文献综述。

研究方向//图像视频处理/信号算法/红外无损检测/数值仿真/机器学习/优化算法/python/matlab 2万+

【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍

第3章. 基础概念介绍 本章将介绍GStreamer的基本概念。 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念。 3.1. 元件(Elements) 元件(element)是GStreamer中最重要的概念。 你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传输。

ZhangPY的专栏 1183

ctfshow WEB web4

ctfshow WEB web4

weixin_68416970的博客 722

瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程

本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。

weixin_28705087的博客 275

Gstreamer学习笔记

Gstreamer框架图

Teader的博客 335

自组织映射神经网络(SOM)

目录 1 背景:自组织(竞争型)神经网络 2竞争学习的概念与原理 2.1 竞争学习的步骤 2.2 示例 3SOM典型结构 4SOM网的权值调整域 5 SOM Kohonen 学习算法 6 SOM示例 7SOM设计细节 7.1输出层设计 7.2输出层节点排列的设计 7.3 权值初始化问题 7.4学习率的设计 7.5设计拓扑领域 8SOM功能分析 8.1 保序映射 8.2数据压缩 8.3 特征提取 9自组织映射神经网络与K均值算法的区别...

weixin_39910711的博客 1万+

Gstreamer应用开发手册:您的多媒体开发利器

Gstreamer应用开发手册:您的多媒体开发利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在多媒体处理领域,Gstreamer 是一个强大且灵活的开源框架,广泛应用于音视频流的处理、编码、解码等任务。为了帮助开发者更好地掌握 Gstreamer 的应用开发,我们推出了 Gstreamer应用开发手册-Alan.pdf。这份手册是 Gstreamer 官方文档的...

gitblog_06686的博客 981

破盾实录|Vueling航空阿卡迈防护逆向:从503挑战到Cookie生成的全流程拆解

摘要:文章分享了作者在爬取西班牙伏林航空(Vueling)机票数据时,遭遇阿卡迈(Akamai)防护系统的实战经历。起初简单的请求被拦截返回503错误,分析发现阿卡迈通过混淆JS代码实施"挑战-验证"机制,需模拟真实浏览器环境才能获取有效Cookie。作者详细拆解了逆向过程:从抓包分析JS挑战流程,到破解代码混淆和控制流平坦化,最终用Python+Pyppeteer成功模拟浏览器特征,突破防护获取数据。整个过程涉及JS反混淆、环境检测绕过和Cookie生成验证等关键技术点,为类似防护系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1643

Three 之 three.js (webgl)绘制物体模型尺寸虚线包围框工具简单封装 DashLinesBoxTool

Three js 开发的一些知识整理,方便后期遇到类似的问题,能够及时查阅使用。本节介绍, three.js (webgl) 中绘制物体模型尺寸虚线包围框工具简单封装 DashLinesBoxTool,主要是给实物绘制线框,有点像AI 识别正方形包裹框的效果。其中,如果有不足之处,欢迎指出,或者你有更好的方法,欢迎留言。

仙魁XAN 2106

Gstreamer应用开发手册下载

Gstreamer应用开发手册下载 去发现同类优质开源项目:https://gitcode.com/ 资源介绍 本仓库提供了一个名为 Gstreamer应用开发手册-Alan.pdf 的资源文件下载。该手册是Gstreamer应用开发的官方翻译版本,内容详实,适合开发者学习和参考。 文件信息 文件名: Gstreamer应用开发手册-Alan.pdf 页数: 88页 章节数: 14章 特点: 包...

gitblog_06637的博客 355

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

Python Gstreamer入门-学习笔记

Python Gstreamer入门-学习笔记   历时一个月的Python Gstreamer入门阶段接近尾声,在这里总结一下自己的学习历程。首先感谢一下Andy同学和Stephen老师的帮助和指导。 1.基础知识学习阶段   首先需要了解Gstreamer是什么,有哪些基本的内容,element、pad、bin、pipeline各是什么,其中又有哪些分类。这里推荐Gsteamer的官方文档进行...

小平爱吃肉的博客 1万+

手把手教你玩转CPU微架构专栏--​​​​1.5 工具准备:用Gem5模拟器“看见”微架构(安装、基础仿真命令)​

本文介绍了如何使用Gem5模拟器进行微架构学习和实验。Gem5是一款支持多种指令集的开源微架构模拟器,可模拟CPU流水线、缓存等核心组件。文章详细说明了在Ubuntu和macOS上安装Gem5的步骤,包括依赖安装、源码编译和验证方法。通过一个简单的加法指令测试程序,演示了如何运行基础仿真并解读输出日志,包括指令执行流程和性能统计数据。此外,还提供了两个实战实验:修改L1缓存大小和观察分支预测失败,帮助读者理解微架构参数对性能的影响。最后指出Gem5是学习微架构的"显微镜",能直观观察指令

xiaoheshang_123的博客 140

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

GStreamer应用程序开发手册(中文)下载仓库

GStreamer应用程序开发手册(中文)下载仓库 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到GStreamer应用程序开发手册的下载仓库!本仓库提供了《GStreamer应用程序开发手册(中文)》的完整版下载,旨在帮助开发者深入了解GStreamer框架,进而开发出高性能的多媒体应用。 手册简介 《GStreamer应用程序开发手册(中文)》涵盖了GStreame...

gitblog_06791的博客 837

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【亲测免费】 GStreamer中文开发手册

GStreamer中文开发手册 【下载地址】GStreamer中文开发手册分享 GStreamer中文开发手册欢迎来到GStreamer中文开发手册的下载页面!本手册是专为那些对GStreamer多媒体框架感兴趣,希望深入了解并进行开发的朋友们准备的一份宝贵资源 ...

gitblog_06632的博客 1227

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

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

上一篇: Ubuntu上安装与配置JDK1.8
下一篇: GObject对象系统
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值