关于用udp传输ts流的问题

otman1980 2011-05-04 05:15:34
写了一个封装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;
}
...全文
694 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
louyong0571 2011-05-05
  • 打赏
  • 举报
回复
只弄过tcp传输ts流,udp不明白,帮顶
otman1980 2011-05-04
  • 打赏
  • 举报
回复
其他:
获取原ts流的斜率需要两个pcr,于是就把取得它们前的ts包都没发送,大约相当于扔掉了2-3视频frame,但愿这没影响视频解码
ts流类型:高清h.264和heaac的音频.码率15Mbit/sec

下面是时间:curt是当前时间,reft是刚开始发送socket包的初始时间,flen是累计发送包的长度,slope是从ts流里得出的斜率,tgap是用累计包长除斜率得出的推算时间,time是curt-reft得出的经历时间
(time应该是一直小于slop的,进而延迟,但可能由于对buffer进行互斥造作的关系造成发送的慢了)


--curt:[0x00000000]-reft:[0x00138af3]
--curt:[0x00138af9]-flen:[0x00135148]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000006]- -
--curt:[0x00138afa]-flen:[0x0013566c]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afa]-flen:[0x00135b90]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afa]-flen:[0x001360b4]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afa]-flen:[0x001365d8]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afa]-flen:[0x00136afc]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afa]-flen:[0x00137020]-slop:[0x00003b45]-tgap:[0x00000053]-time:[0x00000007]- -
--curt:[0x00138afb]-flen:[0x00137544]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afb]-flen:[0x00137a68]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afb]-flen:[0x00137f8c]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afb]-flen:[0x001384b0]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afb]-flen:[0x001389d4]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afb]-flen:[0x00138ef8]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000008]- -
--curt:[0x00138afc]-flen:[0x0013941c]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x00139940]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x00139e64]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x0013a388]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x0013a8ac]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x0013add0]-slop:[0x00003b45]-tgap:[0x00000054]-time:[0x00000009]- -
--curt:[0x00138afc]-flen:[0x0013b2f4]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x00000009]- -
--curt:[0x00138afd]-flen:[0x0013b818]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000000a]- -
--curt:[0x00138afd]-flen:[0x0013bd3c]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000000a]- -
--curt:[0x00138afd]-flen:[0x0013c260]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000000a]- -
--curt:[0x00138b11]-flen:[0x0013c784]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001e]- -
--curt:[0x00138b11]-flen:[0x0013cca8]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001e]- -
--curt:[0x00138b11]-flen:[0x0013d1cc]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001e]- -
--curt:[0x00138b12]-flen:[0x0013d6f0]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001f]- -
--curt:[0x00138b12]-flen:[0x0013dc14]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001f]- -
--curt:[0x00138b12]-flen:[0x0013e138]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001f]- -
--curt:[0x00138b12]-flen:[0x0013e65c]-slop:[0x00003b45]-tgap:[0x00000055]-time:[0x0000001f]- -
--curt:[0x00138b12]-flen:[0x0013eb80]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x0000001f]- -
--curt:[0x00138b12]-flen:[0x0013f0a4]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x0000001f]- -
--curt:[0x00138b13]-flen:[0x0013f5c8]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b13]-flen:[0x0013faec]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b13]-flen:[0x00140010]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b13]-flen:[0x00140534]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b13]-flen:[0x00140a58]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b13]-flen:[0x00140f7c]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000020]- -
--curt:[0x00138b14]-flen:[0x001414a0]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000021]- -
--curt:[0x00138b14]-flen:[0x001419c4]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000021]- -
--curt:[0x00138b14]-flen:[0x00141ee8]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000021]- -
--curt:[0x00138b14]-flen:[0x0014240c]-slop:[0x00003b45]-tgap:[0x00000056]-time:[0x00000021]- -
--curt:[0x00138b15]-flen:[0x00142930]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b15]-flen:[0x00142e54]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b15]-flen:[0x00143378]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b15]-flen:[0x0014389c]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b15]-flen:[0x00143dc0]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b15]-flen:[0x001442e4]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000022]- -
--curt:[0x00138b16]-flen:[0x00144808]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x00144d2c]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x00145250]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x00145774]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x00145c98]-slop:[0x00003b45]-tgap:[0x00000057]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x001461bc]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000023]- -
--curt:[0x00138b16]-flen:[0x001466e0]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000023]- -
--curt:[0x00138b17]-flen:[0x00146c04]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b17]-flen:[0x00147128]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b17]-flen:[0x0014764c]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b17]-flen:[0x00147b70]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b17]-flen:[0x00148094]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b17]-flen:[0x001485b8]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000024]- -
--curt:[0x00138b18]-flen:[0x00148adc]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000025]- -
--curt:[0x00138b18]-flen:[0x00149000]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000025]- -
--curt:[0x00138b18]-flen:[0x00149524]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000025]- -
--curt:[0x00138b18]-flen:[0x00149a48]-slop:[0x00003b45]-tgap:[0x00000058]-time:[0x00000025]- -
--curt:[0x00138b18]-flen:[0x00149f6c]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000025]- -
--curt:[0x00138b18]-flen:[0x0014a490]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000025]- -
--curt:[0x00138b19]-flen:[0x0014a9b4]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b19]-flen:[0x0014aed8]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b19]-flen:[0x0014b3fc]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b19]-flen:[0x0014b920]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b19]-flen:[0x0014be44]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b19]-flen:[0x0014c368]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000026]- -
--curt:[0x00138b1a]-flen:[0x0014c88c]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014cdb0]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014d2d4]-slop:[0x00003b45]-tgap:[0x00000059]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014d7f8]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014dd1c]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014e240]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000027]- -
--curt:[0x00138b1a]-flen:[0x0014e764]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000027]- -
--curt:[0x00138b1b]-flen:[0x0014ec88]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000028]- -
--curt:[0x00138b1b]-flen:[0x0014f1ac]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000028]- -
--curt:[0x00138b1b]-flen:[0x0014f6d0]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x00000028]- -
--curt:[0x00138b2f]-flen:[0x0014fbf4]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x0000003c]- -
--curt:[0x00138b2f]-flen:[0x00150118]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x0000003c]- -
--curt:[0x00138b31]-flen:[0x0015063c]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x0000003e]- -
--curt:[0x00138b31]-flen:[0x00150b60]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x0000003e]- -
--curt:[0x00138b31]-flen:[0x00151084]-slop:[0x00003b45]-tgap:[0x0000005a]-time:[0x0000003e]- -
--curt:[0x00138b32]-flen:[0x001515a8]-slop:[0x00003b45]-tgap:[0x0000005b]-time
otman1980 2011-05-04
  • 打赏
  • 举报
回复
这里pcr和发送rtp包的时候取样时间都是精确到毫秒,由下面这个函数来完成,它负责提取当前时间然后返回放大到90khz的时间,还有当前时间折算成毫秒时间.我觉得几个不确定的地方:

是不是要用微秒来精确时间?因为发现发送几个相邻的7*188=1316的包的时候,它的取样没有毫秒上的变化,这样是否给收端造成时间校对的错误?
调用sendto发包的时候的数据长度是12byte包头长加1316,是否输入buffer一定要按照协议输入1500的长度?.
而且这里看协议里rtp包头没有设置rtp包里负载的长度,我假设应该是收端判断包类型为ts所以默认解出7个ts包.是这样么?

最有疑问的地方:如果用已发送ts包的总长度,除以从ts里提取的pcr斜率(bytes/ms),得出的理论发送时间,大于发送时采样的发送时间(即发送给socket数率比包本身的数率快),是否会造成收端解码的问题及绿色条带.
假如是这个问题的话就把两者的差作为usleep的参数进行延迟发送,这样是否正确?

提取时间的函数,调用它之前先调用gettimeofday来获得系统时间
为了防止秒时间过长,把秒做3000的模运算,我估计一个demo也到不了50分钟.

static unsigned int ValTime_to_Pcr(struct timeval *t,int *msec)
{
static int tPtr = 0 ;
//tPtr = (t->tv_sec000)*1000+t->tv_usec*1000;
tPtr = ((t->tv_sec%3000)*90000)+(t->tv_usec*9)/100;
//output the ms value.
*msec = (t->tv_sec%3000)*1000+(t->tv_usec/1000);

return tPtr;
}

rtp封装的部分:

static void rtp_header_set_default(rtpheader *rtph)
{

memset(rtpBuf,0,RTP_HEADER_SIZE);

ftptr = fopen("pcr_time_info.dat","wb");

rtpBuf[0] = 0x00;
rtpBuf[0] |= ((rtph->head.version<<6)&0xc0);
rtpBuf[0] |= ((rtph->head.padding<<5)&0x20);
rtpBuf[0] |= ((rtph->head.extension<<4)&0x10);
rtpBuf[0] |= ((rtph->head.csrc<<0)&0x0f);


rtpBuf[1] = 0x00;
rtpBuf[1] |= ((rtph->head.marker<<7)&0x80);
rtpBuf[1] |= ((rtph->head.payloadtype<<0)&0x7f);

/*2-7 bytes: time and sequence id.*/
/* SSRC: not implemented */
rtpBuf[8] = 0x00;
rtpBuf[9] = 0x00;
rtpBuf[10] = 0x00;
rtpBuf[11] = 0x00;


}


int rtp_initial_device(void)
{

rtpheader h;

h.head.version = 2 ;
h.head.padding = 0;
h.head.extension = 0;
h.head.csrc = 0;
h.head.marker = 0;
h.head.payloadtype = 0x21 ;


fout = fopen("vms_dump.dat","wb");
socket_cnt = rand()&65535 ;
/*clearn memory.*/
bzero((char*)&g_rtp_slot,RTP_PACK*MAX_SLOT_NUM);

rtp_header_set_default(&h);
//return fd number.initial socket device.
if(MSOCKET_SUCC == MSocketInit(&g_Socket ,&SocketFd))
{
printf(" initial socket succ func:%d line:%d \n",__FUNCTION__,__LINE__);
return SocketFd ;
}

return -1;
}


发送socket的函数
/*add udp header and send to socket. */
int SendToSocktBuff(int fd,struct sockaddr_in *sSockAddr,rtpheader *rtph,char *slot,int len)
{

//tmp = htonl(rtph->sequence);
slot[2] = (0xFF00&(rtph->sequence))>>8;
slot[3] = 0xFF&(rtph->sequence);


//tmp = htonl(rtph->timestamp);

//memcpy(&slot[4],(char*)&rtph->timestamp,sizeof(int));
slot[4] = (0xFF000000&(rtph->timestamp))>>24;
slot[5] = (0xFF0000&(rtph->timestamp))>>16;
slot[6] = (0xFF00&(rtph->timestamp))>>8;
slot[7] = 0xFF&(rtph->timestamp);


/*
send to socket with 7 ts
*/

if(MSOCKET_SUCC ==
MSocketwriteto(fd,&slot[0],len,&g_Socket,sizeof(g_Socket),RTP_PACK))
{
return len ;
}


return 0; //failed.
}

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧