Linux LibdvbV5 EIT抓取-没有得到足够的时间

Linux LibdvbV5 EIT grabbing - not getting enough days

本文关键字:时间 EIT LibdvbV5 抓取 Linux      更新时间:2023-10-16

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

尝试获取离线事件信息(EIT)。成功地做到了这一点——生成一个包含服务id、开始时间、持续时间、名称、描述等的事件列表。一切似乎都很好,除了它只能提前3天,而我注意到其他应用程序设法提前7天。

看了看其他一些项目,比如dvbtee和mythtv,但还没有设法找出问题所在(大量代码)。我所做的一切都不能按日期过滤掉,libdvbv5也不能从我看到的东西中过滤掉。

EIT程序id为0x12,满调度表id为0x50(到0x5f)。就像我说的,它抓取了所有的信息,没有任何错误,但只有提前3天,我知道肯定有更多的可用。

让我认为我在做正确的事情,但在错误的地方看?

我自己找到了答案:

TID为0x50的表前3-4天,后3天为0x51,以此类推。理论上它可以达到0x5f。因此,为了获得所有可用的未来事件,需要循环使用TID 0x50+[0x00…0x0f]直到到达终点或其中一个不再提供事件。

在descriptors.c中有一个dvb_table_initializer[256]表,用于各种类型的表,但它只初始化基本DVB_TABLE_EIT_SCHEDULE (0x50),而不是所有其他表。因此,它不会解析其他表。因此,需要重新构建libdvbv5,并对descriptors.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。