PSI与SI

1     缩写(Abbreviation)... 1

2     基本概念... 3

2.1      传输流(TransportStream / TS).. 3

2.2      网络(network).. 3

2.3      业务(service).. 3

2.4      业务群(bouquet).. 3

2.5      事件(event).. 4

2.6      组件(Component).. 4

2.7      PSI / SI4

3     PSI/SI表的结构... 5

3.1      table、sub_table和section. 5

3.2      section. 5

3.2.1    section_header6

3.2.2    descriptor6

3.2.3    table_loop. 7

4     PSI / SI表... 8

4.1      PMT(ProgramMap Table).. 8

4.2      PAT(Program Association Table )9

4.3      CAT(Conditional Access Table )9

4.4      NIT(Network Information Table )10

4.5      SDT(Service Description Table )11

4.6      EIT (Event Information Table )11

4.7      BAT( Bouquet Association Table )12



1       缩写(Abbreviation

缩写词

全称

中文意思

MPEG

Motion Picture Expert’s Group

运动图象专家组

DVB

Digital Video Broadcasting

数字视频广播

IRD

Integrated Receiver Decoder

综合接收解码器

PSI

Program Specific Information

节目说明信息

SI

Service Information

业务信息

CAT

Conditional Access Table

条件接收表

PAT

Program Association Table

节目关联表

PMT

Program Map Table

节目映射表

EIT

Event Information Table

事件信息表

NIT

Network Information Table

网络信息表

SDT

Service Description Table

业务描述表

TDT

Time and Date Table

时间/日期表

BAT

Bouquet Association Table

业务群关联表

RST

Running Status Table

运行状态表

TOT

Time Offset Table

时间偏移表

uimsbf

unsigned integer most significant bit first

bslbf

bit string, left bit first


2       基本概念

2.1      传输流(TransportStream / TS

传输流是MPEG II规范的系统层提出的、对多路节目进行复用的两种方案之一,它主要针对非可靠信道的传输(另一种方案——节目流是针对可靠信道的传输而提出的),比如卫星信道、微波信道和CATV信道。传输流这种机制可将多路节目复用成一个流,并且,同一节目还可以包含多个视频和音频流。

组成传输流的是一系列连续的数据包,简称TS包。TS包的长度固定,一般是188字节。如果在这种TS包的尾部加入16字节的RS纠错码,则包长为204字节。

传输流的形成过程可以用图2.1来说明。组成节目的视频流和音频流经过基础流编码器之后,形成基本流,每一路视频流或音频流对应一路基本流。基本流经过打包,形成PES包流。每一个PES包都有流标识、用于视、音频解码和播放同步的时戳PES包和其它的数据、控制信息经过复用器,形成TS

每一个TS包都有一个包标识PID,同一基础流对应的TS包,PID的值相同。TS流就是通过对各个基础流分配不同的PID号来唯一的标识各个不同的基础流、信息表和其它数据。每一个TS包最多只能传输一路基础流的内容。

图2.1 传输流系统框图

 

为了实现众多编码器与解码器直接的时钟同步,防止解码器的缓冲发生上溢或下溢,在系统流中加入了一个精确的系统级时间参考值,在TS流中,这个值被称为节目参考时钟PCR。在解码器端,当检测到本地系统时钟和PCR所表征的时钟不一致时,解码器将调整本地系统时钟。

2.2      网络(network

一个传输系统,可以传输一组MPEG II 码流。网络使用network_id 来进行标识,不同运营商所运营的网络,对应的network_id不同。

2.3      业务(service

在广播者的控制下,可以按照时间表分步广播的一系列节目。一个业务可以理解为一个逻辑意义上的频道。使用 service_id 来标识一个业务。同一个传输流中,service_id必须唯一。

2.4      业务群(bouquet

一个业务群是一系列业务的集合。这些业务可以来自不同的TS流甚至不同的网络。业务群的概念可以这样来理解:假设有两个业务提供商PA和PB,PA提供了10套节目,PB提供了20套节目。但是,对于某一个地域的用户,只希望他们收到PA提供的3套节目和PB提供的5套节目。此时,可以将这些节目组成一个业务群。

2.5      事件(event

一组属于普通业务的广播数据流,它定义了起始时间和结束时间,一个事件就是一个节目,更确切的说,是一个节目段。例如:一场足球比赛的半场,新闻快报,娱乐表演的第一部分。

2.6      组件(Component

组件是组成节目段的一个或多个实体,对应“传输流”概念中的基础流。

 

以上概念之间的关系如图2.2所示。

图2.2

2.7      PSI / SI

在MPEG II标准的系统部分重点描述了MPEG II系统级传输流中包含的PSI信息。PSI描述了传输流所携带的内容,包含了对构建各节目的基本流的描述和对节目本身的描述。为了给IRD提供更多的接收和解码所需信息,支持更复杂的应用,DVB又准备了一个开放的服务信息系统(DVB-SI)来辅助DVB信号。SI可以描述由某一播放者提供的每一个服务的技术特征及其他的信息,通过SI的帮助,用户可以在传输流中选择服务或事件,机顶盒使用SI信息能完成自动配置和自动接收。

所有的PSI/SI信息都以表的形式从中心系统广播下来,表中包含了整个广播网络的物理特征和节目信息,所有这些表在传输时,都将被封装在大小固定的被称为段(section)的数据块中。


3       PSI/SI表的结构

3.1      table、sub_table和section

PSI表包括CAT、PAT、PMT,SI表包括NIT、SDT、EIT、BAT、TDT、TOT、RST等。从结构上来说,这些表都由一个或多个子表组成,而子表又进一步由一个或多个section组成。section最初是在MPEG II中定义的语法结构,在从PSI表到TS包的转换过程中,section起到了中介的作用。DVB在扩展PSI为SI的时候,沿用了这种语法结构。

PSISI表的框架如图3.1所示:

图3.1 Table、SubTable和Section的结构关系

 

不同的表之间可以通过表标识(table_id)进行区分,属于同一个table_id的不同子表一般通过表的扩展标识(table_id_extension)、版本号(version_number)进行区分,对于EIT和SDT的子表,还要加上其它的条件。这些用于区分子表的“域”(field)在每一个具体的表中都作了定义。

3.2      section

一个比较一般的section结构如图3.2所示。

图3.2 section的结构

 

在section_header部分包含了用于区分子表的“域”(field);section_header之后可能有第一层描述符循环和表循环,一个表循环之中又可能再次包含描述符循环(习惯上称为第二层描述符循环)。所谓“循环”,就是指相同或类似的数据结构重复出现。“other_fields”位置处一般会有一个数据用于指示表循环结构的长度(以字节为单位),“section_tail”处一般是一个32位的CRC校验位。

3.2.1      section_header

section_header的语法结构如表3.1所示。

 

表3.1 section_header 语法结构

Syntax

No. of bits

Identifier

Remark

section_header {

 

 

 

         table_id

uimsbf

 

         section_syntax_indicator

bslbf

 

         reserved_future_use

bslbf

 

         reserved

bslbf

 

         section_length

12 

uimsbf

 

         table_id_extension

16 

uimsbf

If section_syntax_indicator = 1

         ……

 

 

 

         version_number

uimsbf

If section_syntax_indicator = 1

         current_next_indicator

bslbf

If section_syntax_indicator = 1

         section_number

  uimsbf

If section_syntax_indicator = 1

         last_section_number

  uimsbf

If section_syntax_indicator = 1

         ……

 

 

 

}

 

 

 

 

不同的PSISI表具有不同的table_id,在文档En300468中,有PSISI表和table_id的对应关系。

section_syntax_indicator最早在MPEG II中使用,主要用于“私有数据表”(private data table),其值为0和1的时候,私有数据表的结构不同。DVB中也使用了section_syntax_indicator,当它的值为1时,section的第四、第五个字节表示table_id_extension,并且从section第43位开始的5位表示子表的版本号(version_number),第48位表示当前表是否有效(current_next_indicator),第7个字节表示当前section的编号(section_number),第8个字节记录子表中section_number的最大值。

section_length表示从section的第四字节开始到section结束的数据区的字节长度。对于一般的PSISI表,section_length的最大值为1024;对于EIT表,section_length的最大值为4096。

当section_syntax_indicator的值为1时,section的第四、第五字节表示table_id_extension,对于不同的表,table_id_extension的物理意义不同。PSISI表中有两个表例外,即PSI表中的CAT表和SI表中的ST表。这两个表都没有table_id_extension,但CAT表的section_syntax_indicator必须是1,ST表的section_syntax_indicator可以为0,也可以为1。

当section_syntax_indicator的值为1时,从section第43位开始的5位表示子表的版本号(version_number)。version_number的值从零开始,每当子表内容改变时,version_number的值加1。当version_number增加到31后,再次回归到零。

当section_syntax_indicator的值为1时,section的第48位表示当前表是否有效(current_next_indicator)。如果current_next_indicator的值为1,表示当前表有效,为0,表示当前表无效,下一个表有效。

3.2.2      descriptor

一个descriptor是一个语义上比较完整的语法结构,用于提供特定的信息,比如,network_name_descriptor用于描述一个网络名称,service_descriptor用于描述一个业务的类型、业务提供商的名称和业务名称。

所有的descriptor都以一个8位的标识:descriptor_tag开使,后面紧跟一个8位的数表示从descriptor的第3个字节开始到descriptor结束的数据区的字节长度。从descriptor的第3个字节开始到descriptor结束的数据是各个descriptor的具体内容。如表3.2所示。

 

表3.2  descriptor结构示意

Syntax

No. of bits

Identifier

PSISI_descriptor() {

 

 

         descriptor_tag

uimsbf

         descriptor_length

uimsbf

         descriptor_content

 

 

}

 

 

descriptor_tag的值可以从0~255,其中,0、1保留,2~18是PSI中定义的描述符,19~63保留,64~110是SI中定义的描述符,111~127保留,128~254可以定义私有描述符,255禁用。如图3.3所示。

图3.3 descriptor_tagallocation

为了叙述方便,下文将descriptor_tag值在2~18的描述符称为PSI描述符,将descriptor_tag值在64~110的描述符称为SI描述符。

同一个descriptor可能位于不同的PSISI表中,也可能位于同一个PSISI表的第一和(或)第二层描述符序列中。文档IS13818没有规定PSI描述符在PSI表中可能出现的位置。可以认为,PSI描述符可以出现在PSI表中的任何位置,只要该描述符对于该PSI表是有特定意义的。

文档En300468的表12描述了SI描述符在PSISI表中可能出现的位置,在文档Etr211中,详细规定了各个SI表中允许出现的SI描述符。对于某一个特定的SI表,在section中的特定位置,只能出现特定的SI描述符,其它描述符在这个位置出现都是没有意义的。

3.2.3      table_loop

table_loop对应于特定的PSISI表,不同PSISI表的table_loop结构上不同,具有不同的含义。例如,NIT表的table_loop对应特定网络中的传输流,传输流的个数等于NIT中table_loop的个数;SDT表的table_loop对应特定传输流中的业务(service),service的个数等于SDT中table_loop的个数。

图3.4是对本节的总结。

图 3.4  PSI / SI结构

4       PSI / SI

4.1      PMT(Program MapTable)

现在回顾一下图2.1,在节目发送端,一个节目(用program_number标识)可以由音频流、视频流组成,视、音频流经过处理,形成TS包之后,对应的TS包便带上了PID信息。不同的视、音频流对应的PID值不同。

PMT描述了当前TS流中节目的视、音频PES流和PCR 的PID,PMT的个数等于当前TS流中节目的个数。通过PMT,可以从MPEG II传输流中提取指定节目的基本流并予以解码重放。

PMT的语法结构如表4.1所示。

 

表4.1 PMT语法结构

Syntax

No. of bits

Identifier

program_map_section(){

 

 

         table_id

 8 

uimsbf

         section_syntax_indicator

  1 

bslbf

         reserved_future_use

bslbf

         reserved

bslbf

         section_length

12 

uimsbf

         program_number

16 

uimsbf

         reserved

bslbf

         version_number

uimsbf

         current_next_indicator

1  

bslbf

         section_number

uimsbf

         last_section_number

uimsbf

         reserved

bslbf

         PCR_PID

13 

uimsbf

         reserved

bslbf

         program_info_length

12 

uimsbf

         for(i=0;i<N;i++){

 

 

                  descriptor()

 

 

         }

 

 

         for(i=0;i<N;i++){

 

 

                  stream_type

uimsbf

                  reserved

bslbf

                  elementary_PID

13 

uimsbf

                  reserved

bslbf

                  ES_info_length

12 

uimsbf

                  for(j=0;j<N;j++){

 

 

                           descriptor()

 

 

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

表中的program_number用于标识当前节目,PCR_PID指示带有当前节目PCR信息的TS包的PID,PMT循环结构的个数等于组成该节目的视、音频流的个数,每一个循环结构和组成该节目的一个视频或音频流对应,stream_type说明流的类型,elementary_PID指示带有流数据的TS包的PID。

收到节目的PMT后,可以根据PCR_PID获得PCR,实现接收端和发送端的时钟同步;根据每个表循环中的elementary_PID获得相应基础流的数据,重现节目。

PMT的接收同样是根据PID来实现的,PID的值从下面的PAT中获得。

4.2      PAT( Program Association Table)

PAT表规定使用PID = 0的TS包来传送,它列出了所属TS流中所有节目的编号,以及各编号节目所对应的PMT的PID。根据列出的PID,接收端就可以获得所有的PMT表。PAT如表4.2所示。

 

表4.2  PAT语法结构

Syntax

No. of bits

Identifier

program_association_section(){

 

 

         table_id

uimsbf

         section_syntax_indicator

bslbf

         “0”

bslbf

         reserved

bslbf

         section_length

12 

uimsbf

         transport_stream_id

16 

uimsbf

         reserved

bslbf

         version_number

uimsbf

         current_next_indicator

bslbf

         section_number

uimsbf

         last_section_number

uimsbf

         for(i=0;i<N;i++){

 

 

                  program_number

16 

uimsbf

                  reserved

bslbf

                  if(program_number == 0){

 

 

                           network_PID

13 

uimsbf

                  else{

 

 

                           program_map_PID

13 

uimsbf

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

在PAT的表循环中,一般有一个program_number值为0的循环,该循环中包含了NIT表的PID的信息;其它的循环中都是一个节目对应PMT的PID。

如果要收看的节目属于条件接收节目,接收端还必须提取PSI中的条件接收表,利用其中的信息对被加扰的节目进行解扰。

4.3      CAT( Conditional Access Table )

CAT表使用PID = 0x0001的TS包来传送,其语法结构如表4.3所示。

 

表4.3  CAT表(左)和CA_descriptor(右)的语法结构

 

Syntax

No. of bits

Identifier

conditional_access_section(){

 

 

         section_header

 

 

         for(i=0;i<N;i++){

 

 

                  descriptor()

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

Syntax

No. of bits

Identifier

CA_descriptor() {

 

 

         descriptor_tag

8

uimsbf

         descriptor_length

8

uimsbf

         CA_system_ID

16

uimsbf

         reserved

3

bslbf

         CA_PID

13

uimsbf

         for ( i=0; i<N; i++) {

 

 

                  private_data_byte

8

uimsbf

         }

 

 

}

 

 

 

CAT表的信息在描述符CA_descriptor中,CA_system_ID用于标识CA系统,CA_system_ID的值是统一分配的,在文档ETR162中可以查到;条件接收节目在编码的时候,相应CA系统的EMM(entitled management message)或ECM(entitled controlmessage)信息也同时通过TS包发出,CA_PID用于指示这些TS包的PID。

一旦某一个CA系统参与了加扰工作,在CAT中就有一个CA_descriptor用于描述该CA系统。

4.4      NIT( Network Information Table)

NIT传输与复用器/传输流(TS )的物理结构有关的信息,以及网络本身的特点。在MPEG II中,NIT属于私有表,传送NIT的TS包的PID可以在0x0010~0x1FFF之间选择,因此,PAT表中专门有一个program_number = 0的循环用于指示传送NIT的TS包的PID;在DVB中对NIT作了进一步的定义,并且规定,NIT信息必须使用PID = 0x0010的TS包传送,这样,接收NIT时就不需要从PAT中查找其PID,而直接去PID = 0x0010的TS包中接收即可。NIT的语法如表4.4所示。

 

表4.4  NIT语法结构(部分)

Syntax

No. of bits

Identifier

network_information_section(){

 

 

         table_id

 

         network_id

16 

uimsbf

         for(i=0;i<N;i++){

 

 

                  descriptor()

 

 

         }

 

 

         reserved_future_use

bslbf

         transport_stream_loop_length

12 

uimsbf

         for(i=0;i<N;i++){

 

 

                  transport_stream_id

16 

uimsbf

                  original_network_id

16 

uimsbf

                  reserved_future_use

bslbf

                  transport_descriptors_length

12 

uimsbf

                  for(j=0;j<N;j++){

 

 

                           descriptor()

 

 

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

其中,table_id的取值可以是0x40或0x41,当table_id = 0x40时,表示NIT描述的是当前网络的信息;table_id = 0x41时,NIT描述的是其它网络的信息。,DVB规定,table_id = 0x40的NIT表必须发出。

network_id是NIT描述的网络的标识。

NIT表的每一个表循环用于描述network_id指定网络中的一个TS流。从表循环的结构可以看出,一个TS流是用ts_id和original_network_id来唯一标识的。考虑下面的情况:假设在网络A(network_id = NID_A)和网络B(network_id = NID_B)中分别产生了一路TS流TS_A和TS_B,它们的ts_id相同,都是TS_ID_AB。当TS_A和TS_B各自在独立的网络中传输时,没有问题。但如果这两路TS流传输到了同一个网络中时,只根据ts_id来标识它们就出现了问题,很显然,TS_A和TS_B是不同的TS流,但它们的ts_id是相同的。所以,为了唯一的标识TS流,引入了original_network_id,表示TS流产生的网络。这样,对于上面的情况,TS_A的标识是[ NID_A, TS_ID_AB ],TS_B的标识是[ NID_B, TS_ID_AB ],TS流不同,标识也不同。

在NIT的第二层描述符序列中,可以使用一个叫service_list的描述符列出相应TS流中所有的业务。service_list_descriptor的语法如表4.5所示。

表4.5   service_list_descriptor语法结构

Syntax

No. of bits

Identifier

service_list_descriptor(){

 

 

         descriptor_tag

  8 

uimsbf

         descriptor_length

uimsbf

         for (i=0;i<N;I++){

 

 

                  service_id

16 

uimsbf

                  service_type

uimsbf

         }

 

 

}

 

 

 

在描述符的循环结构中,列出了所有业务的标识和类型。

4.5      SDT( Service Description Table)

SDT表使用PID = 0x0011的TS包传送,其语法结构如表4.6所示。

 

表4.6   SDT语法结构(部分)

Syntax

No. of bits

Identifier

service_description_section(){

 

 

         table_id

uimsbf

         transport_stream_id

16 

uimsbf

         original_network_id

16 

uimsbf

         for(i=0;i<N;i++){

 

 

                  service_id

16 

uimsbf

                  reserved_future_use

bslbf

                  EIT_schedule_flag

bslbf

                  EIT_present_following_flag

bslbf

                  running_status

uimsbf

                  free_CA_mode

bslbf

                  descriptors_loop_length

12 

uimsbf

                  for(j=0;j<N;j++){

 

 

                           descriptor()

 

 

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

SDT用于描述由 [ ts_id, original_network_id ] 确定的TS流中所有service的信息,TS流可以是当前TS流或者其它的TS流。当table_id取值为0x42时,SDT对应当前的TS流;当table_id取值为0x46时,SDT对应其它的TS流。DVB规定,table_id为0x42的SDT表必须发出。

SDT表循环结构的个数等于TS流中service的个数,service_id和ts_id、original_network_id一起,用于唯一确定一个service。DVB建议,一旦某一个service被分配了一个service_id之后,这个service_id应该保持不变,这样有利于IRD提供一些诸如“favourate channel”之类的功能。running_status标识service的状态,free_CA_mode标识service中是否含有经过加扰的event。

4.6      EIT ( Event Information Table )

EIT表描述由 [ original_network_id, ts_id, service_id ] 所标识的service中的event信息,对于每一个service,都有一个EIT子表和它对应。一个EIT表循环结构的对应于service中的event,当event的数目大于1时,这些event按照起始时间的先后顺序排列。

EIT表使用PID = 0x0012的TS包传送,其语法结构如表4.7所示。

表4.7  EIT表语法结构

Syntax

No. of bits

Identifier

network_information_section(){

 

 

         table_id

uimsbf

         service_id

16 

uimsbf

         transport_stream_id

16 

bslbf

         original_network_id

16 

uimsbf

         segment_last_section_number

 

         last_table_id

 

         for(i=0;i<N;i++){

 

 

                  event_id

16 

uimsbf

                  start_time

40 

bslbf

                  duration

24 

uimsbf

                  running_status

uimsbf

                  free_CA_mode

bslbf

                  descriptors_loop_length

12 

uimsbf

                  for(j=0;j<N;j++){

 

 

                           descriptor()

 

 

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

EIT的table_id的取值和含义可以用表4.8来说明。

 

表4.8  EIT表table_id的取值和含义

table_id

含义

0x4E

EIT描述的当前/后继(present / following)event信息在当前传输流中;

0x4F

EIT描述的当前/后继(present / following)event信息不在当前传输流中(在其它传输流中);

0x50~0x5F

EIT描述的节目预报信息(event schedule information)在当前传输流中;

0x60~0x6F

EIT描述的节目预报信息(event schedule information)不在当前传输流中;

 

table_id为0x4E和0x4F的EIT表描述的是相应service中的当前( present )和后继(following )event。此时,EIT子表使用第一个section描述当前正在播放的event,使用第二个section描述即将播放的event,第一、第二个section的表循环结构都只有一个。table_id为0x50~0x5F和0x60~0x6F的EIT表描述相应service中在某一时间段内按起始时间顺序排好的(schedule)event,section的表循环结构一般是多个。DVB规定,table_id = 0x4E的EIT表必须发出。

每一个event都有它的标识(event_id),起始时间(start_time),持续时间(duration,以秒为单位),运行状态(running_status)以及是否加扰(free_CA_mode)。每一个表循环结构中的描述符对相应event进行更为详尽的描述。

现在回顾一下表4.6,在SDT的表循环结构中有两个标志,EIT_schedule_flag和EIT_present_following_flag,前者用于说明相应service的EIT schedule的信息是否在当前的传输流中;后者说明相应service的EIT present/ following信息是否在当前传输流中。

4.7      BAT( Bouquet Association Table)

BAT提供有关节目业务群的信息,是否发送BAT表是可选的。发送BAT的TS包的PID = 0x0011。BAT结构如表4.9所示。

bouquet_id用于标识业务群,BAT表循环结构对应与属于该业务群的所有业务所在的TS流。由于组成业务群的业务可以使用不同的TS流传输,所以,BAT表循环结构的个数可以是一个或多个。

表4.9  BAT语法结构

Syntax

No. of bits

Identifier

bouquet_association_section(){

 

 

         bouquet_id

16 

uimsbf

         for(i=0;i<N;i++){

 

 

                  descriptor()

 

 

         }

 

 

         reserved_future_use

bslbf

         transport_stream_loop_length

12 

uimsbf

         for(i=0;i<N;i++){

 

 

                  transport_stream_id

16 

uimsbf

                  original_network_id

16 

uimsbf

                  reserved_future_use

bslbf

                  transport_descriptors_length

12 

uimsbf

                  for(j=0;j<N;j++){

 

 

                          descriptor()

 

 

                  }

 

 

         }

 

 

         CRC_32

32 

rpchof

}

 

 

 

为了提高了SI比特流的一致性,并且简化了IRD的处理过程。DVB对BAT表的内容作了如下规定:

□  在BAT的每个子表中要列出属于bouquet_id标识的业务群的所有service,实现的方法就是在第二层描述符序列中加入service_list描述符;

□  所有在BAT表中涉及到的service都应该在SDT表中列出,每个service对应SDT表的一个表循环结构;

□  所有在BAT表中涉及到的service都应该在NIT表中列出,实现的方法也是在第二层描述符序列中加入service_list描述符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值