关于用udp传输ts流的问题
写了一个封装ts流为rtp包,然后进行组播的程序,发现用vlc通过lan接收包的时候有绿屏现象,就是总有不规律的绿条,但人物的运动速率没有异常.怀疑是发送rtp包的90khz时钟同步问题,请高人来解答!
程序太多,贴出部分重要的:
其中:这个函数是把ringbuffer里的ts包按照7个ts包取出,进行包原来的pcr分析,更新原始ts包传输的速率 ,即相邻两个pcr之间传输了多少188byte
int try_send_rtp_packet(int cnt)
{
rtpheader rtp ;
unsigned int rest = 0 ;
int i = 0 ; int j = 0 ;
struct timeval t;
char* ptr = NULL;
rest = CMPTOGGLE(g_rtp_num,g_send_cnt) ?
MAX_SLOT_NUM + CIRLEN(g_rtp_num)-CIRLEN(g_send_cnt):
g_rtp_num-g_send_cnt ;
rest = rest < cnt ? rest : cnt ;
if(rest == 0)
{return 0;}
else
{
if(reft == 0 )
{
MTIMER_GEAR(TIME_GETTM,0,&t);
rtp.timestamp = ValTime_to_Pcr(&t,&reft);
MFPRINTF(ftptr,"--curt:[0x%08x]-reft:[0x%08x] \n ",curt,reft);
}
for(i = 0 ; i < rest ; i++ )
{
rtp.sequence = socket_cnt++ ;
for(j = 0 ; j < (UDP_PACKAGE_LEN/TS_SIZE) ; j++ )
{
ptr = &g_rtp_slot[g_send_cnt*RTP_PACK]+RTP_HEADER_SIZE+j*TS_SIZE ;
scr = mget_pcr(ptr);
_fsize+= TS_SIZE;
if(scr != 0 )
{
printf(" got pcr:[0x%08x] org:[0x%08x] line:%d \n",scr,org,__LINE__);
if(org > 0)
{
printf(" got pcr:[0x%08x] org:[0x%08x] line:%d \n",scr,org,__LINE__);
slope = _fsize/(scr-org);
}
_fsize = TS_SIZE*(7-j) ; org = scr;
break;
}
}
flen += UDP_PACKAGE_LEN;
MTIMER_GEAR(TIME_GETTM,0,&t);
rtp.timestamp = ValTime_to_Pcr(&t,&curt);
if(slope > 0)
{
MFPRINTF(ftptr," --curt:[0x%08x]-flen:[0x%08x]-slop:[0x%08x]-tgap:[0x%08x]-time:[0x%08x]- - \n",
curt,flen,slope,(flen/slope),curt-reft);
if((curt - reft) < flen/slope )
{
usleep((flen/slope+reft-curt)*1000);
MTIMER_GEAR(TIME_GETTM,0,&t);
rtp.timestamp = ValTime_to_Pcr(&t,&curt);
}
#if RECMODE
fwrite(&g_rtp_slot[g_send_cnt*RTP_PACK]+RTP_HEADER_SIZE,
sizeof(char),UDP_PACKAGE_LEN,fout);
#else
SendToSocktBuff(SocketFd,&g_Socket,&rtp,
&g_rtp_slot[g_send_cnt*RTP_PACK],
RTP_PACK);
#endif
}
g_send_cnt++;
if(CIRLEN(g_send_cnt)== MAX_SLOT_NUM)
{
g_send_cnt = GETTRNCLS(g_send_cnt);
}
}
}
return i;
}