0

我正在尝试编写 EPG 抓取器。我libucsi在linux下使用库。我可以从表中读取一个 TSEIT并解码 EPG 数据。但它不完整,我不知道如何阅读所有必要的 TS。

我试图用谷歌搜索它,我阅读了一些文档但没有成功。有人可以帮助我理解并告诉我如何阅读所有 TS 以获得完整的 EPG 吗?EIT 是否有一些连续性 ID 或类似的东西?

谢谢您的帮助。

[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);
4

1 回答 1

1

我怀疑缓冲区大小不正确:您似乎复制了一个代码来过滤 PAT 并针对 EIT 进行了调整:您如何确定您的部分适合您的 10 个 TPpat_data缓冲区?

您应该检查read: 您可能需要调整缓冲区大小或执行后续调用以获取整个内容的返回代码。

于 2014-11-28T09:40:58.697 回答