0

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

试图获取停播事件信息 (EIT)。设法这样做 - 生成带有服务 ID、开始时间、持续时间、名称、描述等的事件列表。一切似乎都很好 - 除了它只提前 3 天抓取,而我注意到其他应用程序设法获得 7提前几天。

为此查看了其他一些项目,例如 dvbtee 和 mytv,但尚未设法找出问题所在(大量代码)。我所做的任何事情都不会按日期过滤掉,也不会从我所看到的 libdvbv5 中过滤掉。

EIT 程序 id 是 0x12,完整的调度表 id 是 0x50(到 0x5f)。正如我所说,它可以毫无错误地获取所有信息,但只提前 3 天,而且我知道肯定还有更多可用信息。

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

4

1 回答 1

1

自己找到了答案:

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

但是,似乎无法使用 libdvbv5 执行此操作:在 descriptors.c 中有一个用于各种类型表的 dvb_table_initializers[256] 表,但它仅初始化基本 DVB_TABLE_EIT_SCHEDULE (0x50),而不是所有其他表. 因此它不会解析其他表。因此,需要通过更改 descriptors.c 来重建 libdvbv5,如下所示以初始化所有相关的 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。

于 2016-06-25T16:46:55.200 回答