Linux LibdvbV5 EIT抓住 - 没有足够的日子

时间:2016-06-25 06:01:20

标签: c++ linux dvb epg

我刚开始在Ubuntu 14.04.4系统上编写一些(C ++)代码,通过DVB TV USB调谐器访问DVB流。我使用的是libdvbv5。我在英国使用地面自由视频。

试图抓住无线赛事信息(EIT)。管理这样做 - 生成一个事件列表,其中包含服务ID,开始时间,持续时间,姓名,描述等。一切似乎都很好 - 除了它只能提前3天获取,而我注意到其他应用程序设法得到7提前几天。

看看其他一些项目,比如dvbtee和mythtv,但还没有设法弄清楚什么是错的(很多代码)。我没有按照日期过滤掉,也没有按照我所看到的过滤掉libdvbv5。

EIT程序ID为0x12,完整的调度表id为0x50(至0x5f)。正如我所说,它抓住所有信息没有任何错误,但只提前3天,我知道肯定有更多可用。

让我觉得我做的是正确的事,但看错了地方?欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

自己找到答案:

TID为0x50的表前3-4天,下一个3+为0x51,依此类推。从理论上讲,它可以达到0x5f。因此,要获得所有可用的未来事件,需要循环使用TID 0x50 + [0x00 ... 0x0f]重复该过程,直到达到结束或其中一个不再提供事件。

然而,似乎不能用libdvbv5做到这一点:在descriptors.c中有一个dvb_table_initializers [256]表用于各种类型的表,但它只初始化基础DVB_TABLE_EIT_SCHEDULE(0x50),而不是所有其他人。因此它不会解析其他表。因此,需要重新构建libdvbv5并更改describeors.c,如下所示,以初始化所有相关的TID:

const dvb_table_init_func dvb_table_initializers[256] = {
[0 ... 255]                             = NULL,
[DVB_TABLE_PAT]                         = TABLE_INIT(dvb_table_pat),
[DVB_TABLE_CAT]                         = TABLE_INIT(dvb_table_cat),
[DVB_TABLE_PMT]                         = TABLE_INIT(dvb_table_pmt),
[DVB_TABLE_NIT]                         = TABLE_INIT(dvb_table_nit),
[DVB_TABLE_SDT]                         = TABLE_INIT(dvb_table_sdt),
[DVB_TABLE_EIT]                         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE]                = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x01]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x02]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x03]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x04]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x05]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x06]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x07]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x08]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x09]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0a]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0b]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0c]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0d]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0e]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE + 0x0f]         = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER]          = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x01]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x02]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x03]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x04]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x05]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x06]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x07]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x08]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x09]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0a]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0b]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0c]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0d]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0e]   = TABLE_INIT(dvb_table_eit),
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0f]   = TABLE_INIT(dvb_table_eit),
[ATSC_TABLE_MGT]                        = TABLE_INIT(atsc_table_mgt),
[ATSC_TABLE_EIT]                        = TABLE_INIT(atsc_table_eit),
[ATSC_TABLE_TVCT]                       = TABLE_INIT(atsc_table_vct),
[ATSC_TABLE_CVCT]                       = TABLE_INIT(atsc_table_vct),
};

我也为DVB_TABLE_EIT_SCHEDULE_OTHER做了这件事,我认为这是正确的,尽管没有尝试过。它似乎适用于DVB_TABLE_EIT_SCHEDULE。