2014-11-20 2 views
0

EPG 그래버를 쓰려고합니다. 나는 리눅스에서 libucsi 라이브러리를 사용한다. 나는 EIT 테이블에서 하나의 TS를 읽고 EPG 데이터를 디코딩 할 수있다. 하지만 그것은 불완전하고 필요한 모든 TS를 읽는 법을 모르겠습니다.DVB-S에서 EPG 받기

Google에서 시도했지만 일부 문서는 읽었지만 성공하지 못했습니다. 누군가 나를 이해하는 데 도움이 될 수 있으며, 완전한 TSG를위한 모든 TS를 읽는 방법을 알려줄 수 있습니까? 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

"불완전"이란 무엇을 의미합니까? EPG에 누락 된 부분은 무엇입니까? 또한 서비스 (이름, 공급자, 스크램블링 상태 등)에 대한 정보를 얻기 위해'SDT '를 걸러 낼 수도 있습니다. – Coconop

+0

@ 코코프 예 5의 경우 이벤트는 거의 없지만 완전한 xmltv 파일을 작성해야합니다 . 내 프로그램을 실행할 때마다 매번 다른 이벤트가 반환됩니다. – Alrick

+0

TS 파일입니까 라이브 소스입니까? 실시간으로 서비스가 추가/제거되므로 다른 결과를 얻는 것이 정상입니다. EIT를 어떻게 필터링하는지 보여줄 수 있습니까? – Coconop

답변

1

내가 나쁜 버퍼 크기를 의심 것이다 : 당신이 코드를 복사 한 것 PAT를 필터링하고 EIT에 맞게 조정하십시오 : 섹션이 귀하의 10 TP pat_data 버퍼에 맞는지 어떻게 확인할 수 있습니까?

반환 코드 read을 확인해야합니다. 전체 크기를 얻으려면 버퍼 크기를 조정하거나 후속 호출을 수행해야 할 수 있습니다.