数字电视与传统模拟电视节目选择的方式完全不同,传统电视的每一个频道对应有个节目,只要调到相应的频率,就可以看到节目。而在数字电视信号中,一路码流对应多路节目,使用复用技术就可以做到了。一个物理频道只能给出包含多路的一路传输流。要观看其中的某一路节目,还必须从传输流中提出该路节目的压缩包,然后再进行解码。所以怎么从众多的传输流中,选中一路节目播放,就变得更很复杂。在 mpeg-2 的传输流( Transport Stream )中,节目专用信息 PSI ( Progame Specific Information ),就是规定不同节目和节目的不同成分如何复用成一个统一的码流。以 PSI 为基础可以提供一个码流的构成,从而帮助用户对节目进行选择。 DVB 中的服务信息( Service Information )则对此进行了进一步的扩展,加入了一些对用户有用的信息,表示节目的类型、服务商、节目的相互关系等。正确的了解 mpeg-2 的 PSI 以及 DVB 的 SI 的结构,以及其在节目组织、选择中的应用,可以正确理解 service information 在 DVB 解码中的地位。对于我们做好对数字节目的复用,也能起到帮助的作用。
1、 MPEG-2 TS 中的 PSI
PSI 信息主要包括一下的表:
PAT(Program Association Table) :节目群从表,该表的 PID 是固定的 0x0000 ,它的主要作用是指出该传输流的 ID ,以及该路传输流中所对应的 MAP 表和 NIT 表的 PID.
PMT(Program Map Table) :节目映射表,该表的 PID 是由 PAT 提供给出的。通过该表可以得到一路节目中包含的信息,例如:该路节目由哪些流构成和这些流的类型(视频、音频、数据),指定节目中各流度应的 PID ,以及该节目的 PRC 所对应的 PID.
NIT(Network Information Table) :网络信息表,该表的 PID 是由 PAT 提供的。 NIT 的作用主要是对多路传输流的识别, NIT 提供多路传输流、物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以及编码方式、调制方式等参数方面的信息。
CAT(Conditional Access Table) :条件访问表, PID-0x0001 。
除了上述的几种表外, mpeg-2 还提供了私有字段,用于实现对 mpeg-2 的扩充。
2、 DVB 中的 SI
MPEG-2 的 PSI 中提供了不少的关于节目组成和相互关系的信息,从而使得在接收端可以正确的对多路传输流进行分解。但是这些信息在实际使用时仍显得不够,为此在 DVB 中采用 SI 和 PSI 信息进行了进一步的扩展。
除了在 PSI 中的信息之外, DVB 还定义了一些其他的一些表。
SI 的主要用途有:
a、 根据 NIT 、 PAT 、 PMT 等信息可以进行自动的频道调谐;
b、 更方便的对节目进行选择和定位;
c、 实现电子节目指南 EPG(Electronic Program Guide), 等等。
PSI 中的信息基本上都是与当先码流相关的,即它们所涉及的内容都与当前码流中的部分信息相关。与 PSI 不同的是, SI 的基本信息可以包括不在当前码流中的一些服务和事件,允许用户进行更多的选择和了解更多的其他的服务信息。
DVB 规定携带 SI 信息的传输包必须用指定的 PID ,指定的 PID 如下表:
TABLE TYPE PID VALUE
PAT 0X0000
CAT 0X0001
TSDT 0X0002
RESERVED 0X0003 TO 0X000F
NIT 、 ST 0X0010
SDT 、 BAT 、 ST 0X0011
EIT 、 ST 0X0012
RST 、 ST 0X0013
TDT 、 TOT 、 ST 0X0014
Network Synchroniztion 0X0015
Reserved for future use 0X0016 TO 0X001B
Inband signaling 0X001C
Measurement 0X001D
DIT 0X001E
SIT 0X001F
在该表中可以看到同一个 PID 可以对应不同的表,要把这样的表区分开来,需要进一步找到 TableID 进行识别。 TableID 表如下:
Value Description
0x00 Program_association_section
0x01 Conditional_access_section
0x02 Program _map_section
0x03 Transport_stream_description_section
0x04 TO 0X3F Reserved
0x40 Network_information_section-actual_network
0x41 Network_information_section-other_network
0x42 Service_description_section-actual_stream
0x43 to 0x45 Resreved for future use
0x46 Service_description_section-other_transport_stream
0x47 to 0x49 Reserved for future use
0x4A Bouquet_association_section
0x4B to 0x4D Reserved for future use
0x4E Event_information_section-actual_transport_stream,P/F
0x4F Event_information_section-other_transport_stream,P/F
0x50 to 0x5F Event_information_section-actual_stream,schedule
0x60 to 0x6F Event_information_section-other_stream,schedule
0x70 Time_date_section
0x71 Running_status_section
0x72 Stuffing_section
0x73 Time_offset_section
0x74 to 0x7D Reserved for future use
0x7E Discontinuity_information_section
0x7F Selection_information_section
0x80 to 0xFE User defined
0xFF Reserved
有了这两个 ID ,我们可以在码流中找到我们想要的任何一张表。
SI 主要包括一下一些信息表:
NIT(Network Information Table) : NIT 的作用主要是对多路传输流的识别, NIT 提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以及编码方式、调制方式等参数方面的信息,根据此信息设置 IRD(Integrated Receiver Decoder) 可以进行多路传输流之间的切换。
SDT ( Service Description Table ):用于描述系统中各路节目的名称,该节目的提供者,是否有相应的时间描述表等方面的信息。该表可以描述当先传输流,也可以描述其他的传输流,这个由 TableID 进行区分。
EIT ( Event Information Table ):该表是对某一路节目的更进一步的描述。它提供事件的名称、开始时间、时间长度、运行状态等;
TDT ( Time and Date Table ):该表提供当前的时间信息,该表用来对 IRD 的解码时钟进行更新;
BAT(Bouquet Association Table) :该表提供一系列类似节目的集合。这些节目可以在不同的传输流中,利用该表可以很方便的进行相关节目或某一类节目的浏览和选择;
RST(Running Status Table) :该表提供某一具体事件的运行状态,可用于按时自动的切换到指定的事件;
TOT(Time Offset Table) :该表提供当地时间与 TDT 之间的关系,该表与 TDT 配合使用;
TSDT(Transport Stream Description Table) :由 PID0x0002 标识,提供传输流的一些参数;
ST(Stuffing Table) :该表表明其内容是无效的,只作为填充字节。
那么,我们如何运用 DVB 中的 SI 信息表呢?
DVB-SI 入门(二)- DVB-SI 的使用 Ben
1、 网络信息表( NIT )
网络信息表提供一组传输流以及相应调谐信息。 NIT 在 IRD (整合接收解码器)启动程序中用到,并且调谐信息可以存储到不变的存储器中。 NIT 还可以用来标志调谐信息的变化。 NIT 遵从如下规定:
a、 当前的传输系统必须包含 NIT 。
b、 当且仅当 NIT 包含可用的传输系统描述符,当前传输系统才是有效的。这就指定了 NIT 包含有效信息的条件。在一些广播传输系统边界, TS 中的 NIT 也被允许用来描述广播频道中的网络。 IRD 不得不选择一个不同的机制来获得当前传输系统的相应的调谐信息。例如,一个卫星 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 可以被 path:original_network_id/transport_stream_id 唯一标识 , 一个服务可以被 peth:original_network_id/transport_stream_id/service_id 唯一标识。显然, network_id 不在这个 path 之内,另外,每个 original_network_id 中都有不同的 service_id 。当一个服务(同一个 TS 内)被传送到另一个传输系统后,只有 network_id 改变了, original_network_id 不受影响。
下面举个例子,考虑如下情况:有两个服务( A 和 B )。它们源于两个不同的传输系统并且碰巧有相同的 service_id 和 transport_stream_id ,它们被传输到一个新的传输系统。在这个例子中,这两个服务被安排在新的 network 中的不同 TS 中。如果这两个服务被放在同一个 TS 中,那么必须修改服务的 ID ,因为在同一个 TS 中一个 SERVICE_ID 不能够分配给多个服务,并且一个 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 的采集,定义了下列规定:强制传输当前 TS 的 SDT;SDT 列出的 SI 比特流至少包括 TS 中所有服务。另外:当前 TS (例如 table_id=0x46 )中 SDT 描述其他 TS 时,应当列出这个 TS 的所有 service 。强烈推荐 service_id ,在一个 network 中一旦把一个 service_id 分配给了一个特定的服务,那么这个 service_id 将不再变化,以便于 IRD 实现收藏频道列表之类的功能。
DVE-SI 入门(三)
4、 EIT 信息
时间信息表用来传递当前的、将来的甚至更远的未来的事件的信息。每个 Service 都有自己独立的 EIT 子表。
4.1 EIT Present/Following 信息(以下简称 EIT P/F )
下列规则简化了 EIP 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 应当被给出。
d、 在同一时刻,最多有一个 following event.
e、 如果 following event 存在,该事件应当在 EIT Present/Following 的 section1 中。
f、 如果 following event 不存在,则传输一个 section1 为空的 EIT Present/Following 。
g、 Following event 的 running_status 应当给出。
事件的持续时间和 EIT 持续事件一样,必须包含事件被设置为“ not running ”或者“ pausing ”。事件的开始时间和 EIT start_time 一样,应当是整个事件的开始事件,而不是从 pause 恢复后的时间。
注意:一个事件的开始时间加上它的持续时间可能比 following event 的开始时间要小。换句话说,允许事件之间有间隔。在这种情况下, following event 被看作是间隔后的事件,这个事件应当编在 EIT Present/Following 的 secting1 中。
注意:开始时间和持续时间都是预定的,一些广播服务提供商可能会更新这些信息,而另外一些则更愿意保持开始时间不变。例如为了避免名为“ 8 点新闻”的事件被误解,把信息中的开始事件从 8 : 01 : 23 改为 8 : 00 : 00
4.2 、 EIT Schedule 结构
1 ) EIT Schedule 结构遵从如下规则:
1 、 EIT/Schedule 分配了 16 个 table_id,0x50-0x5F 给当前 TS , 0x60-0x6F 给其它 TS ,这些 id 按照时间顺序排列;
2 、子表下的 256 个 section 被分为 32 段( segment ) , 每 8 个 section 一个字段( segment ) .Segment#1 、从 section0 到 7 、 section#2 、从 section8 到 15 等等
3 、 每段包含三个小时内开始的事件信息;
4 、 段内事件信息按照事件排列;
5 、 如果一个段( segment )有 n 节( section ) , 而 n < 8, 这个信息必须放在段前 n 个节中,还要显示指明最后一节的位置: S0+n-1(S0 是段中第一节 ) ,这个值在 EIT 的 segment_last_section_number 中。例如,第二段只有两节,那么 segment_last_section_number 包含值 8+2-1 = 9 ;
6 、 如果段中有节的话,段的 segment_last_section_number 应当有值 s0+7;
7 、 完全空的段通过空节(不包含 loop over 事件)表示,段的 vsegment_last_section_number 值为 s0+0
8 、 段中事件的安排遵从一个时间 t0.
T0 是通过时间坐标( Universal Time Coordinated(UTC) )的“ last midnight ”。
举个例子: UTC-6 的下午 5 点,就是 UTC-0 的下午 11 点,即从: last midnight ” 算起 23 小时。因此对于 UTC-6,t0 就是前一天的下午 6 点;
table_id 0x50 (对于其它 TS 是 0x60 )的第 0 段,包含从午夜( UTC 时间)到“今天” 02 : 59 : 59 ( UTC 时间)(三个小时)的事件信息。第一段包含从 03 : 00 : 00 到 05 : 59 : 59 ( UTC 时间)的事件信息。依此类推,这就意味着第一个子表包含“今天” UTC 午夜时间算起 4 天的信息;
9 、 last_section_number 用来指明子表的结束位置;
10 、 last_table_id 用来指明整个 EIT/Schedule 结构的结束位置;
11 、与过去相关的段可以用空段代替,参见 7 规则;
12 、 EIT/Schedule 包含的时间定义中的 running_status 应当设为“为定义”即 0x00 ;
13 、 EIT/Schedule 表不适用于 NVOD 涉及的服务,因为这些服务带有未定义开始时间的事件;
2 ) EIT 加密
EIT Schedule 表格可以被加密,为了与条件接入相联系,必须分配一个 service_id(=MPEG-2 program_number) 来描述加密的 EIT Schedule Tables ,这个 service_id 在 PSI 中。 EIT 在 PMT 中定义, service_id 看成由一个 private steam 组成的各种电视节目( The EIT is identified in the Program Map Table(PMT)section for this service_id as a programme consisting of one private steam ) ,PMT 包含一个或者多个 CA_descriptor 来验证相关的 CA 码流。为达到这个目的,在 DVB 应用程序中 service_id 的值 0xFFFF 被保留。
怎样在众多的数字电视节目中快速地找到用户所需要的节目,是数字电视应用所要解决的问题。在 DVB 接收机中通常都使用电子节目指南( EPG )这一工具来达到快速查找节目的目的,生成 EPG 的数据来源于 DVB 码流中的有业务信息 SI 信息。
在数字电视中,所有视频、音频、文字、图片等经数字化处理后都变成了数据,并按照 MPEG-2 的标准打包,形成固定长度( 188 个字节)的传送包,然后将这些数据包进行复用,形成传送码流( TS ),通常一个频道对应一个 TS 流,一个频道的 TS 流由多个节目及业务组成。在 TS 流中如果没有引导信息,数字电视的终端设备将无法找到需要的码流,所以在 MPEG-2 中,专门定义 PSI 来信息,其作用是自动设置和引导接收机进行解码。 PSI 信息在复用时通过复用器插入到 TS 流中,并用特定的 PID (包标识符)进行标识。
在 MPEG - 2 标准中定义的节目信息 PSI ,是对单一码流的描述,由于系统通常存在多个码流,为了使使用者能在多个码流中快速地找到自己需要的业务,在 DVB 对 MPEF-2 地 PSI 进行了扩充,在 PSI 是个表的基础上再增加了九个表,形成 SI 。 SI 是对整个系统所有码流的描述,描述系统传输内容、广播数据流的编排和事件表等的数据,它包括 PSI 信息。
一、节目信息( PSI )
PSI 由节目关联表( PAT )、条件接受表( CAT )、节目映射表( PMT )和网络信息表( NIT )组成,这些表插入到 TS 中传输。 PSI 指定了如何从一个携带多个节目的传输流中正确找到特定的节目,当接收机要接收某一指定节目时,它首先从节目关联表中取得这个节目映射表中的 PID 值,,然后从 TS 中找出与此 PID 值相对应的节目映射表,从这个节目映射表中获得构成这个节目的基本码流的 PID 值,根据这个 PID 值滤出相应的视频、音频、和数据等基本码流,解码后复原为原始信号,删除含有其余 PID 的传送包。 MPEG-2 传送的结构如图所示:
从上面的几幅图中可知,要保证传送流能正常接收,在该流中至少有一个完整有效的 PAT 。 CAT 描述了节目的加密方式,它包含了节目的 EMM 识别 PID ,只有授权的解码器才能由 CAT 受到密钥,解码出相应的数据流。 NIT 包含节目的频道调谐参数、频率、符号率等物理传输网信息,这些信息使得接收机可以按照用户的选择以很少的延时或无延时地改变频道、调谐参数,正确地解码出 TS 。由于 PSI 数据的完整性十分重要,因此在每个 PSI 段中均需要加校验码。
二、业务信息( SI )
PSI 数据只提供了单个 TS 的信息,使接收机能对单个 TS 中的不同节目流进行解码,但它不能提供多个 TS 的有关业务和节目的类型、什么节目、什么时间开始等信息,因此 DVB 系统对 PSI 进行了扩展,提供了其他不同信息种类的多种表格,形成 SI 。在实用中,我们将 SI 所提供的数据通过有序地组织起来,生成类似节目报的形式,它能在电视机上即时浏览,这样将大大方便用户的使用,这就是电子节目指南 EPG 。
SI 定义了 9 个表格
1 、 业务群关联表( BAT ):它提供了业务群相关的信息,给出了业务群的名称以及每个业务群中的业务列表。
2 、 业务描述表( SDT ) : 它包含了描述系统中业务的数据,例如业务名称、起始时间、持续时间等。
3 、 事件信息表( EIT ) : 它包含了与事件或节目相关的数据, EIT 是生成 EPG 的主要表。
4 、 运行状态表( RST ) : 它给出了事件的状态(运行 / 非运行),运行状态表更新这些信息,允许自动适应切换事件。
5 、 时间和日期表( TDT ) : 它给出了与当前事件和日期相关的信息,由于这些信息更新频繁,所以需要单独使用一个表。
6 、 时间偏移表( TOT ):它给出了与当前事件、日期和本地事件偏移相关的信息,由于这些信息更新频繁,所以需要单独使用一个表。
7 、 填充表( ST ) : 它用于使现有的段无效,例如在一个传输系统的边界。
8 、 选择信息表( SIT ) : 它仅用于码流片段中,如记录一段码流,它包含了描述该码流段业务信息间断的地方。
9 、 间断信息表( DIT ) : 它仅用于码流片段,如记录的一段码流中,它将插入到码流片段业务信息间断的地方。
这里值得一提的是, NIT 在 MPEG-2 标准中未予以规定,而是由 SI 规定。
以上这些表在传送流中以数据段的形式发送,不同的信息表在传送流中通过赋予不同的特定 PID 来进行区分(如表一)。而具有相同的 PID 的不同信息表则进行由表标识符 TABLE ID 来区分,在接收端通过查这些特定的 PID 来找到它们。这里说明一下, TS 中有两种标识符,一种使包标识符,一种使表标识符。例如 SI 中的 SDT 的每一个表都对一个特定的 TS 中的业务进行描述,这些业务可能使这个表所存在的 TS 的一部分,也可能使其他 TS 的一部分,这些 SDT 的 PID 都是相同的,这时候我们就可以通过不同的表标识符来区分它们,从而识别出那一个表所描述的业务使那一个 TS 的。
表一
表 | PID 值 |
PAT | 0X000 |
CAT | 0X001 |
PMT | 0X002 |
NIT | 0X0010 |
SDT 、 BAT | 0X0011 |
EIT | 0X0012 |
TDT 、 TOT | 0X0014 |
SI 中的各表在实际使用中并不都需要传送,其中 NIT 、 SDT 、 EIT 、 TDT 是必须传送的,其它表则按照需要进行选择传送。
三、电子节目指南( EPG )
在 DVB 系统中, EPG 可使用户方便、快捷、直观地找到需要的节目,根据《数字电视广播业务规范》对 EPG 的要求, EPG 应对提供节目单和当前节目播放等基本功能,还提供节目附加信息、节目分类、节目预定和家长分级控制等功能。 EPG 的这些功能均可通过 SI 来实现,也就是说 SI 是实现 EPG 功能的前提。在 SI 中,最重要的是 NIT 、 EIT 和 SDT ,利用这 3 个表中的数据就可以构成功能不同的 EPG 。
NIT 的作用在上面已经说过, SDT 的作用是提供对每个业务的描述,使用户能方便地了解每个业务的内容。对于每一个 TS 都有一个 SDT 与之对应。 EIT 实际上是一个节目表,对于每一个节目都存在一个独立的 EIT 。
EPG 包含两个部分:一是播出前端的 EPG 编辑器;二是用户端接收机相应的控制软件,两部分一一对应,每个接收机的相关部分必须按照前端定义的数据结构来定制,从而接收显示前端送出的业务信息。
SI 一般在复用器合成 TS 时插入,有 3 种插入方式:
1 、 将各表数据通过复用器厂家提供的应用软件接口由复用器插入到节目码流中。
2 、 将各表数据按 MPEG-2 标准打包,通过码流播出卡输出,再将之送入复用器的异步串行口与节目码流复用。
3 、 通过条件接收加扰器提供的接口插入,因此可通过局域网将数据表送入加扰器,由加扰器向码流中插入 SI 。
四、接收机与 EPG
DVB 接收机又称机顶盒,它是接收 DVB 节目的用户端设备。打开接收机,通常都有一个开机画面,这个画面实际上是一个存储于机顶盒内的一个菜单选择页面,它是由称为装载器的控制软件生成的用户操作界面,用户可通过遥控器进行选择操作。每个有线电视营运商所开发的这个界面都有所不同,但功能都是一样的,其主要内容是营运商提供业务(节目)的分类和系统设置及一些辅助功能。这些内容构成了页面的最上层主菜单,其下一层菜单则通常由 SI 生成的 EPG 所构成。
主菜单中的系统设置是为了引导接收机快速准确的接收到 DVB 节目而设的,其有最基本的三个操作:信息检测、节目搜索、软件下载。
1 、信息检测:它主要显示目前 DVB 系统的主频及相关参数,如主频率、码率、调制方式、误码率、信号电平等,供维护人员检测参考。(这里说明一下,所谓主频是指 SI 所在码流的调制频率。)
2 、节目搜索:接收机在节目搜索时首先搜索主频频率,找出 SI 信息,然后生成 EPG ,又由 EPG 生成一个节目列表,这个节目列表包括节目名称、节目说明、节目播出事件等,并将这个节目列表作为下一层菜单,每个下层菜单都指向相应节目所在的 TS 流,达到用户能方便快捷的收看到所需节目的目的。
3 、软件下载:在前面说过,接收机的装载器必须要按照前端定义的数据结构来定制,当前端需要变更播出节目时(如增加或减少节目的播出,调整播出节目的类别等)或更改主频频率时,接收机的装载器也应做相应的变更。所以,当前端要做节目变更时,营运商必须要同时变更接收机的装载器,并向所有接收机发出软件更新信息,用户收到信息后,就可用软件下载功能来更新接收机的装载器了。
综上所述,构成一个 DVB 系统最基本的业务信息应该包括 PSI 和 SI 业务信息。 EPG 由 SI 生成, DVB 接收机靠 EPG 来引导接收和选择收看 DVB 节目。
DVB-SI 理解入门指南(一)(二)(三)
DVB-SI 理解入门指南 ( 一 )
数字电视与传统模拟电视节目选择的方式完全不同, 传统电视的每一个频道对应一个节目,只要调到相应的频率, 就可以看到节目。 而在数字电视信号中,一路码流对应多路节目,使用复用技术就可以做到了。一个物理的频道只能给出包含多路节目的一路传输流。要观看其中的某一路节目,还必须从该传输流中提取出该路节目的压缩包,然后再进行解码。 所以怎样从众多的传输流中,选中一路节目播放,就变得很复杂。在 mpeg-2 的传输流 (Transport Stream) 中,节目专用信息 PSI ( Program Specific Information ),就是规定不同节目和节目中的不同成分如何复用成一个统一的码流。以 PSI 为基础可以提供一个码流的构成,从而帮助用户对节目进行选择。 DVB 中的服务信息 SI(Service Information) 则对此进行了进一步的扩展,加入了一些对用户有用的信息,标示节目的类型,服务商,节目的相互关系等。正确的了解 mpeg-2 的 PSI 以及 DVB 的 SI 的结构,及其在节目组织,选择中的应用,可以正确理解 service information 在 DVB 解码中的地位。对于我们做好对数字节目的复用,也能起到帮助作用。
1 , MPEG-2 TS 中的 PSI
PSI 信息主要包括以下的表:
PAT ( Program Association Table ):节目群丛表,该表的 PID 是固定的 0x0000 ,它的主要作用是指出该传输流 ID ,以及该路传输流中所对应的几路节目流的 MAP 表和网络信息表的 PID 。
PMT ( Program Map Table ):节目映射表,该表的 PID 是由 PAT 提供给出的。通过该表可以得到一路节目中包含的信息,例如,该路节目由哪些流构成和这些流的类型(视频,音频,数据),指定节目中各流对应的 PID ,以及该节目的 PCR 所对应的 PID 。
NIT ( Network Information Table ):网络信息表,该表的 PID 是由 PAT 提供给出的。 NIT 的作用主要是对多路传输流的识别, NIT 提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以及编码方式。调制方式等参数方面的信息。
CAT ( Conditional Access Table ):条件访问表, PID - 0x0001 。
除了上述的几种表外, mpeg-2 还提供了私有字段,用于实现对 MPEG-2 的扩充。
2 , DVB 中的 SI
Mpeg-2 的 PSI 中提供了不少的相关节目组成和相互关系的信息,从而使得在接收端可以正确的对多路传输流进行分解。但是这些信息在实际使用时仍显得不够,为此在 DVB 中采用 SI 对 PSI 信息进行了进一步的扩展。
除了在 PSI 中的信息之外, DVB 还定义了一些其他的一些表。
SI 的主要用途有:
a 、根据 NIT , PAT , PMT 等信息可以进行自动的频道调谐;
b 、更方便的对节目进行选择和定位;
c 、实现电子节目指南 EPG(Electronic Program Guide) ,等等。
PSI 中的信息基本上都是与当前码流相关的,即它们所涉及的内容都与当前码流中的部分信息相关。与 PSI 不同的是, SI 的信息可以包括不在当前码流中的一些服务和事件,允许用户进行更多的选择和了解更多的其他服务信息。
DVB 规定携带 SI 信息的传输包必须用指定的 PID ,指定的 PID 如下表:
TABLE TYPE PID Value
PAT 0X0000
CAT 0X0001
TSDT 0X0002
RESERVED 0X0003 TO 0X000F
NIT , ST 0X0010
SDT , BAT , ST 0X0011
EIT , ST 0X0012
RST , ST 0X0013
TDT , TOT , ST 0X0014
Network Synchroniztion 0X0015
Reserved for future use 0X0016 TO 0X001B
Inband signaling 0X001C
Measurement 0X001D
DIT 0X001E
SIT 0X001F
在该表中可以看到同一个 PID 可以对应不同的表,要把这样的表区分开来,需要进一步找到 TableID 进行识别。 TableID 表如下:
Value Description
0x00 Program_association_section
0x01 Conditional_access_section
0x02 Program_map_section
0x03 Transport_stream_description_section
0x04 TO 0x3F Reserved
0x40 Network_information_section-actual_network
0x41 Network_information_section-other_network
0x42 Service_description_section-actual_transport_stream
0x43 TO 0x45 Reserved for future use
0x46 Service_description_section-other_transport_stream
0x47 TO 0x49 Reserved for future use
0x4A Bouquet_association_section
0x4B TO 0x4D Reserved for future use
0x4E Event_information_section-actual_transport_stream,P/F
0x4F Event_information_section-other_transport_stream,P/F
0x50 TO 0x5F Event_information_section-actual_transport_stream,schedule
0x60 TO 0x6F Event_information_section-other_transport_stream,schedule
0x70 Time_data_section
0x71 Running_status_section
0x72 Stuffing_section
0x73 Time_offset_section
0x74 TO 0x7D Reserved for future use
0x7E Discontinuity_information_section
0x7F Selection_information_section
0x80 TO 0xFE User defined
0xFF Reserved
有了这两个 ID 我们可以在码流中找到我们想要的任何一张表。
SI 主要包括以下一些信息表:
NIT ( Network Information Table ): NIT 的作用主要是对多路传输流的识别, NIT
提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以
及编码方式。调制方式等参数方面的信息。根据此信息设置 IRD ( Integrated Receiver
Decoder )可以进行多路传输流之间的切换。
SDT ( Service Description Table ):用于描述系统中各路节目的名称,该节目的提
供者,是否有相应的时间描述表等方面的信息。该表可以描述当前传输流,也可以描
述其他的传输流,这由 TableID 进行区分。
EIT ( Event Information Table ):该表示对某一路节目的更进一步的描述。它提供
事件的的名称,开始时间,时间长度,运行状态等。
TDT ( Time and Data Table ):该表提供当前的时间信息,该表用来对 IRD 的解码
时钟进行更新
BAT ( Bouquet Association Table ):该表提供一系列类似节目的集合。这些节目
可以不在同一个传输流中,利用该表可以很方便的进行相关节目或某一类节目的浏览
和选择。
RST ( Running Status Table ):该表提供某一具体事件的的运行状态,可用于按时
自动的切换到指定的事件
TOT ( Time Offset Table ):该表提供当地时间与 TDT 之间的关系,该表与 TDT
配合使用。
TSDT ( Transport Stream Description Table ):由 PID0x0002 标识 , 提供传输流的一
些参数 .
ST ( Stuffing Table ):该表表明其内容是无效的,只是作为填充字节。
那么,我们如何运用 DVB 中的 SI 信息表呢?
DVB SI 入门(二) ——DVB SI 的使用 Ben
1 、网络信息表( NIT )
网络信息表提供一组传输流以及相应的调谐信息。 NIT 在 IRD (整合接收解码器)启动程序中用到,并且调谐信息可以存储到不变的存储器中。 NIT 还可以用来标志调谐信息的变化。 NIT 遵从如下规定:
a 、当前的传输系统必须包含 NIT 。
b 、当且仅当 NIT 包含可用的传输系统描述符,当前传输系统才是有效的。这就指定了 NIT 包含有效信息的条件。在一些广播传输系统边界, TS 中的 NIT 也被允许用来描述广播频道中的早期的网络。 IRD 不得不选择一个不同的机制来获得当前传输系统的相应的调谐信息。例如,一个卫星 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 可以被 path : original_network_id/transport_stream_id 唯一标识。一个服务可以被 path : original_network_id/transport_stream_id/service_id 唯一标识。显然, network_id 不在这个 path 之内。另外,每个 original_network_id 中都有不同的 service_id 。当一个服务(同一个 TS 内)被传送到另一个传输系统后,只有 network_id 改变了, original_network_id 不受影响。
下面举个例子,考虑如下情况:有两个服务( A 和 B ),它们源于两个不同的传输系统并且碰巧有相同的 service_id 和 transport_stream_id ,它们被传输到一个新的传输系统。
在这个例子中,这两个服务被安排在新 network 中的不同的 TS 中。如果这两个服务被放在同一个 TS 中,那么必须修改服务的 ID 号,因为在同一个 TS 中一个 service_id 不能够分配给多个服务,并且一个 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 的采集,定义了下列规则:
强制传输当前 TS 的 SDT 。
SDT 列出的 SI 比特流至少包括 TS 中所有服务。
另外:
当前 TS (例如 table_id=0x46 )中 SDT 描述其他 TS 时,应当列出这个 TS 的所有 service 。
强烈推荐 service_id ,在一个 network 中一旦把一个 service_id 分配给了一个特定的服务,那么这个 service_id 将不再变化,以便于 IRD 实现收藏频道列表之类的功能。
DVB SI 入门(三)
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 programme
consisting of one private stream ), PMT 包含一个或多个 CA_descriptor 来验证相关的 CA 码流。为达到这个目的,在 DVB 应用程序中 service_id 的值 0xFFFF 被保留。