模拟电视中每一个频道就对应一个节目,所以只要调谐到相应的频率, 就可以收看对应的节目。 在数字电视信号中,为了节省带宽,采用了复用技术,一个物理频道可以传输多路节目。一个物理频道上只能传输一路TS流。想观看其中的某一个节目,还必须从该TS中提取出该节目的数据,再对数据进行解码。在mpeg-2的TS中,节目专用信息PSI(Program Specific Information),规定了该TS中不同节目的复用信息。以PSI为基础可以提供一个码流的构成,使得STB设备可以识别出TS中的节目,帮助用户对节目进行选择。DVB中的SI信息SI(Service Information)对PSI进行了进一步的扩展,加入了一些对用户有用的信息,如节目的类型,节目指南等。正确的了解mpeg-2的PSI以及DVB的SI的结构,和这些信息的应用,对于我们做好对数字节目的复用能起到帮助作用。
MPEG-2 TS中的PSI
PSI信息主要包括:PAT(Program Association Table):节目关联表,该表的PID固定为0x0000,它的主要作用是指出该传输流ID,以及该传输流中所包含的节目对应的的PMT表和网络信息表的PID。
PMT(Program Map Table):节目映射表,该表的PID是由PAT提供给出的。通过该表可以得到一路节目中包含的信息,包括该路节目由哪些流构成和这些流的类型(视频,音频,数据),指定节目中各流对应的PID,以及该节目的PCR所对应的PID。
NIT(Network Information Table):网络信息表,该表的PID是由PAT提供给出的(很多情况下是指定的固定PID或PID组合)。NIT的作用主要是对多路传输流的识别(用于根据NIT信息进行搜台场合),NIT提供多路传输流,物理网络及网络传输的相关信息,如用于调谐的频率信息以及编码方式。调制方式等参数方面的信息(这些参数很多也是固定的,不通过nit获取,以加快搜台速度)。
CAT(Conditional Access Table):条件访问表,PID固定为0x0001。该表给出了系统中使用的CA的厂商代码信息,并提供传输EMM信息的TS的PID。
DVB中的SI
SI的主要用途有:
a、对节目进行分组;
b、对节目进行描述;
c、实现电子节目指南EPG(Electronic Program Guide)。
DVB规定携带SI信息的传输包必须用指定的PID,指定的PID如下表:
a、对节目进行分组;
b、对节目进行描述;
c、实现电子节目指南EPG(Electronic Program Guide)。
DVB规定携带SI信息的传输包必须用指定的PID,指定的PID如下表:
由于存在一个PID对应不同表的情况,需要进一步使用TableID对特定的表进行识别。预定义的TableID表如下:
Value Description
0x00 Program_association_section
0x01 Conditional_access_section
0x02 Program_map_section
0x03 Transport_stream_description_section
0x04~0x3F Reserved
0x40 Network_information_section-actual_network
0x41 Network_information_section-other_network
0x42 Service_description_section-actual_transport_stream
0x43~0x45 Reserved for future use
0x46 Service_description_section-other_transport_stream
0x47~0x49 Reserved for future use
0x4A Bouquet_association_section
0x4B~0x4D Reserved for future use
0x4E Event_information_section-actual_transport_stream,P/F
0x4F Event_information_section-other_transport_stream,P/F
0x50~0x5F Event_information_section-actual_transport_stream,schedule
0x60~0x6F Event_information_section-other_transport_stream,schedule
0x70 Time_data_section
0x71 Running_status_section
0x72 Stuffing_section
0x73 Time_offset_section
0x74~0x7D Reserved for future use
0x7E Discontinuity_information_section
0x7F Selection_information_section
0x80~0xFE User defined
0xFF Reserved
Value Description
0x00 Program_association_section
0x01 Conditional_access_section
0x02 Program_map_section
0x03 Transport_stream_description_section
0x04~0x3F Reserved
0x40 Network_information_section-actual_network
0x41 Network_information_section-other_network
0x42 Service_description_section-actual_transport_stream
0x43~0x45 Reserved for future use
0x46 Service_description_section-other_transport_stream
0x47~0x49 Reserved for future use
0x4A Bouquet_association_section
0x4B~0x4D Reserved for future use
0x4E Event_information_section-actual_transport_stream,P/F
0x4F Event_information_section-other_transport_stream,P/F
0x50~0x5F Event_information_section-actual_transport_stream,schedule
0x60~0x6F Event_information_section-other_transport_stream,schedule
0x70 Time_data_section
0x71 Running_status_section
0x72 Stuffing_section
0x73 Time_offset_section
0x74~0x7D Reserved for future use
0x7E Discontinuity_information_section
0x7F Selection_information_section
0x80~0xFE User defined
0xFF Reserved
常用的SI表介绍:
SDT(Service Description Table):用于描述系统中各路节目的名称,该节目的提供者,是否有相应的时间描述表等方面的信息。该表可以描述当前传输流0x42,也可以描述其他的传输流0x46。
EIT(Event Information Table):该表示对某一路节目的更进一步的描述。它提供事件的的名称、开始时间、时长、运行状态等。
BAT(Bouquet Association Table):该表提供一系列节目的集合。这些节目可以不在同一个传输流中。利用该表可以很方便的进行相关节目或某一类节目的浏览和选择。提供业务分组功能。
RST(Running Status Table):该表提供某一具体事件的的运行状态,可用于按时自动的切换到指定的事件。
TDT(Time and Data Table):该表提供当前的时间信息,该表用来对IRD的解码时钟进行更新。
TOT(Time Offset Table):该表提供当地时间与TDT之间的关系,该表与TDT配合使用。
TSDT(Transport Stream Description Table):由PID0x0002标识,提供传输流的一些参数。
ST(Stuffing Table):该表表明其内容是无效的,只是作为填充字节。
TOT(Time Offset Table):该表提供当地时间与TDT之间的关系,该表与TDT配合使用。
TSDT(Transport Stream Description Table):由PID0x0002标识,提供传输流的一些参数。
ST(Stuffing Table):该表表明其内容是无效的,只是作为填充字节。
几个常用表的使用
1、NIT
网络信息表可以提供一组传输流以及相应的调谐信息。NIT在IRD启动程序中用到,并且调谐信息可以存储到不变的存储器中。NIT还可以用来标志调谐信息的变化。一般情况下,NIT表用在搜台时,先通过NIT表获取各传输流的频点信息,之后再按顺序锁定指定的频点。
NIT遵从如下规定:
a、当前的传输系统必须包含NIT。
b、当且仅当NIT包含可用的传输系统描述符(tag为0x44),当前传输系统才是有效的。例如,一个卫星IRD接受到当前传输系统的一个卫星传输系统描述符,那么这个描述符被视为有效,如果一个电缆IRD接收到当前传输系统的一个电缆传输系统描述符也是有效的,但是,如果电缆IRD接收到当前传输系统的一个卫星传输系统描述符,那么这个描述符对于这个IRD就是无效的。
c、如果当前传输系统一个有效的NIT在SI比特流中出现,那么这个NIT应当列出当前传输系统中所有的TS。
d、SI流每10秒钟应当至少包含8个TS包来传输NIT或者空包。这个规定简化了广播传输边界中NIT的复位(replacement)。使用这样的复位机制,使得本地频率控制使用低廉设备成为可能。
SI使用两个标志来描述传输系统。它们分别是network_id和original_network_id。后者用来作为一个TS中的一个服务的唯一标志符,即使这个TS被传送到了其他的传输系统之中也不会变化。一个TS被original_network_id+transport_stream_id唯一标识。一个服务可以被original_network_id+transport_stream_id+service_id唯一标识。另外,每个original_network_id中都有不同的service_id。
假设有两个服务,它们源于两个不同的传输系统并且碰巧有相同的service_id和transport_stream_id,它们被传输到一个新的传输系统。如果这两个服务被放在同一个TS中,那么必须修改服务的ID号,因为在同一个TS中一个service_id不能够分配给多个服务(PAT表无法对应PMT),并且一个TS仅仅可以对应一个original_network_id。
2、BAT
BAT提供一组服务,这些服务提供了一个基础,IRD在这些基础之上向用户展示有效的服务。BAT的传输是可选的。下面的规则提高了SI比特流的连贯性并且简化了IRD的工作。
SI比特流应当在每个BAT子表中列出集合的所有服务。
注意:一个服务可以属于多个bouquet。这一规定使得IRD可以通过不同的TS得到一个服务。
如果IRD将bouquet中服务信息提供给用户,那么列在bouquet中的服务就得到保证,否则一些服务将会丢失。一个bouquet可以把不同网络传输的多个TS中的服务集中起来。如果BAT中所有服务都被列在SDT中,IRD对bouquet中所有服务信息的访问将会变得容易。同样的,如果NIT信息给出所有TS中service的容量,IRD对service的访问将会变得容易。
3、SDT
SDT用来罗列TS中service的名称以及其他参数。每一个TS中都有一个独立的SDT子表。
a、当前的传输系统必须包含NIT。
b、当且仅当NIT包含可用的传输系统描述符(tag为0x44),当前传输系统才是有效的。例如,一个卫星IRD接受到当前传输系统的一个卫星传输系统描述符,那么这个描述符被视为有效,如果一个电缆IRD接收到当前传输系统的一个电缆传输系统描述符也是有效的,但是,如果电缆IRD接收到当前传输系统的一个卫星传输系统描述符,那么这个描述符对于这个IRD就是无效的。
c、如果当前传输系统一个有效的NIT在SI比特流中出现,那么这个NIT应当列出当前传输系统中所有的TS。
d、SI流每10秒钟应当至少包含8个TS包来传输NIT或者空包。这个规定简化了广播传输边界中NIT的复位(replacement)。使用这样的复位机制,使得本地频率控制使用低廉设备成为可能。
SI使用两个标志来描述传输系统。它们分别是network_id和original_network_id。后者用来作为一个TS中的一个服务的唯一标志符,即使这个TS被传送到了其他的传输系统之中也不会变化。一个TS被original_network_id+transport_stream_id唯一标识。一个服务可以被original_network_id+transport_stream_id+service_id唯一标识。另外,每个original_network_id中都有不同的service_id。
假设有两个服务,它们源于两个不同的传输系统并且碰巧有相同的service_id和transport_stream_id,它们被传输到一个新的传输系统。如果这两个服务被放在同一个TS中,那么必须修改服务的ID号,因为在同一个TS中一个service_id不能够分配给多个服务(PAT表无法对应PMT),并且一个TS仅仅可以对应一个original_network_id。
2、BAT
BAT提供一组服务,这些服务提供了一个基础,IRD在这些基础之上向用户展示有效的服务。BAT的传输是可选的。下面的规则提高了SI比特流的连贯性并且简化了IRD的工作。
SI比特流应当在每个BAT子表中列出集合的所有服务。
注意:一个服务可以属于多个bouquet。这一规定使得IRD可以通过不同的TS得到一个服务。
如果IRD将bouquet中服务信息提供给用户,那么列在bouquet中的服务就得到保证,否则一些服务将会丢失。一个bouquet可以把不同网络传输的多个TS中的服务集中起来。如果BAT中所有服务都被列在SDT中,IRD对bouquet中所有服务信息的访问将会变得容易。同样的,如果NIT信息给出所有TS中service的容量,IRD对service的访问将会变得容易。
3、SDT
SDT用来罗列TS中service的名称以及其他参数。每一个TS中都有一个独立的SDT子表。
为了提高对service的采集,定义了下列规则:
1.强制传输当前TS的SDT。
2.SDT列出的SI比特流至少包括TS中所有服务。
另外:
当前TS(例如table_id=0x46)中SDT描述其他TS时,应当列出这个TS的所有service。
强烈推荐service_id,在一个network中一旦把一个service_id分配给了一个特定的服务,那么这个service_id将不再变化,以便于IRD实现收藏频道列表之类的功能。
4、EIT
事件信息表用来传递当前的,将来的甚至更远的未来的事件的信息。每个Service都有自己独立的EIT子表。
4.1 EIT Present/Following 信息(一下简称EIT P/F)
下列规则简化了EIT P/F信息的获得。SI规范规定EIT段最大部超过4096字节。
SI流中的每个Service都有两段来描述EIT Present/Following,section_number 0x00用来描述当前事件,section_number 0x01描述下一个事件。这些约束不适用于NVOD引用的Service,这些Service在每段中可能有多个事件描述,并且在EIT Present/Following中可能有更多的段。推荐提供事件描述event_id的升序排列。
在一个section中,SI可以用最多4096个字节来描述一个单独的事件。
对于当前事件有如下规定:
a、同一时刻最多只有一个当前事件。
b、当存在一个当前事件时,该事件应当被描述在EIT Present/Following的section0中。
c、当前事件中的running_status应当被给出。如下表:
e、在同一时刻,最多有一个following event。
f、如果following event存在,该事件应当在EIT Present/Following的section1中。
g、如果following event不存在,则传输一个section1为空的EIT Present/Following。
h、following event的running_status应当给出,如下表:
事件的持续时间和EIT持续时间一样,必须包含事件被置为“not running”或者“pausing”。事件的开始时间和EIT start_time一样,应当是整个事件的开始时间,而不是从pause恢复后的时间。
注意:一个事件的开始时间加上它的持续时间可能比following event的开始时间要小。换句话说,允许事件之间有间隔。在这种情况下,following event被看作是间隔后的事件。这个事件应当编在EIT Present/Following的section1中。
注意:开始时间和持续时间都是预定的。一些广播服务提供商可能会更新这些信息。而另一些则更愿意保持开始时间不变。例如为了避免名为“8点新闻”的事件被误解,把信息中的开始时间从8:01:23改为8:00:00。
4.2 EIT Schedule信息
1)EIT Schedule结构
遵从如下规则:
a、EIT/Schedule分配了16个table_id,0x50-0x5F给当前TS,0x60-0x6F给其它TS,这些id按照时间顺序排列;
b、子表下的256个section被分为32段(segment),每8个section一个段(segment)。Segment#1,从section0到7,segment#2,从section8到15,等等;
c、每段包含三个小时内开始的事件信息;
d、段内事件信息按照时间排列;
e、如果一个段(segment)有n节(section),而n<8,这个信息必须放在段中前n个节中,还要显式指明最后一节的位置:S0+n-1(S0是段中第一节),这个值在EIT的segment_last_section_number中。例如,第二段只有两节,那么segment_last_section_number包含值8+2-1=9;
f、如果段中有节的话,段的segment_last_section_number应当有值s0+7;
g、完全空的段通过空节(不含任何loop over事件)表示,段的vsegment_last_section_number值为s0+0;
h、段中事件的安排遵从一个时间t0。
1.强制传输当前TS的SDT。
2.SDT列出的SI比特流至少包括TS中所有服务。
另外:
当前TS(例如table_id=0x46)中SDT描述其他TS时,应当列出这个TS的所有service。
强烈推荐service_id,在一个network中一旦把一个service_id分配给了一个特定的服务,那么这个service_id将不再变化,以便于IRD实现收藏频道列表之类的功能。
4、EIT
事件信息表用来传递当前的,将来的甚至更远的未来的事件的信息。每个Service都有自己独立的EIT子表。
4.1 EIT Present/Following 信息(一下简称EIT P/F)
下列规则简化了EIT P/F信息的获得。SI规范规定EIT段最大部超过4096字节。
SI流中的每个Service都有两段来描述EIT Present/Following,section_number 0x00用来描述当前事件,section_number 0x01描述下一个事件。这些约束不适用于NVOD引用的Service,这些Service在每段中可能有多个事件描述,并且在EIT Present/Following中可能有更多的段。推荐提供事件描述event_id的升序排列。
在一个section中,SI可以用最多4096个字节来描述一个单独的事件。
对于当前事件有如下规定:
a、同一时刻最多只有一个当前事件。
b、当存在一个当前事件时,该事件应当被描述在EIT Present/Following的section0中。
c、当前事件中的running_status应当被给出。如下表:
e、在同一时刻,最多有一个following event。
f、如果following event存在,该事件应当在EIT Present/Following的section1中。
g、如果following event不存在,则传输一个section1为空的EIT Present/Following。
h、following event的running_status应当给出,如下表:
事件的持续时间和EIT持续时间一样,必须包含事件被置为“not running”或者“pausing”。事件的开始时间和EIT start_time一样,应当是整个事件的开始时间,而不是从pause恢复后的时间。
注意:一个事件的开始时间加上它的持续时间可能比following event的开始时间要小。换句话说,允许事件之间有间隔。在这种情况下,following event被看作是间隔后的事件。这个事件应当编在EIT Present/Following的section1中。
注意:开始时间和持续时间都是预定的。一些广播服务提供商可能会更新这些信息。而另一些则更愿意保持开始时间不变。例如为了避免名为“8点新闻”的事件被误解,把信息中的开始时间从8:01:23改为8:00:00。
4.2 EIT Schedule信息
1)EIT Schedule结构
遵从如下规则:
a、EIT/Schedule分配了16个table_id,0x50-0x5F给当前TS,0x60-0x6F给其它TS,这些id按照时间顺序排列;
b、子表下的256个section被分为32段(segment),每8个section一个段(segment)。Segment#1,从section0到7,segment#2,从section8到15,等等;
c、每段包含三个小时内开始的事件信息;
d、段内事件信息按照时间排列;
e、如果一个段(segment)有n节(section),而n<8,这个信息必须放在段中前n个节中,还要显式指明最后一节的位置:S0+n-1(S0是段中第一节),这个值在EIT的segment_last_section_number中。例如,第二段只有两节,那么segment_last_section_number包含值8+2-1=9;
f、如果段中有节的话,段的segment_last_section_number应当有值s0+7;
g、完全空的段通过空节(不含任何loop over事件)表示,段的vsegment_last_section_number值为s0+0;
h、段中事件的安排遵从一个时间t0。
t0是通用时间坐标(Universal Time Coordinated(UTC))的“last midnight”。
举个例子:UTC-6的下午5点,就是UTC-0的下午11点,即从“last midnight”算起23小时。因此对于UTC-6,t0就是前一天的下午6点;
i、table_id 0x50(对其它TS是0x60)的第0段,包含从午夜(UTC时间)到“今天”02:59:59(UTC时间)(三个小时)的事件信息。第1段包含从03:00:00到05:59:59(UTC时间)的事件信息,依此类推。这就意味着,第一个子表包含从“今天”UTC午夜时间算起前4天的信息;
j、last_section_number用来指明子表的结束位置;
k、last_table_id用来指明整个EIT/Schedule结构的结束位置;
l、与过去事件相关的段可以用空段代替,参见g规则;
m、EIT/Schedule包含的事件定义中的running_status应当设为“为定义”即0x00;
n、EIT/Schedule表不适用于NVOD涉及的服务,因为这些服务带有未定义开始时间的事件;
2)EIT 加密
EIT Schedule表格可以被加密。为了与条件接入相联系,必须分配一个service_id(=MPEG-2 program_number)来描述加密的EIT Schedule Tables,这个service_id在PSI中。EIT在PMT中定义,service_id看成由一个private stream组成的各种电视节目(The EIT is identified in the Program Map Table (PMT) section for this service_id as a programmeconsisting of one private stream),PMT包含一个或多个CA_descriptor来验证相关的CA码流。为达到这个目的,在DVB应用程序中service_id的值0xFFFF被保留。
举个例子:UTC-6的下午5点,就是UTC-0的下午11点,即从“last midnight”算起23小时。因此对于UTC-6,t0就是前一天的下午6点;
i、table_id 0x50(对其它TS是0x60)的第0段,包含从午夜(UTC时间)到“今天”02:59:59(UTC时间)(三个小时)的事件信息。第1段包含从03:00:00到05:59:59(UTC时间)的事件信息,依此类推。这就意味着,第一个子表包含从“今天”UTC午夜时间算起前4天的信息;
j、last_section_number用来指明子表的结束位置;
k、last_table_id用来指明整个EIT/Schedule结构的结束位置;
l、与过去事件相关的段可以用空段代替,参见g规则;
m、EIT/Schedule包含的事件定义中的running_status应当设为“为定义”即0x00;
n、EIT/Schedule表不适用于NVOD涉及的服务,因为这些服务带有未定义开始时间的事件;
2)EIT 加密
EIT Schedule表格可以被加密。为了与条件接入相联系,必须分配一个service_id(=MPEG-2 program_number)来描述加密的EIT Schedule Tables,这个service_id在PSI中。EIT在PMT中定义,service_id看成由一个private stream组成的各种电视节目(The EIT is identified in the Program Map Table (PMT) section for this service_id as a programmeconsisting of one private stream),PMT包含一个或多个CA_descriptor来验证相关的CA码流。为达到这个目的,在DVB应用程序中service_id的值0xFFFF被保留。