Я пытаюсь написать EPG grabber. Я использую библиотеку libucsi
под linux. Я могу прочитать один TS из таблицы EIT
и декодировать данные EPG. Но он неполный, и я не знаю, как читать все необходимые ТС.Получение EPG от DVB-S
Я попытался это сделать, и я прочитал некоторую документацию, но безуспешно. Может ли кто-нибудь помочь мне понять и рассказать мне, как читать все TS для полного EPG? Имеет ли EIT некоторый идентификатор непрерывности или что-то в этом роде?
Благодарим за помощь.
[EDIT] функция для чтения данных:
void readD(char * dedev, __u8 * data, int size_data ,int pid)
{
int defd;
if ((defd = open(dedev, O_RDWR | O_LARGEFILE)) < 0)
{
perror("opening demux failed");
return 0;
}
#define TS_BUF_SIZE (256 * 1024)
long dmx_buffer_size = TS_BUF_SIZE;
if(ioctl(defd,DMX_SET_BUFFER_SIZE,dmx_buffer_size) < 0)
{
perror("set demux filter failed");
return 0;
}
struct dmx_sct_filter_params sctFilterParams;
memset(&sctFilterParams, 0, sizeof(struct dmx_sct_filter_params));
sctFilterParams.pid=pid;
sctFilterParams.timeout=10000; //10s
sctFilterParams.flags=DMX_IMMEDIATE_START|DMX_CHECK_CRC;
if(ioctl(defd,DMX_SET_FILTER,&sctFilterParams) < 0)
{
perror("set demux filter failed");
return 0;
}
read(defd,data,size_data);
close(defd);
}
и я называю это:
#define TS_PACKET_SIZE 188
__u8 pat_data[TS_PACKET_SIZE*10];
readD(dedev, pat_data, sizeof(pat_data) ,PID_EIT);
Что вы подразумеваете под «неполным»? Что не хватает вашему EPG? Вы также можете фильтровать 'SDT', чтобы получить некоторую информацию об услуге (имя, поставщик, статус скремблирования и т. Д.). – Coconop
@Coconop. Я получаю всего несколько событий, например 5, но мне нужно построить полный файл xmltv , И когда я запускаю свою программу, он каждый раз возвращает разные события. – Alrick
Является ли это TS-файлом или это источник вживую? В режиме реального времени сервисы добавляются/удаляются на лету, так что это нормально, чтобы получить разные результаты. Не могли бы вы показать, как вы фильтруете СПЭ? – Coconop