我试图写EPG抓取器。我在linux下使用libucsi
库。我可以从EIT
表读取一个TS并解码EPG数据。但它不完整,我不知道如何阅读所有必要的TS。
我试图谷歌它,我读了一些文档,但没有成功。有人可以帮助我理解,并告诉我如何阅读所有TS以获得完整的EPG? EIT有一些连续性ID或类似的东西吗?
感谢您的帮助。
[编辑] 读取数据的功能:
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);
答案 0 :(得分:1)
我怀疑缓冲区大小不好:似乎你复制了一个代码来过滤PAT并将其改编为EIT:你怎么能确定你的部分适合你的10个TP pat_data
缓冲区? / p>
您应该检查read
的返回代码:您可能需要调整缓冲区大小或执行后续调用以获取整个内容。