PSI分析
"SI是对多个TS流的描述,它包含了PSI"
PSI只提供了单个TS流的信息,使接收机能够对单个TS流中的不同节目进行解码;但是,它不能提供多个TS流的相关业务,也不能提供节目的类型、节目名称、开始时间、节目简介等信息。因此,DVB对PSI进行了扩展,提供了其他不同类型的表,形成了SI。
SI定义了PAT、PMT和CAT之外的9张表,通过组织SI提供的这些数据,可以生成类似节目报表的形式,方便用户查看多种信息,这就是所谓的电子节目指南(EPG)。
下面给出了SI定义的十张表(NIT的由SI规定的):
NIT |
Network Information Table |
网络信息表 |
描述整个网络,如多少TS流、频点和调制方式等信息 |
SDT |
Service Description Table |
业务描述表 |
包含业务数据(如业务名称、起始时间、持续时间等) |
BAT |
Bouquet Association Table |
业务群关联表 |
给出业务群的名称及其业务列表等信息 |
EIT |
Event Information Table |
事件信息表 |
包含事件或节目相关数据,是生成EPG的主要表 |
RST |
Running Status Table |
运行状态表 |
给出事件的状态(运行/非运行) |
TDT |
Time&Date Table |
时间和日期表 |
给出当前事件和日期相关信息,更新频繁 |
TOT |
Time Offset Table |
时间偏移表 |
给出了当前时间日期与本地时间偏移的信息 |
ST |
Stuffing Table |
填充表 |
用于使现有的段无效,如在一个传输系统的边界 |
SIT |
选择信息表 |
仅用于码流片段中,如记录的一段码流,包含描述该码流片段业务信息段的地方 |
|
DIT |
间断信息表 |
仅用于码流片段,如记录的一段码流中,它将插入到码流片段业务信息间断的地方 |
SI定义的表,并不需要全部传输,其中,NIT、SDT、EIT和TDT是必须传输的;而又以NIT、SDT和EIT最为重要,利用这三个表可以构成功能不同的EPG,如提供节目附加信息、节目分类、节目预定和家长分级控制等。
NIT解析
PARSINGOF NIT
"NIT描述了数字电视网络中与网络相关的信息"
NIT描述了数字电视网络中与网络相关的信息,但这个表本身的信息有限,更多的信息是依靠插入表中的描述符来提供的。NIT常用的描述符有:网络名称描述符(network_name_descriptor)、有线传送系统(cable_delivery_system_descriptor)、业务列表描述符(service_list_descriptor)和链接描述符(linkage_descriptor)。下图是实际的一个例子中的两种描述符。
NIT的表结构分析
ANALYZEOFTHE STRUCTUREOFNIT
网络信息表(NIT)传递了与通过一个给定的网络传输的复用流/TS流的物理结构相关的信息,以及与网络自身特性相关的信息。
网络信息段
Syntax (句法结构) No. of bits(所占位数) Identifier(识别符) Note(注释)
network_information_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
Network_id 16 uimsbf 见注释
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
Reserved_future_use 4 bslbf
Network_descriptors_length 12 uimsbf
for(i=0;i<N;i++){
descriptor() //First descriptor loop
}
reserved_future_use 4 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 4 bslbf
transport_descriptors_length 12 uimsbf
for(j=0;j<N;j++){
descriptor() //Second descriptor loop
}
}
CRC_32 32 rpchof 见注释
}
在SI标准中规定:original_network_id和transport_stream_id两个标识符相结合唯一确定了网络中的TS流。各网络被分配独立的network_id值作为网络的唯一识别码。当NIT表在生成TS流的网络上传输时,network_id和original_network_id将取同一值。
- NIT表被切分为网络信息段(network_information_section)
- 任何NIT的段都必须由PID为0x0010的TS包传输
- 现行网络的NIT表任何段的table_id值应为0x40,且具有相同的table_id_extension即(network_id);
- 现行网络以外的其他网络NIT表的段table_id值应为0x41
注意到这里出现了两个循环,分别成为第一层循环和第二层循环;每层循环都插入了一个描述符,也就是一共插入了两个描述符。这两个描述符的特点如下:
第一层描述符 |
作用域是针对整个网络的,如插入网络名称描述符、链接描述符等 |
第二层描述符 |
作用域是第一层循环所代表的一个TS流,如插入有线传输系统描述符 |
上图提供的即是一个真实的NIT表,红色框内有两个描述符,分别是业务列表描述符service_list_descriptor和有线传输系统描述符cable_delivery_system_descriptor;它们都位于第二层循环。
NIT的业务列表描述符结构分析
ANALYZEOFTHE STRUCTUREOFSERVICE_LIST_DESCRIPTORINNIT
业务列表描述符通过业务标识符和业务类型提供业务服务。其目的在于:告诉接收机每一个TS流中存在多少个业务以及每一个业务的类型。其结构如下:
业务列表描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
service_list_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
service_id 16 uimsbf
service_type 8 uimsbf
}
}
service_id(业务标识符):唯一标识TS中的一个业务,它与program_map_section中的program_number(参看PMT表结构)相同。但当业务类型为0x04时(即NVOD参考业务,service_id没有对应的program_number)。
service_type(业务类型):指示业务的类型。如0x01为数字电视业务,0x02为数字音频广播业务,0x04为NVOD参考业务,0x05为NVOD时移业务。
HINT:下表给出了业务类型编码方法
service_type |
描述 |
0x00 |
预留使用 |
0x01 |
数字电视业务 |
0x02 |
数字音频广播业务 |
0x03 |
图文电视业务 |
0x04 |
NVOD参考业务 |
0x05 |
NVOD时移业务 |
0x06 |
马赛克业务 |
0x07 |
PAL制编码信号 |
0x08 |
SECAM制编码信号 |
0x09 |
D/D2-MAC |
0x0A |
调频广播 |
0x0B |
NTSC制信号 |
0x0C |
数据广播业务 |
0x0D |
公共接口使用预留 |
0x0E |
RCS映射(见EN 301 790) |
0x0F |
RCS FLS(见EN 301 790) |
0x10 |
DVB MHP业务 |
0x11~0x7F |
预留使用 |
0x80~0xFE |
用户定义 |
0xFF |
预留使用 |
上图所示只是其中一个section的业务列表描述符,如果将所有的section全解析,那么此网络中所有TS流包含的所有service_id和service_type都可以获得。这样,用户可以据此了解整个网络业务的构成,并以此为基础对业务进行分类、整合。
NIT的有线传输系统描述符结构分析
ANALYZEOFTHE STRUCTUREOFCABLE_DELIVERY_SYSTEM_DESCRIPTORINNIT
有线传输系统描述符(Cable_Delivery_System_descriptor)是NIT业务中重要的描述符,也是基本运营所必需的描述符。它主要描述了每一个TS流的物理参数(频率、调制方式、符码率等),使接收机能正确锁频、得到数据。其结构如下:
有线传输系统描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
cable_delivery_system_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
frequency 32 bslbf
reserved_future_use 12 bslbf
FEC_outer 4 bslbf 前向纠错外码
modulation 8 bslbf
symbol_rate 28 bslbf
FEC_inner 4 bslbf 前向纠错内码
}
Frequency(频率):32位,以8个4位BCD码给出频率。其单位是MHz,小数点位于第四个BCD码之后,如0312.0000MHz。
Modulation(调制方式):指出有线传输系统的调制方式。其定义如下表:
调制方式(十六进制) |
描述 |
0x00 |
未定义 |
0x01 |
16 QAM |
0x02 |
32 QAM |
0x03 |
64 QAM |
0x04 |
128 QAM |
0x05 |
256 QAM |
0x06~0xFF |
预留使用 |
symbol_rate(符码率):28位,以7个4位BCD码表示符码率。其单位是MSPS(兆符号每秒),小数点位于第三个BCD码后,如027.4500 MSPS
上图所示为一个真实TS流里的一个有线传输系统描述符。可以看到其频率为331.0000MHz,符码率为6.8750MSym/s,调制方式为64 QAM。
NIT的网络名称描述符结构分析
ANALYZEOFTHE STRUCTUREOFNETWORK_NAME_DESCRIPTORINNIT
网络名称描述符的功能比较简单,它以字符串的形式将网络的名称告诉接收机。下面是其描述符结构列表:
网络名称描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
network_name_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
char 8 uimsbf
}
}
char(字符):8位字段,一个字符串,给出NIT表指定的传送系统的名称。
NIT的链接描述符结构分析
ANALYZEOFTHE STRUCTUREOFLINKAGE_DESCRIPTORINNIT
链接描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
linkage_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
transport_stream_id 16 uimsbf
original_network_id 16 uimsbf
service_id 16 uimsbf
linkage_type 8 uimsbf
for(i=0;i<N;i++){
private_data_byte 8 bslbf
}
}
如果用户要求得到SI系统描述的特定实体的进一步信息,则可以使用链接描述符。链接描述符包含的信息给出了该实体的位置。如:可以在一个NIT中使用一个链接描述符,给出网络中可存放业务附加信息的位置;或者在BAT表中的链接描述符可链接到业务群的相关信息等。
使用链接描述符,也可以提供一种业务,以替换CA系统的功能。如果CA系统不能处理相应功能的时候,接收机就可以用这个业务来取代CA。
使用链接描述符,还可以以一种备用业务,用以替换主业务。若主业务的运行状态被置为“not_running”,那么,接收机可以自动选择被链接描述符指引的备用业务,以取代该业务。
使用链接描述符,还可以向移动接收机提供漫游功能。若现行业务其service_id下无法使用,IRD可以自动选择该功能。hand-over_type指明link_descriptor是否链接到不同国家的同一业务,或者链接到本地变更业务或关联业务。
总之,链接描述符为运营商提供了一种业务扩充功能,使得运营商可以更加灵活地组合各种业务。
NIT的软件下载链接描述符结构分析
ANALYZEOFTHE STRUCTUREOFDOWNLOAD_LINKAGE_DESCRIPTORINNIT
软件下载描述符用于运营商在网络内进行多于一个机顶盒的软件下载更新标识,在网络信息表NIT的第一个循环内,并且可能多次出现。针对同一组制造商号(manufacturer_id)、硬件类型(hw_model)、硬件版本(hw_version)和软件类型(sw_model),可能有不只一组的不同软件版本(sw_version)和开始时间(start_time)参数,并可能出现在同一个或多个链接描述符(linkage_descriptor)的各个循环内。
BAT解析
PARSINGOF BAT
"BAT将网络中的所有业务分成了多个业务群,以此界定用户"
BAT即业务群关联表(BouquetAssociation Table),它将网络中所有的业务分成了多个业务群,以此界定用户。例如,将网络中所有业务分为两个业务群,一个是境内节目业务群,另一个是境外节目业务群。这样,国内的运营商就可以利用这样划分的业务群,充分利用节目资源,在不违反现有广电总局规定的前提下,同时分别满足境内用户和境外用户。
BAT本身可以跨网络存在,但在国内运营体系来看几乎没有得到真正使用。国内的运营使用中,BAT还可以存在分级运营的运营体系中,用于区分不同的地域用户。
BAT被切分为业务群关联段,所有的业务群关联段都在TS中传输,其PID为0x0011。所有的业务群关联段的table_id都取0x4A。
HINT:SDT的TS包PID也为0x0011,其table_id为0x42或0x46。
BAT的表结构分析
ANALYZEOFTHE STRUCTUREOFBAT
下面给出了BAT表的段结构:
业务群关联段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
bouquet_association_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
bouquet_id 16 uimsbf 见注释
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
Reserved_future_use 4 bslbf
bouquet_descriptors_length 12 uimsbf
for(i=0;i<N;i++){
descriptor()
}
reserved_future_use 4 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 4 bslbf
transport_descriptors_length 12 uimsbf
for(j=0;j<N;j++){
descriptor()
}
}
CRC_32 32 rpchof 见注释
}
注意到BAT的结构和NIT类似,其作用和描述符的使用也与NIT大致雷同。其中,可以插入传输系统描述符、业务列表描述符等。这些表和NIT中的表已介绍,这里不再赘述。
BAT的业务群名称描述符结构分析
ANALYZEOFTHE STRUCTUREOFBOUQUET_NAME_DESCRIPTORINBAT
下面给出的是业务群名称描述符,它以文本方式给出了业务群的名称:
业务群名称描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
bouquet_name_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
char 8 uimsbf
}
}
char(字符):8位字段,用于描述BAT子表叙述的节目业务群名称
业务名称描述符和网络名称描述符类型,只是作为业务群的一个代号,其实际意义只存在于用户界面上,可以给用户一个良好的操作体验。
SDT解析
PARSINGOF SDT
"SDT描述了业务内容及信息,连接了NIT与EIT和PMT(PSI)"
SDT即服务描述表(Service Description Table),它描述了一个业务中的内容以及信息,它承上启下,以transport_stream_ID连接了NIT和EIT;SDT的servicID必须与PMT中的Program_no一致,因此,SDT又与PSI的信息连接。
对于一般的音视频业务,SDT表中不会有太多的信息需要添加。如果是其他业务(如NVOD、马赛克、数据广播等),在SDT中需要插入相应业务的描述符。
SDT的表结构分析
ANALYZEOF THE STRUCTUREOF SDT
SDT表被切分成业务描述段(service_description_section),由PID为0x0011的TS包传输(BAT段也由PID为0x0011的TS包传输,但table_id不同)。
描述现行TS(即包含SDT表的TS)的SDT表的任何段的table_id都为0x42,且具有相同的table_id_extension(transport_stream_id)以及相同的original_network_id。
指向非现行TS的SDT表的任何段的table_id都应取0x46。
下面给出了SDT的业务描述段:
业务描述段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
service_description_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
transport_stream_id 16 uimsbf 给出TS识别号
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
original_nerwork_id 16 uimsbf 见注释
reserved_future_use 8 bslbf
for(i=0;i<N;i++){
service_id 16 uimsbf 见注释
reserved_future_use 6 bslbf
EIT_schedule_flag 1 bslbf 见注释
EIT_present_following_flag 1 bslbf 见注释
running_status 3 uimsbf 见下面分析
freed_CA_mode 1 bslbf 见注释
descriptors_loop_length 12 uimsbf
for(j=0;j<N;j++){
descriptor()
}
}
CRC_32 32 rpchof 见注释
}
running_status(运行状态):表示业务状态,下表给出了业务状态
值 |
含义 |
0 |
未定义 |
1 |
未运行 |
2 |
几秒后开始(如录像) |
3 |
暂停 |
4 |
运行 |
5~7 |
预留 |
SDT是描述一个TS流中所有业务信息的一张表,重要的字段包含transport_stream_id,明确这些业务是属于哪个TS流的;另一个重要字段时候service_id,这是作为频道索引信息存在的。
SDT的业务描述符分析
ANALYZEOFTHE STRUCTUREOFSERVICE_DESCRIPTORINSDT
业务描述符与业务类型一起,以文本形式给出业务提供者的名称和业务名称,如下表:
业务描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
service_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
service_type 8 uimsbf
service_provider_name_length 8 uimsbf
for(i=0;i<N;i++){
Char 8 uimsbf
}
service_name_length 8 uimsbf
for(i=0;i<N;i++){
Char 8 uimsbf
}
}
service_type(业务类型):这里的业务类型和NIT中的业务列表描述符中的service_type编码是一致的:
service_type |
描述 |
0x00 |
预留使用 |
0x01 |
数字电视业务 |
0x02 |
数字音频广播业务 |
0x03 |
图文电视业务 |
0x04 |
NVOD参考业务 |
0x05 |
NVOD时移业务 |
0x06 |
马赛克业务 |
0x07 |
PAL制编码信号 |
0x08 |
SECAM制编码信号 |
0x09 |
D/D2-MAC |
0x0A |
调频广播 |
0x0B |
NTSC制信号 |
0x0C |
数据广播业务 |
0x0D |
公共接口使用预留 |
0x0E |
RCS映射(见EN 301 790) |
0x0F |
RCS FLS(见EN 301 790) |
0x10 |
DVB MHP业务 |
0x11~0x7F |
预留使用 |
0x80~0xFE |
用户定义 |
0xFF |
预留使用 |
业务描述符是SDT中最重要的描述符,也是运营商中必须的描述符。其中的service_type描述这个业务类型的域;service_name描述频道名。
SDT的实例分析
ANALYZEOF REAL EXAMPLE OF SDT
这里主要演示SDT如何连接PSI和NIT。
首先,根据SDT描述符的service_id可以和PMT中的program_number建立连接。如图所示,SDT的service_id=201=0xc9,与PMT中的program_number一致。
上图所示,根据SDT的transport_stream_id和NIT的transport_stream_id,可以将SDT和NIT联系起来。根据上图的信息,我们可以根据SDT获取该业务(频道)的业务列表信息和有线传输信息(位于NIT中)。
EIT解析
PARSINGOF EIT
"EIT按时间顺序提供每一个业务所包含的事件信息"
EIT即事件信息表(Event Information Table),它是EPG中绝大部分信息的携带者。事实上,EPG主要就是通过SDT和EIT信息的获取和重组实现的。SDT只提供了频道信息,而EIT则提供各频道下的所有节目的信息。
EIT的主要信息也是通过插入的描述符来实现的。EIT按照时间顺序提供每一个业务所包含的事件的相关信息(如节目名称、节目简介)。
传输流 |
信息 |
table_id |
当前TS流 |
当前/后续事件信息 |
0x4E |
其他TS流 |
当前/后续事件信息 |
0x4F |
当前TS流 |
事件时间表信息 |
0x50~0x5F |
其他TS流 |
事件时间表信息 |
0x60~0x6F |
按照不同的table_id,一共有四类EIT。其中,当前TS流的所有EIT子表都有相同的transport_stream_id和original_stream_id。下图给出了一个实例的码流中的EIT信息,这里一共有三类EIT表,观察其table_id就可以知道它们代表什么类型的EIT。
第一个EIT_PF_Actual应该是当前TS流的“当前/后续事件信息”;第二个EIT_PF_Other是其他TS流的“当前/后续事件信息”;第三个EIT_Schedule_Actual是当前TS流的“事件时间表信息”。
EIT的表结构分析
ANALYZEOF THE STRUCTUREOF EIT
EIT表被切分成事件信息段。任何构成EIT的段都由PID=0x0012的TS包传输。下面给出的是事件信息段的结构:
事件信息段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
event_information_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
service_id 16 uimsbf 与PAT中的program_number一致
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
transport_stream_id 16 uimsbf 见注释
original_nerwork_id 16 uimsbf 见注释
segment_last_section_number 8 uimsbf 见注释
last_table_id 8 uimsbf 见注释
for(i=0;i<N;i++){
event_id 16 uimsbf 事件(节目)id
start_time 40 bslbf 事件(节目)开始时间
duration 24 bslbf 事件(节目)持续始时间
running_status 3 uimsbf 见注释
freed_CA_mode 1 bslbf 见注释
descriptors_loop_length 12 uimsbf
for(j=0;j<N;j++){
descriptor()
}
}
CRC_32 32 rpchof 见注释
}
start_time(开始时间):40位字段,指的是事件(节目)的开始时间,它包含以UTC和MJD形式表示的事件(节目)的起始时间及日期。此字段前16位表示MJD日期码,其余24位按4位BCD编码,表示6个数字。例如:93/10/13 12:45:00被编码为:“0xc079124500”
HINT:如果事件起始时间未定,则所有位都置为“1”,例如对NVOD业务的一个事件。
duration(持续时间):24位字段,表示事件的持续时间,以时、分、秒的格式表示,即由6个4位BCD码显示。如:01:45:30被编码为“0x14530”。
running_status(运行状态):参看SDT表解析部分。
下面给出一个具体的例子:
EIT主要承载的信息就是Event的相关内容,即节目信息。其中,节目所在频道(service_id)、开始时间(start_time)、结束时间(start_time+duration)可在EIT子表获取;而节目描述、节目名称、节目分类等信息就要在插入EIT的描述符中获取了。
EIT的短事件描述符分析
ANALYZEOFTHE STRUCTUREOFSHORT_EVENT_DESCRIPTORINEIT
短事件描述符(Short_event_descriptor)以文本方式提供了事件名称和该事件的简短描述。描述符结构如下:
短事件描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
short_event_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
ISO_639_language_code 24 bslbf
event_name_length 8 uimsbf
for(i=0;i<event_name_length;i++){
event_name_char 8 uimsbf
}
text_length 8 uimsbf
for(i=0;i<text_length;i++){
text_char 8 uimsbf
}
}
ISO_639_language_code(ISO 639-2语言代码):24位字段,指明后续文本字段的语言。该字段包含一个由ISO 639-2定义的3字符代码。ISO 639-2/B和ISO 639-2/T均可使用。每个字符按照GB/T15273.1-1994编码为8位,并依次插入24位字段。如:法语的3字符代码“fre”,可编码为:“0110 01100111 0010 0110 0101”。
event_name_char(事件名称字符):一个字符串给出事件的名字。
text_char(文本字符):一个字符串给出事件的文本描述。
下面给出的是一个实际案例的短时间描述符,可见中文的3字符代码是“chi”。
EIT的扩展事件描述符分析
ANALYZEOFTHE STRUCTUREOFEXTENDED_EVENT_DESCRIPTORINEIT
扩展事件描述符(Extended_Event_Descriptor)拓展事件描述符给出了一个事件的详细文本描述。如果一个事件的信息长度超过256字节,可以使用多于一个相关联的扩展事件描述符来描述。文本信息可以分为两个栏目,一栏为条目的描述,另一栏为条目的内容。
下面给出了扩展事件描述符的结构。
扩展事件描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
extended_event_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
descriptor_number 4 uimsbf
last_descriptor_number 4 uimsbf
ISO_639_language_code 24 bslbf
length_of_items 8 uimsbf
for(i=0;i<N;i++){
item_description_length 8 uimsbf
for(j=0;j<N;j++){
item_description_char 8 uimsbf
}
item_length
for(j=0;j<N;j++){
item_char
}
}
text_length
for(i-0;i<N;i++){
text_char
}
}
下面给出的是一个实例截图:
EIT的内容描述符分析
ANALYZEOFTHE STRUCTUREOFCONTENT_DESCRIPTORINEIT
内容描述符的目的是为事件提供清晰的信息描述符。根据这个描述符的信息,接收机可以清晰地知道事件的分类,并告知观众。下面给出了内容描述符的结构:
内容描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
content_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
content_nibble_level1 4 uimsbf
content_nibble_level2 4 uimsbf
user_nibble 4 uimsbf
user_nibble 4 uimsbf
}
}
这里主要需要介绍的就是 content_nibble_level1和content_nibble_level2:根据EN 300 468V1.3.1(1998-02)中的Table 18可以确定该节目的具体分类。
下面给出了一个实例。
TDT解析
PARSINGOF TDT
"TDT仅传送UTC时间和日期信息,只有一个段"
TDT为时间和日期表(Time&Date Table),它仅传送UTC时间和日期信息。并且TDT仅包含一个段,其结构如下:
时间和日期段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
time_date_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
UTC_time 40 bslbf 见注释
}
UTC_time(UTC时间):40位字段,包含以UTC和MJD形式表示的当前时间和日期。此字段前16位为MJD日期码,后24位按4位BCD编码,表示6个数字。如:93/10/13 12:45:00被编码为“0xC079124500”。
下图给出了一个实例:
TOT解析
PARSINGOF TOT
"TOT是TDT的一个扩展,增加了一个描述符"
TOT为时间偏移表(Time Offset Table),它包含了UTC时间和日期信息及当地时间偏移。传输此表的TS包PID为0x0014,table_id=0x73。下面给出了时间偏移段的结构:
时间偏移段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
time_offset_section(){
table_id 8 uimsbf
section_syntax_indicator 1 bslbf 通常设为“1”
reserved_future_use 1 bslbf
reserved 2 bslbf
section_length 12 uimsbf 见注释
UTC_time 40 bslbf 见注释
reserved 4 bslbf
descriptors_loop_length 12 uimsbf
for(i=0;i<N;i++){
descriptor()
}
CRC_32 32 rpchof 见注释
}
这里的UTC_time和TDT表是一致的,都是以UTC和MJD形式表示当前时间和日期;其格式也与TDT的UTC_time相同,这里不再赘述。需要特别注意的是这里的描述符descriptor()。下面给出了本地时间偏移描述符的结构:
本地时间偏移描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
local_time_offset_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
coutry_code 24 bslbf
country_region_id 6 bslbf
reserved 1 bslbf
local_time_offset_polarity 1 bslbf
local_time_offset 16 bslbf
time_of_change 40 bslbf
next_time_offset 16 bslbf
}
}
国家代码 country_code
24位字段,按照ISO 3166用3字符代码指明国家。每个字符根据GB/T 15273.1-1994编码为8位,并依次插入24位字段。假设3个字符代表了一个900至999的数字,那么country_code指定了一组ETSI定义的国家。其分配见ETR 162。国家组的国家代码应该被限制在同一时区内。
例如:英国由3字符代码“GBR”表示,编码为:“01000111 0100 0010 0101 0010”。
国家区域标识符 country_region_id
6位字段,表示country_code指明的国家所在的时区。若国家内部里没有时差,则置“000000”。
country_region_id |
描述 |
00 0000 |
未使用时区扩展 |
00 0001 |
时区1(最东部) |
00 0010 |
时区2 |
…….. |
…….. |
11 1100 |
时区 60 |
11 1101 – 11 1111 |
预留 |
本地时间偏移极性 local_time_offset_polarity
1位字段,用于指明随后的local_time_offset的极性。置“0”时,极性为正,说明本地时间早于UTC时间(通常在格林威治以东);置“1”时,极性为负,说明本地时间晚于UTC时间。
本地时间偏移 local_time_offset
16位字段,指出由country_code和country_region_id确定的区域的相对于UTC的时间偏移,范围为-12小时至+13小时。16比特含有4个4位BCD码,顺序为小时的十位,小时的个位,分的十位,分的个位。
时间变化 time_of_change
40位字段,指明时间改变时当前的日期(MJD)与时间(UTC),见附录C。该字段分为两部分,前16位给出了LSB格式的日期(MJD),后24位给出了UTC时间(6个4位BCD码)。
下一时间偏移 next_time_offset
16位字段,指出由country_code和country_region_id确定的区域,当UTC时间变化时的下一个时间偏移,范围为-12小时至+13小时。此16比特域为4个4位BCD码,依次为时的十位,时的个位,分的十位,分的个位。
SI小结
SUMMARYOF SI
参考资料
REFERENCES
《数字电视业务支撑系统》 |
廖洪涛、徐征著 |
电子工业出版社 |
DVB和MPEG-II中的表格 |
网络资料 |
—— |
《中文SI版本1.0》 |
行业标准 |
—— |
预备知识1:PSI/SI关键字
PRE-LEARNING1
关键字 |
解释 |
翻译 |
备注 |
PSI |
Program Specific Information |
节目引导信息 |
对单一码流的描述 |
SI |
Service Information |
业务信息 |
对系统中所有码流的描述,包含了PSI(PSI+9张表) |
TS包 |
Transport Packet |
传输包 |
数字视音频、图文数据打包成TS包 |
TS |
Transport Stream |
传输流 (常称为TS流) |
一个频道(多个节目及业务)的TS包复用后称TS流 |
PAT |
Program Association Table |
节目关联表 |
将节目号码和节目映射表PID相关联,获取数据的开始 |
PMT |
Program Map Table |
节目映射表 |
指定一个或多个节目的PID |
CAT |
Conditional Access Table |
条件接收表 |
将一个或多个专用EMM流分别与唯一的PID相关联 |
NIT |
Network Information Table |
网络信息表 |
描述整个网络,如多少TS流、频点和调制方式等信息 |
SDT |
Service Description Table |
业务描述表 |
包含业务数据(如业务名称、起始时间、持续时间等) |
BAT |
Bouquet Association Table |
业务群关联表 |
给出业务群的名称及其业务列表等信息 |
EIT |
Event Information Table |
事件信息表 |
包含事件或节目相关数据,是生成EPG的主要表 |
RST |
Running Status Table |
运行状态表 |
给出事件的状态(运行/非运行) |
TDT |
Time&Date Table |
时间和日期表 |
给出当前事件和日期相关信息,更新频繁 |
TOT |
Time Offset Table |
时间偏移表 |
给出了当前时间日期与本地时间偏移的信息 |
ST |
Stuffing Table |
填充表 |
用于使现有的段无效,如在一个传输系统的边界 |
SIT |
选择信息表 |
仅用于码流片段中,如记录的一段码流,包含描述该码流片段业务信息段的地方 |
|
DIT |
间断信息表 |
仅用于码流片段,如记录的一段码流中,它将插入到码流片段业务信息间断的地方 |
- HINT:上表中,绿色底纹的为PSI信息,蓝色底纹的为SI信息。但是,虽然NIT是PSI信息,但NIT标准是由SI规定的。
预备知识2:常识
PRE-LEARNING2
- 生成EPG的数据来源于DVB码流中的业务信息(SI)和节目引导信息(PSI)
- 视频、音频、图片、文字等处理后成为数据,以MPEG-2标准打包成为固定长度(188字节)的传送包,并将这些包复用形成传输流(TS流)
- 通常,一个频道对应一个TS流,一个频道的TS流由多个节目及业务组成
预备知识3:ES、PES、PS和TS
PRE-LEARNING3
ES流(ElementaryStream):基本码流,不分段的音频、视频或其他信息的连续码流。
PES流:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。
PS流(ProgramStream):节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。
TS流(TransportStream):传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。
不论是视频、音频、文字、图片还是业务信息(包括PSI/SI)都将被划分为最基本的ES,并将它们通过PES的形式组装起来,经过复用形成TS流
对TS流的解析:首先获取到TS流中的包Packet,根据其PID过滤出需要的包,根据其section的结构还原成section,再由上层协议来处理。
预备知识4:业务与事件
PRE-LEARNING4
关于业务(Service)与事件(Event)。
这里将会大量出现这两个词。那么什么是“业务”,什么是“事件”呢?一般来说,接下来所说的“业务”就是指“频道”,“事件”就是“节目”。这里需要明确“节目”的概念,举个例子:CCTV1是一个频道,也就是我们所说的“业务(Service)”;《新闻联播》是一个节目,也就是我们所说的“事件”。分清楚了这两个概念,我们才能区分下面的很多SI信息。
"PSI是对单一TS流的描述,是TS流中的引导信息"
PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成。这些表会被插入到TS流中。PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目(见Q1)。
下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构。
结构名 |
中文 |
所定义标准 |
PID |
描述 |
PAT |
节目关联表 |
MPEG2标准 |
0x0000 |
将节目号码和节目映射表PID相关联,是获取数据的开始 |
PMT |
节目映射表 |
MPEG2标准 |
在PAT中指出 |
指定一个或多个节目的PID |
CAT |
条件接收表 |
MPEG2标准 |
0x0001 |
将一个或多个专用EMM流分别与唯一的PID相关联 |
NIT |
网络信息表 |
SI标准 |
PAT中指出 |
描述整个网络,如多少个TS流、频点和调制方式等信息 |
虽然这四个结构可以视为简单的表,但事实上,它们被进一步划分为各个段,并插入到TS包中。
PAT解析
PARSINGOF PAT
"PAT是机顶盒接收的入口点,是它获取数据的开始"
节目关联表PAT的意义在于,它描述了当前TS流中包含了哪些PID;只有根据获得的PID,用户才可以以此作为凭据找出其他表(如PMT表)及其信息。所以PAT是机顶盒接收的入口点,是它获取数据的开始;要保证一个TS流能被正常接收,则至少要有一个完整有效的PAT。
下面给出了PID字段的取值要求:
值 |
描述 |
0x0000 |
PAT |
0x0001 |
CAT |
0x0002~0x000F |
保留 |
0x0010~0x1FFE |
可赋给network_PID、Program_map_PID、elementary_PID或作其他用途 |
0x1FFF |
空的分组 |
PAT的表结构分析
ANALYZEOF THE STRUCTUREOF PAT
首先,对PAT的表结构进行分析。下面给出了PAT表的基本结构:
节目关联段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
program_association_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
transport_stream_id 16 uimsbf 见注释
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
for(i=0;i<N;i++){
program_number 16 uimsbf 见注释
reserved 3 bslbf
if(program_number == 0){
network_PID 13 uimsbf 见注释
}
else{
program_map_PID 13 uimsbf 见注释
}
}
CRC_32 32 rpchof 见注释
}
这里我们注意关注五个字段:
table_id(赋值):PAT的table_id应为0x00
transport_stream_id(传输流标志):用以标识来源于网络中任何其他复合流的TS流
program_number(节目号):规定program_map_PID可适用的节目。当值为0x0000时,其后的PID参照将是网络PID。它可以作为一个指示符号,例如用于广播通道。
network_PID(网络PID):仅当program_number为0x00时使用
program_map_PID(节目映射PID):据此找出相应的PMT表
PAT的实例分析
ANALYZEOF REAL EXAMPLE OF PAT
借助码流分析仪,我们可以很清楚地以实例的方式更加清晰地了解PAT的结构。下面给出的就是一个TS流的PAT分析情况:
根据上表可以看出,这个TS流里共有6套节目,其映射关系PID分别为0xc9、0xcb、0xce、0xcc、0xcd和0xca。(注:0xc9=201)
下面给出的是PMT的简单解析:
两相比较,可以很清楚地知道,PAT是如何锁定各个PMT的(每个节目都有一个自己的PMT)。
Q1:如何找到一个特定的节目?
1.已知节目名称(或id等信息)
P248
首先要从节目关联表PAT中获取这个节目的节目映射表PMT的PID值,再从TS流中找出与此PID值相对应的节目映射表PMT;再从PMT中获取构成这个节目的基本码流的PID值,从而根据该PID过滤出相应的视频、音频和数据等基本码流。最后解码恢复为原始信号。
PMT解析
PARSINGOF PMT
"PMT是连接节目号与节目元素的桥梁"
节目映射表PMT的意义在于,它给出了节目号与组成这个节目元素之间的映射;也就是说,PMT是连接节目号与节目元素的桥梁。我们知道,一个电视节目至少包含了视频和音频数据,而每一个节目的视音频数据都是以包的形式在TS流中传输的;所以说,一个TS流包含了多个节目的视频和音频数据包。要想过滤出一个TS流中其中一个节目的视频和音频,则需要知道这个节目中视频和音频的标识号PID。PMT表的作用就在于,它提供了每个节目视频、音频(或其他)数据包的PID。
PMT的表结构分析
ANALYZEOF THE STRUCTUREOF PMT
先给出PMT表的段结构:
Syntax (句法结构) No. of bits(所占位数) Identifier(识别符) Note(注释)
program_map_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
program_number 16 uimsbf
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
reserved 3 bslbf
PCR_PID 13 uimsbf 见注释
reserved 4 bslbf
program_info_length 12 uimsbf 头两位为"00"
for(i=0;i<N;i++){
descriptor()
}
for(i=0;i<N1;i++){
stream_type 8 uimsbf 见注释
reserved 3 bslbf
elementary_PID 13 uimsbf 见注释
reserved 4 bslbf
ES_info_length 12 uimsbf 头两位为"00"
for(j=0;j<N2;j++){
descriptor();
}
}
CRC_32 32 rpchof 见注释
}
这里着重介绍两个字段:
elementary_PID:标识了该节目(program_number)携带的基本流的识别号PID
stream_type:流类型,指出了PID为elementary_PID的基本流的类型
附:流类型取值说明
取值 |
描述 |
0x00 |
国际标准保留 |
0x01 |
视频 |
0x02 |
视频或受限参数视频流 |
0x03 |
音频 |
0x04 |
音频 |
0x05 |
private_sections |
0x06 |
包含专用数据的PES分组 |
0x07 |
ISO/IEC 13533 MHEG |
0x08 |
|
0x09 |
ITU-T Rec.H.222.1 |
0x0A~0x0D |
GB/T类型 |
0x0E |
GB/T辅助 |
0x0F~0x7F |
GB/T保留 |
0x80~0xFF |
用户专用 |
PMT的实例分析
ANALYZEOF REAL EXAMPLE OF PMT
下面给出了码流分析仪分析一段TS流的PMT表:
首先,注意到这张PMT表的progam_number=0xc9,就是我们在上面解析PAT表得到的。
从上面可以知道,节目号为0xc9(即201)的节目有两个单元流:
流名称 |
标识号 |
类型 |
说明 |
MPEG2视频 |
ES PID=0x21 |
stream_type=0x02 |
ES PID即为elementary_PID |
MPEG1音频 |
ES PID=0x28 |
stream_type=0x03 |
ES PID即为elementary_PID |
elementary_PID和stream_type的意义在于,告知接收机基本流的类型和识别PID。要想获取这个节目的视频,只需要对PID为0x21的数据包进行过滤,并交由视频处理模块处理。下图所示(除了节目名称,还需要SDT表信息)即为PAT和PMT共同获取的信息。
CAT解析
PARSINGOF CAT
"CAT描述了节目的加密方式"
条件接收表CAT描述了节目的加密方式,它包含了节目的EMM注1识别PID。它给出了一个或多个CA系统、EMM流以及与CA相关的特定参数之间的关系。
注1:EMM(Entitlement Management Message),即授权管理信息。描述了用户可看的节目或时间段、用户的付费等。
CA描述符既用于规定像EMM这样的系统范围条件接收管理信息,也用于规定像ECM这样的基本流特定信息。
- 如果一个基本流(Elementary Stream)是加扰的,那么包含该基本流的节目信息PMT中需要一个CA描述符
- 如果一个TS流中有任何一个系统范围的条件接收管理信息,则条件接收表中应有CA描述符。
下图给出的PMT表即是基本流加扰的情况,因此PMT表需要有CA描述符:
CAT的表结构分析
ANALYZEOF THE STRUCTUREOF CAT
条件存取段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
conditional_access_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
reserved 18 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
for(i=0;i<N;i++){
descriptor()
}
CRC_32 32 rpchof 见注释
}
条件存取段主要作用是指示本TS流中存在加扰节目,并且在描述符循环中必须插入CA描述符来作进一步指引。下面给出的是条件接收的描述符
条件接收描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
CA_identifier_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
}}
CA_system_ID(CA系统ID):指出用于相关ECM及(或)EMM流的CA系统类型。
CA_PID(CA PID):指出包含用于相关CA_system_ID所规定的CA系统的ECM或EMM信息传输流分组的PID(即在TS流中过滤出相应PID的分组)。
下面给出的TS流中并没有CAT:
但在PMT表中有CA描述符:
PSI小结
SUMMARYOF PSI
上图给出了在一个TS流中PSI各表之间的联系。首先从PAT表出发,获取当前有哪些节目号(program_map_PID),再根据这些节目号找出program_number相同的PMT;获取到PMT后,即可根据elementary_PID和stream_type来确定要过滤哪些含有基本流的TS包,以及这些包里面是什么类型的数据。这样,机顶盒就可以过滤出相应的节目(视频和音频数据)来收看了。
PSI分析的更多相关文章
- 解复用-mpeg2
http://blog.csdn.net/yipie/article/details/7612226 数字高清晰度电视(High Definition Television)简称HDTV,是继黑白电视 ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- 分析ffmpeg解析ts流信息的源码
花费一些时间,然后全部扔了.为了不忘记和抛砖引玉,特发此贴. ffmpeg解析ts流 1.目的 打算软件方式解析出pat,pmt等码流信息 2.源代码所在位置 下载ffmpeg ...
- ZRender源码分析6:Shape对象详解之路径
开始 说到这里,就不得不提SVG的路径操作了,因为ZRender完全的模拟了SVG原生的path元素的用法,很是强大. 关于SVG的Path,请看这里: Path (英文版) 或者 [MDN]SVG教 ...
- 左右TS分析流
字节.在TS流里能够填入非常多类型的数据.如视频.音频.自己定义信息等.他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据.有一些可能为填充数据). 工作形式: 由于 ...
- 为什么Fourier分析?
本文旨在给出Fourier分析的几个动机. 目录 波动方程 热导方程 Lapalce变换 求和公式 表示论 特征理论 参考资料 波动方程 考虑一维的波动方程最简单的边值问题$$u(x,t), x\in ...
- ts文件分析(纯c解析代码)
参考链接: 1. MPEG-2 TS码流分析 https://blog.csdn.net/zhubin215130/article/details/8958567 TS Header PAT PMT ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- IDE SATA SCSI iSCSI等存储硬盘对比与分析
原文地址:http://blog.csdn.net/trochiluses/article/details/21229283 IDE是并口硬盘,(5400-7200转): SATA是串口硬盘,(720 ...
随机推荐
- 20145329 《网络对抗技术》 逆向及Bof基础实验
1.实验内容 本次实践的对象是一个名为20145329的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段,ge ...
- Linux内核分析07
可执行程序的装载 一,预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 预处理 把include里的宏定义替换 做字符串处理. efl格式? 目标文件格式,Windows中用PE Linu ...
- 20145204Android开发基础
实验四 20145204Android开发基础 实验名称 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器 ...
- 转 已知两点坐标和半径求圆心坐标程序C++
数学思想:利用圆方程和直线方程 已知两点坐标和半径求圆心坐标程序 #include <iostream> #include <fstream> #include <c ...
- Gym 101246D Fire in the Country(dfs求SG函数)
http://codeforces.com/gym/101246/problem/D 题意: 给定一个无向有环图,大火从1点开始,每个时间点与它相邻的点也将会着火,现在有两个人轮流操作机器人,机器人从 ...
- Spring4 MVC文件下载实例(javaconfig)
展示如何使用Spring MVC4执行文件下载,我们将看到应用程序从文件系统内部以及外部文件下载文件. 下载文件是相当简单的,涉及以下步骤. 创建一个InputStream到文件用于下载. 查找MIM ...
- HttpClient将手机上的数据发送到服务器
到官网下载jar包,下载GA发布版本即可 在项目中将httpclient-4.5.5.jar.httpcore-4.4.9.jar.httpmime-4.5.5.jar.commons-logging ...
- js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0
1.向下取整 var num1 = 12.10345; var num2 =12.9801; var newnum1=Math.floor(num1) //结果 12 var newnum2= ...
- js作用域相关知识总结
以前总是搞不清楚js里面的作用域.块级作用域.预解析,做题总做错,今天彻底搞明白了,来记录梳理一下~ 块级作用域 在其他语言中,任何一对花括号中的语句都属于一个块儿,在这之中定义的所有变量在代码块外都 ...
- PHP:第五章——字符串的分割与替换
<?php header("Content-Type:text/html;charset=utf-8"); //字符串的截取与分割 //1.字符串截取类函数 //1)trim ...