我刚刚开始在Ubuntu 1404.4系统上编写一些(C++)代码,通过DVB TV USB调谐器访问DVB流。我在用libdvbv5。我在英国用的是陆地自由视野。
试图获取空中事件信息(EIT)。成功地做到了这一点-生成一个包含服务id、开始时间、持续时间、名称、描述等的事件列表。所有这些看起来都很好-只是它最多只能提前3天获取,而我注意到其他应用程序可以提前7天获取。
看了一些其他的项目,比如dvbtee和mythtv,但是还没有找到错误的地方(很多代码)。我做的任何事情都不会按日期过滤掉,也不会从我所看到的内容中过滤掉,libdvbv5。
EIT程序id为0x12,完整的调度表id为0x50(到0x5f)。正如我所说,它可以毫无错误地获取所有信息,但只能提前3天,我知道肯定还有更多可用的信息。
让我觉得我做的是对的,但是找错了地方?欢迎提出任何建议。

最佳答案

我自己找到了答案:
具有TID 0x50的表具有前3-4天,0x51具有后3+天,依此类推。理论上,它可以达到0x5f,所以要获得所有可用的未来事件,需要使用TID 0x50+[0x00]循环重复该进程。。。0x0f]直到到达结尾或其中一个不再提供事件。
然而,似乎不能用libdvbv5这样做:在descriptors.c中,有一个表的dvb_table_initializers[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。

关于c++ - Linux LibdvbV5 EIT争夺-没有足够的日子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38025496/

10-13 08:10