PSI/SI解析(各种id说明)

2024-02-25 15:40
文章标签 说明 解析 id si psi

本文主要是介绍PSI/SI解析(各种id说明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、SI信息的构成

1、信息构成

SI信息内容是按照network(网络)→transport strem(传输流)→service(业务)→event(事件)的分层顺序描述,如图1所示。

SI数据信息是按照一定的数据结构进行存储的,这样一来才能达到方便、快捷地进行数据检索和提取。SI数据主要有:网络信息、传输流信息、业务信息、业务的事件信息等,并且大量的信息都是通过描述符来传输的,所以可用树状链表来存储数据,构成从网络、传输流、业务、事件的树状结构。机顶盒接收端的解析主要负责这些SI数据的重建。

[转载]PSI/SI解析(各种id说明)


在数字电视系统中,为了能有效地从众多的数据包中组织起SI信息,而使用了很多的标识。有Network_id(网络标识)、 Original_network_id(原始网络标识)、Transport_stream_id(传输流标识)、Service id(业务标识)、eventid_id(事件标识)、Bouquet_id(业务群组标识)。这些标识是作为信息查找定位用的,例如:要在一个TS里找出一个业务信息,就要知道这个业务信息在那个网络里、在哪个TS里和这个业务信息在这个流里的标识,这样一来,通过层层过滤,就能精确地定位描述这个业务信息的位置,并把它们找出来进行数据组织。图1就非常清楚地表明了这种查找思路。

 

一个网络信息由network_id来定位。

 

一个TS由network_id、Original_network_id、Transport_stream_id来定位,标明这个流在那个网络播发,它原属那个网络,并给它加上标识。

 

一个业务由network_id、Original_network_id、Transport_stream_id、service_id来定位,标明这个业务在那个网络播发,它原属那个网络和那个流,并给它加上标识。这体现在SDT表中。

 

一个事件由network_id、Original_network_id、Transport_stream_id、service_id、event_id来定位,标明这个事件在那个网络播发,它原属那个网络和那个流及那个业务,并给它加上标识。这体现在EIT表中。

 

据此,根据各个SI表的功能,各表的ID结构如下:

NIT:network_id、Original_network_id、Transport_stream_id 、service_id。

SDT:Original_network_id、Transport_stream_id 、service_id。

EIT:Original_network_id、Transport_stream_id 、service_id、event_id。

BAT:bouquet_id 、Original_network_id 、Transport_stream_id 、service_id。

 

另外,还有一个PID(包标识),它的作用是给每一个数据包打上一个标记,TS承载有视频数据、音频数据、PSI和SI信息数据、图文电视数据、字幕数据、数据广播数据、交互业务数据、CA系统的控制信息数据等等,除了PSI和SI信息数据和CA系统的控制信息数据外,其他的数据的PID都是通过 PMT表给出的,CA系统的控制信息数据的PID是由CAT表给出的,而承载了PSI和SI信息的各种表的PID值是固定分配的。

如下表

表                                   PID值

PAT                               0X0000
CAT                                0X0001
TSDT                               0X0002
NIT、ST                          0X0010
SDT、BAT、ST                   0X0011
EIT、ST                     0X0012
RST、ST                       0X0013
TDT、TOT、ST                   0X0014
DIT                                0X001E
SIT                                0X001F

由于这些表是分配了固定的PID值,所以机顶盒就可以根据这些PID值来辨认出是什么表,并读取表中的描述参数来生成EPG信息和完成各种数据的组织、解码出所需要的节目和信息。

 

2、表的构成

表是组成SI信息的一种数据结构。在TS中有很多不同节目的数据包,解码器如何确定哪个数据包属于某个节目?其答案就是在TS中的PSI和SI信息里,这些信息精确地指引出获得某节目与该节目数据包的PID之间的关系。

由MPEG-2定义的TS里面,数据包携带了两类信息:一是音、视频等素材的数据,二是PSI表。具有给定PID的数据包的有序排列就形成了TS 流。PSI表里的承载的内容主要是TS(本节目流)的描述参数。由MPEG-2定义的PSI主要包含有三个表:PAT、PMT、CAT。每个表都可作为一个或多个TS包的净荷插入TS中传送。

[转载]PSI/SI解析(各种id说明)

一个TS数据包的净荷为188个字节,当一个PSI/SI表的字节长度大于184字节时,就要对这个表进行分割,形成段(section)来传送。分段机制主要是将一个数据表分割成多个数据段。在PSI/SI表到TS包的转换过程中,段起到了中介的作用。由于一个数据包只有188字节,而段的长度是可变的,EIT表的段限长4096字节,其余PSI/SI表的段限长为1024字节。因此,一个段要分成几部分插入到TS包的净荷中。如图2所示。
PSI/SI表的构成是:一个表由一个或多个子表构成,表用table_id来标识;不同的子表由table_id和 table_id_extension来区分(具有相同的table_id和不同的table_id_extension);一个子表由一个或多个段构成(具有相同的table_id和table_id_extension,不同section_number来区分);每个段由多个TS数据包的数据组成。每个段具有一个完整的数据结构,表的重要参数----描述符在段里传送。
图3所示是SDT表的结构。
[转载]PSI/SI解析(各种id说明)
[转载]PSI/SI解析(各种id说明)


子表大于1024时,可把子表分割成两个或更多个段,并通过section_number来区分,如图3-1所示。
不同的信息表在TS中通过PID来区分,具有相同PID的不同表由table_id(table_id是表标识)来区分,属于同一个table_id的不同子表由table_id_extension、版本号(version_number)进行区分,属于同一个子表的不同段由section_number区分。
表的扩展标识符有:network_id、oringinal_network_id、boquet_id、 tansport_stream_id、service_id等。
        对于NIT表的子表具有相同的table_id、network_id和version_number。
        对于BAT表的子表具有相同的table_id、bouquet_id和version_number。
        对于SDT表的子表具有相同的table_id、oringinal_network_id、tansport_stream _id和version_number。

        对于EIT表的子表具有相同的table_id、oringinal_network_id、tansport_stream _id、 service_id和version_number。

 

    以EIT表为例。EIT的PID是0X0012,当它的table_id=0X4E时,EIT描述的是在当前TS中的当前/后续(EIT present/following)事件信息;table_id=0X4F时,EIT描述的是在其它TS中的当前/后续(EIT present/following)事件信息。这两个不同的描述形成了EIT的两个表。每个表分为两个段,一个段用来描述当前正在播放的事件,另一个段用来描述即将播放的事件。此时两个段的table_id、service_id、tansport_stream_id是相同的,但 section_number不相同,section_number 0x00用来描述当前事件,section_number 0x01描述下一个事件。

 

⑴ 网络描述表(NIT)的作用
在MPEG2中由于并没有对NIT表进行定义,所以在PSI中NIT表内容是私有的,但在DVB中给NIT表作了明确的定义,所以NIT表是一个全局表,就是一个数字电视系统只对应两个NIT表,分别为当前网络表(table_id=0X40)和其他网络表(table_id=0X041),每个不同的网络视其频点数(1个TS=1个频点)的多少对应一个或多个子表,通过network_id来区分。

    NIT表主要是提供有关物理网络的信息,网络信息表传送本网络以及与此有关的其它网络的一些信息。每个网络都有唯一的识别符(network_id)。网络信息表主要携带:网络识别符(Network_ID)、网络名称、传输系统参数(有线传输系统参数包括:频率、调制方式、FEC外码、符号率、FEC内码)、节目业务类型及Service_ID等信息。机顶盒只要调谐到携带NIT表的传送流中,即可提取其它网络的参数,一般解码器便可根据提取出来的信息,自动搜索频道。

    这里说一说network_id和oringinal_network_id的分别。每个运营商都需要注册唯一的network_id,假设中央电视台的 network_id=0X01,广州电视台的network_id=0X02 。当中央电视台直接播发自己的节目时,network_id=oringinal_network_id,如果由广州电视台转播中央电视台的节目时,那么 network_id=0X02,oringinal_network_id=0X01。也就是说oringinal_network_id等于节目原发运营商的network_id。

 

⑵     业务描述表(SDT)的作用

SDT表是由DVB定义的,是一个SI表,因此它是一个全局表,一个数字电视系统对应两个SDT表,分别为当前流(actual transport)表(table_id=0X42)和其他流(other transport)表(table_id=0X46)。每一个TS对应一个子表(也有对应多个子表的,如同一个TS但业务来自不同的 original_network),通过tansport_stream_id和original_network_id来区分。图4就是一个SDT表的构成图。从图可看出,这个SDT表由两个表组成,一个是当前流表,只有一个子表;另一个是其他流表,由三个子表组成,每个流对应一个子表。


SDT表用于描述系统中业务的名称、业务提供者、是否有相应的事件描述表等方面的信息;业务描述表可以描述当前传输流,也可以描述其他传输流,这由表的Table_ID来区分。业务描述表提供了如下的信息:属于哪一个节目业务群;节目业务的类型,如PAL、NTSC、SECAM、调频广播、图文电视、准视频点播等;节目业务的提供者;可以接收该业务的国家和不可以接收该业务的国家;指向特定的链接信息;实现准视频点播的指导信息;实现多画面的控制信息;指示使用的加密系统;给出实现交互式回传信道的电话号码;提供多语种的节目业务名称和广播者以及私有数据。但最常用的是业务列表,即对业务名称的描述,如中央1台、广州新闻台、珠江台等等。

 

⑶     事件信息表(EIT)的作用

EIT表是由DVB定义的,是一个SI表,因此它是一个全局表,一个数字电视系统每一个业务对应两种EIT表。一是EIT present/following表(描述当前事件/后续事件),一个业务对应着一个EIT present/following表,EIT present/following表分为当前流表(table_id=0X4E)和其他流表(table_id=0X4F),每一个流通常对应6个(有 6个业务)EIT present/following子表,每个子表由两个段组成,分别是EIT present段和EIT following段,section_number= 0x00的段描述当前播放的事件, section_number= 0x01段描述后续播放事件,图5所示。其他流表结构与当前流表相同;二是EIT schedule(时间表)表,一个业务最多可对应16个EIT schedule表,那么每个流通常最多可对应6(业务数)×16=96个子表,每个子表由256个段组成(由于分段号是8个比特,所以最多只能有256 个分段),。

 

对于EIT schedule表,它是用作描述一个业务在一段时间(可以是一天、一周,最大可以是64天,根据冗余带宽来进行设定)内所播放的节目安排,节目的播出安排是以时间和节目简介作为描述的。时间及内容是描述一个事件的最基本元素,例如:把一个业务所播放的每一个节目都看成是一个事件,那么每一个节目开始播放的时间和播放时间的长度及事件的内容就是该事件的基本元素,EIT schedule子表就是用这一基本元素来描述每一个事件并产生某一段时间内要发生的所有事件的列表,因此EIT schedule子表的信息量很大(EIT表的段限长4096字节),由256个section组成,所以又引入了segment(片段)的概念。把 256个段分成32个segment;一个segment由8个section(分段)组成,每个segment可以描述3个小时的事件信息,也就是说,一个EIT schedule表由32个片段组成,每个片段由8个分段组成,通过section_number来区分,那么每个子表可描述32*3=96小时(4天)的事件信息,由于一个业务最多可对应着16个EIT schedule表,则对于一个业务来说最多可以描述16(0X50----0X5F)*4=64天的事件信息。这里,segment相当于一个事件组,section是事件组内具体的一个事件。EIT schedule表也分为当前流表(table_id=0X50---0X5F 共16个)和其他流表(table_id=0X60---0X6F 共16个), EIT schedule表是可选的(即系统可以发送此表也可以不发送此表),事件信息按时间顺序排列。

 

EIT表包含事件或节目的有关数据,如事件的名称、开始时间、持续时间、运行状态等。事件信息表提供如下信息:节目段的标识号、起始时间、持续时间、播放状态、是否加密;指向特定信息的链接信息;节目段多语种的简短介绍;节目段的详细介绍;两段同样节目段的时间偏移;基本码流类型介绍,如视频的幅型比、伴音的类型、字幕的类型等;使用的加密系统介绍;节目类型介绍,如电影/戏剧、新闻、综艺、体育、少儿、音乐、艺术、社会政治、文教等;节目限定年龄的级别介绍;给出实现交互式回传信道的电话号码;为满足各节目段的码率而提供的缓存大小信息及私有数据。事件信息中提供了类似于广播电视报所提供的节目表的内容,根据EIT及其它表所提供的信息,可以做出各种EPG功能,如按节目类型检索、按时间检索及对某类节目的锁定等。可以说EIT表是提供EPG信息的主要表,也是结构最复杂的SI表。

在EIT present/following表中,每一事件都用一个event_id来标识它,每一个事件的顺序关系(当前正在发生的事件/后续发生的事件)就由EIT present/following来描述。

 

那么如何来识别当前正在发生的事情和后续发生的事情呢?那是通过event_id来标识的,如图5所示。图中event_id=0X49表示当前正在发生的事件;event_id=0X4A表示后续发生的事件。那么在当前事件完成进入后续事件时,此时的后续事件变成当前事件,后续事件将由一个新的事件代替。这一变化是使用version_number来加以描述的。例如:

当前播出 19:00----19:30 新闻联播 event_id=0X49;

后续播出 19:31----20:00 动画片 event_id=0X4A,此时version_number=0

设新的后续 21:01---21:45 曲艺节目。当新闻联播完成后,则变化为:

当前播出 19:31----20:00 动画片 event_id=0X49;

后续播出 21:01----21:45 曲艺节目 event_id=0X4A,此时version_number=1

6是由SDT表和EIT表所产生的EPG信息,图7是由EIT表所产生的一个节目频道的节目播出时间表。
   

EIT表是SI表中结构最复杂的表,图8是它的结构图。

机顶盒通常都有一个“节目指南”的按钮,按动它就可以读取EIT sschedule自表里的信息,显示某一个业务在某段时间内的所有事件列表.chedule自表里的信息,显示某一个业务在某段时间内的所有事件列表。

[转载]PSI/SI解析(各种id说明)

⑷     业务组关联表(BAT)的作用

BAT表是由DVB定义的,是一个SI表,因此它是一个全局表,一个数字电视系统只对应一个BAT表,其table_id=0X 4A个节目类别对应一个段。为了让受众能更方便地在众多的节目中寻找出自己喜欢的节目,往往需要提供一种把众多的节目频道进行分类的方法(一个类相当一个节目组)。例如把电影频道归为“家庭影院”的类别,把电视连续剧归为“电视剧场”的类别等等,BAT表就提供了这一功能,每一个类别都用一个bouquet_id 来标识。它包括了节目业务名称(类别)及节目组所包含的节目清单(节目列表)。BAT表在SI信息中属于可选表。

BAT表还支持一个特别的描述符,称为国家获得性描述符。此描述符的意义是:运营商可能出于运营的需要,把一些业务提供给特定(国家)的人群收看,而不希望给其他(其他国家)的人群收看,那么,就可以利用国家获得性这一描述符,在其他人群收看节目时不显示这些业务。这个描述符同样支持SDT表,不过在SDT 表中指的是某一个业务,而不是一个业务组。所以,BAT表概括地说是提供给不同观众不同组合节目的一种方法。

⑸ 其他表

对于PAT、PMT和CAT表,都是由MPEG-2定义的,是PSI里面的表,所以这三个表都不是全局表,它们存在在每一个TS中。PSI信息使用这3个表来定义码流的结构,一个TS对应一个PAT表;一个CA系统和一个TS对应一个CAT表,CAT表的PID值总是1,每个CAT都只给出其所在流的EMM(包括携带组密钥的EMM和携带产品密钥的EMM)包的PID等信息;一个业务(节目频道)对应一个PMT表,一个TS对应多个PMT(视流中所携带的业务数而定)且只对应本流的业务。

 

PAT的PID是0,它是PSI信息的根,要查找信息时首先必须从PAT开始,表中列出了传送码流中所有节目所对应的PMT的PID,可根据这些PID找到相应的PMT包。在PMT表中又可以找到与节目有关的所有基本码流,如视频、音频、ECM和数据等有关信息的PID,然后把这些标有这一PID的数据包组织起来通过解码,把节目或数据还原出来。

 

以上PSI的几个表和NIT表是解码所必需的表,而SDT和EIT是构成业务信息所必需的表。

 

SI还有其他的表,如:TDT表,称为时间日期表,它给出了当前的时间和日期的信息,有时也可作为机顶盒解码时钟的更新;RST表,称为运行状态表,属于可选表,它用于快速更新某节目或某些节目的运行参数,RST只有在状态或节目变更时才发送一次;ST表,称为填充表,属于可选表,它用来替代不传送的表。

⑹ 描述符

描述符是用来携带节目要素和TS流等的各种参数的信息结构、语法与语义,描述符是PSI/SI表的构成主体,PSI/SI表的主要意义就是传送这些描述符,为机顶盒提供相关业务描述与运行参数,可以认为SI表是舟而描述符是舟上的货物。描述符的通用结构都是以descriptor_tag (描述符标记)字段与紧跟其后的descriptor_length(描述符长度)字段开始。每个SI表通常都使用特定的描述符,但也不限制这些描述符在其他表中使用。

描述符是随使用它的SI表一起发送的。

描述符以及在它们的PSI/SI表中的位置见下表

[转载]PSI/SI解析(各种id说明)



在PSI/SI表里,我们通常都看到一个循环语句,如:

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

descriptor()

}

这个循环语句是用来引导机顶盒读取描述参数用的,以SDT子表为例,由于一个SDT子表里面包含了对多个业务的描述,每个业务的都使用了Multilingual_service_name_descriptor和service_descriptor描述符,也就是说一个SDT子表里同样的描述符被使用了多次(也可以理解为,一个描述符里存有多个描述参数),通过循环语句来对描述符进行重复有序的读取,来提取里面的描述参数,直到读完为止。

网络信息表(NIT)的段数据结构:

Netwok_information_section(){ 网络信息段

Table_id   8bit 表标识

Section_syntax_indicator 1bit 段序列指示(标记位),此值=1时,规定从section第43位开始的5位是版本号

Reserved_future_use 1bit 保留将来使用字段

Reserved   2bit 保留字段

Section_length 12bit 段长度

Network_id 16bit 网络标识

Reserved   2bit 保留字段

Version_number   5bit 表版本号,作为表更新机制

Current_next_indicator 1bit 当前/下一个有效指示位(标记位),表示当前表是否有效,如果Current_next_indicator为1,则当前表有效;0表示当前表无效.

Section_number 8bit 当前段段号

Last_section_number 8bit 最后段号(反映了这个子表由多少个段组成,如其值为0X01那么表示这个子表由两个段组成)

Reserved_future_use   4bit 保留将来使用字段

Network_description_length 12bit 网络描述符长度

For(I=0;I<N;I++){ 获取网络

Descriptor()   读取网络描述参数(网络名称描述符、连接描述符)

}

reserved_future_use 4bit 保留将来使用字段

transport_stream_loop_length 12bit 传输流循环长度

for(I=0;I<N;I++){ 获取传输流(整个系统的传输流)

transport_stream_id 16bit 传输流标识

original_network_id 16bit 原始网络标识

reserved_future_use 4bit 保留将来使用字段

transport_descriptors_length 12bit 传输描述符长度

for(j=0;j<N;j++){ 获取传输流的描述子(有线传送系统描述符、业务列表描述符等)

descriptor() 读取描述参数

}

}

CRC_32 32bit 循环校验码

}

这篇关于PSI/SI解析(各种id说明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745933

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro