Я только начинаю писать (C ++) код в системе Ubuntu 14.04.4 для доступа к потокам DVB через USB-тюнер DVB TV. Я использую libdvbv5. Я нахожусь в Великобритании, используя наземное freeview.
Попытка получить информацию о событиях вне эфира (EIT). Удалось это сделать — создает список событий с идентификатором службы, временем запуска, продолжительностью, именем, описанием и т. Д. Все выглядит нормально — за исключением того, что он забирает до 3 дней, тогда как я замечаю, что другим приложениям удается получить 7 дней вперед.
Посмотрел некоторые другие проекты для этого, такие как dvbtee и mythtv, но пока не сумел разобраться, что не так (много кода). Ничего из того, что я делаю, не отфильтровывает по дате и не из того, что я вижу, libdvbv5.
Идентификатор программы EIT — 0x12, а полный идентификатор таблицы расписания — 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, хотя.
Других решений пока нет …