TS中的EPG解析
芈亚罗吧
1. 概述
EPG是ElectronicProgram Guide,即电子节目指南,通常用来传输节目预告。EPG信息的文档主要ETSI EN 300 468,该文档记录了SI信息。
MPEG-2中定义了PSI信息,即常见的节目关联表(PAT)、条件接收表(CAT)、节目映射表(PMT)和网络信息表(NIT)。后来DVB标准对MPEG-2的PSI进行了扩充,在PSI四个表的基础上再增加了九个表,形成SI,它是对整个系统所有码流的描述,描述系统传输内容、广播数据流的编排和时间表等的数据。
2. 解析目标
目前这个项目主要的目标是:从多套复用节目的TS流中将这些节目的节目预告(即主要是EPG信息)解析出来,而TS流中不存在的节目的EPG可以不用解析。
3. EPG相关的表
SI信息的9个表中,和节目预告相关的主要是:
l 业务描述表(SDT):描述系统业务数据,例如业务名称、业务提供者等。
l 事件信息表(EIT):节目预告中最重要的表,记录了节目相关的事件,例如事件名称、起始时间、持续时间等。
l 时间和日期表(TDT):当前的日期时间,但是这个是北京本地时间。
l 时间偏移表(TOT):当前日期时间和本地日期时间的偏移关系,比如北京时间的偏移量是+8:00:00。
在考虑随机存取的系统中,即使结构没有发生变化,也建议对EPG有关的SI段重复传输数次。
l 所有当前传输流的SDT的段应至少每2s传输一次;
l 所有其它传输流的SDT的段应至少每10s传输一次;
l 所有当前传输流的EIT当前/后续表的段应至少每2s传输一次;
l 所有其它传输流的EIT当前/后续表的段应至少每10s传输一次;
l 所有未来八日内的EIT 时间表的段应至少每10s 传输一次,包括八日内其它传输流的EIT 时间表的段;
l 所有超过未来八日的EIT 时间表的段应至少每30s传输一次,包括超过未来八日的其它传输流的EIT时间表的段;
l 所有TDT和TOT的段应至少每30s传输一次。
下面将重点讨论SDT、TDT、TOT和EIT表的解析。
4. SDT
SDT表主要需要解析的是各套节目对应的服务名(如BTV-1)和服务提供商名(如北京广电局)。
PID固定为0x0011。但SDT和BAT的PID完全一致,因此要通过table_id来区分。table_id=0x42表示是当前服务的SDT_Active表,table_id=0x46表示是其他频道上服务的SDT_Other表。
在这里就主要解析SDT_Active即可,SDT_Other可以不考虑。
重点关注的服务名和服务提供商名记录在表的service_descriptor里。
5. TDT和TOT
解析TDT、TOT的目的是为了知道当前当地的时间。
TDT、TOT的PID都是0x0014。只有通过table_id来区分,TDT的table_id为0x70,TOT 的table_id为0x73。
TDT中主要需要解析的字段为UTC_time,指的是世界统一时间,但这个时间通常都不是北京时间。北京时间通常是在此基础上加8小时,因为北京时间是东八区时间嘛。UTC_time的解析格式见ETSI EN 300 468的附录。
TOT主要需要解析的字段为UTCTime和LocalTimeOffset。UTCTime含义和值通常与TDT一样,LocalTimeOffset则记录了当地时间与UTCTime之间的差值,对北京而言这个值应该为+8小时。
注意:如果流不太正规只有TDT没有TOT,我的处理方式是按LocalTimeOffset为+8小时设定;如果只有TOT没有TDT,则就按照TOT的UTCTime设定UTCTime。
6. EIT
EIT是所有这些表里面最复杂但也是最关键最核心的。
标准里面将一个节目中的一个时间片断叫做一个Event (事件),它记载了起始时间、持续时间、事件名称和事件的简单描述。例如:一个事件为19:00---19:30播放新闻联播,它的起始时间是19:00;持续时间是30分钟;节目名称是新闻联播,简单描述无。 EIT中记录了大量的事件信息。
6.1 EIT功能表
EIT表按功能分为4类EIT功能表:
含义 |
Table_id |
|
EIT ACTUAL PF |
当前频道上实际的出现/跟随事件信息 |
0x4e |
EIT OTHER PF |
其它频道上的出现/跟随事件信息 |
0x4f |
EIT actual schedule |
表示的是当前频道上的节目时间表 |
0x50-0x5f |
EIT other schedule |
表示的是其它频道上的节目时间表 |
0x60-0x6f |
对这四个类中做个简要说明:
l active对应存在的频道中的事件信息,other对其他频道中的事件信息。
l EIT ACTUAL PF和EIT OTHER PF的结构完全类似,EIT actual schedule 和EIT other schedule的结构完全类似。
l 由于项目的原因,只需要解析存在的频道中的事件信息,所以other中的信息将不考虑。其实active和other的结构是完全一样的。
6.2 子表
Table_id相同的EIT表。
EIT ACTUAL PF和 EIT OTHERPF最多只能有一个子表,EIT actual schedule和EIT other schedule则最多可能有16个子表。
6.3 段
一个子表(一个固定的tablee_id),最多只能有256个section,section_num从0—255。子表语法结构中都有个8bit字段last_section_number,表示该子表最多由多少个段组成。
6.4节
重点说明下EIT子表中引入的节(segment)这个概念。
节是这样定义的:节最多有8个段,一个EIT子表被分成32个节。每个节所包含的事件信息最长不能超过3个小时。
每个节所包含的事件信息最长不能超过3个小时,这才是引入节的原因,好控制事件的时间长度,否则这个时间要乱套。
每8个段组成一个节。Section_num = 0—7为segment 0,Section_num = 8—15,为segment 1,……Section_num = 248—255,为segment 31。
允许某节中只有前面几个段,后面的段没有,segment_last_section_number标识节中有哪些有效的段。
允许子表中只有前面的几个节,后面的节都不存在,last_section_number来标识。
意思就是说,假设上一節只有1个段,如section 0,那麼空下來的那些段號如section 1——section 7將無效,新的节將從對齊的位置(段號為8的倍數)開始,即从section 8开始。
包含的节目最大时间 |
||
EIT功能表(active p/f schedule等) |
最多包含16个子表 |
64天 |
EIT子表 |
最多包含32个节 |
4天 |
Segment |
最多包含8个段 |
3小时 |
Section |
在实际运营中一般会只传一周的节目指南,也就是说只要两个子表就足够了。
EIT ACTUAL PF和EIT OTHER PF 只有两个段,分别表示正在播放和下一个节目。所以相对来说要简单的多。
图1:EIT active P/F的结构图
图2:EIT active schedule的结构图
6.5 解析步骤
输入:一个EIT Section
第1步:定位频道。transport_stream_id,在该频道下找到要检测的节目service_id。
第2步:利用table-id得知此EIT Section位于哪个功能表的哪个子表中。
第3步:利用section_num得知此EIT Section位于哪个节中。
第4步:解析此section信息。重点是解析其中的short_event_descriptor得到事件信息。
第5步:干掉不要的段。
5.1 干掉不存在的子表。last_table_id之後的子表都不存在,即子表的所有段都不存在。
5.2 干掉當前子表的段。LastSectionNumber之後的段都不存在。
5.3 干掉當前节内的段。SegmentLastSectionNumber之後到下一個节之前的段不存在。
第6步:更新整个事件数据库。
附件
某個素材的某個頻道的電子節目指南(部份)
电子节目指南
时间 2014/1/2817:40:21
业务标识符:0x00cb
业务名称:CETV-SD
业务提供者名称:成都广电局
业务服务类型:数字电视业务
业务加扰状态:业务未被加扰
传送流标识符:0x0002
原始网络标识符:0x0001
当地时间:2014-01-28 17:40:13
GMT标准时间:2014-01-2809:40:13
事件序号 事件标识符 事件名称 起始时间 持续时间
00 0x1236 奇趣大自然 2006-06-14 01:16:00 00:30:00
01 0x1237 奇趣宝典(270) 2006-06-14 01:46:00 00:42:00
02 0x1238 留洋故事 2006-06-14 02:28:00 01:02:00
03 0x1239 教育资讯 2006-06-14 03:30:00 00:38:00
04 0x123a 午间剧场:都是天使惹的祸(4、5)2006-06-14 04:08:00 02:12:00
05 0x123b 名家论坛 2006-06-14 06:20:00 02:05:00
06 0x123c 机器人大擂台(1) 2006-06-1408:25:00 00:26:00
07 0x123d 看电影学英语 2006-06-14 08:51:00 00:42:00
08 0x123e 七彩虹 2006-06-1409:33:00 01:00:00
09 0x123f 星奇吧(308) 2006-06-14 10:33:00 00:36:00