请教rtcp的一些问题

g_jlin123 2011-04-21 10:34:02
本人做了个简单的流媒体播放器,用的是rtsp协议。以live555为服务器,但是在播放中有些丢包的现象,现如今用rtcp来控制流速率,但是对于rtcp 的有些概念还是有些疑惑 。

1:Fractioin lost (8bit)表示包的丢失率是多少,即丢失的包的数量除以期望的包的数量,
这里丢包的数量是从会话开始计算的么?还是从某个时间内计算?

2:Interarrival jitter 时间抖动
J=J+(|D(i-1,i)|-J)/16 其中 D(i,j)=(Rj-Sj)-(Ri-Si); (Si是包i的RTP时间标志,Ri是包i以RTP时间标志单位的到达时刻值) 这样计算的么 那么 这样写有没有问题?
jitter=(15*jitter+abs(( curtime.sec*90000 - m_RTP_Header.ts)-(m_arrts*90000-m_ts)))/16;) 其中(curtime.sec当前包到本地达时间秒,m_arrts前一个包到达本地时间,m_RTP_Header.ts 表示当前的包从服务器发出的时间,m_ts表示前一个包从服务器发出的时间,时间戳单位都是1/90000)

3:上一SR报文 (LSR):32比特 接收到的来自源SSRC_n的最新RTCP发射机报告(SR)的64位NTP时间标志的中间32位.若还没有接收到SR,该域值为零。
自上一SR的时间(DLSR):32比特 是从收到来自SSRC_n的SR包到发送此接收报告块之间的延时,以1/65536秒为单位.若还未收到来自SSRC_n的SR包,该域值为零.
这里的SR包 是指从live555服务器发送到本地客户端的包,那么这个包是连续的么? 我是不是应该在收到SR包之后 立马发送RR包 ,还是先发送RR包 ,在等待接受SR包 。网上找资料说RR包 是一般每隔5秒钟发送一次 ,不知是不是这样 。




...全文
320 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
g_jlin123 2011-04-25
  • 打赏
  • 举报
回复
请大侠们帮看看啊 !!!!!现在实现的画面老是一钝一钝的 ,播放不流畅 ,分析的在局域网内rtp包 有丢包,大概30个丢一个包 ,按照丢包的策略 ,如果P帧有丢失的话 那么就要把后面所有的P帧全丢掉 直到下一个I帧 。有时候 竟然I帧也有丢的情况 ,导致画面很不理想 。
g_jlin123 2011-04-21
  • 打赏
  • 举报
回复
接受处理rtcp的线程
UINT WINAPI DRtcpData(PVOID wParam)
{
CDVRPlayerDlg* pData = (CDVRPlayerDlg*)wParam;
BOOL bfirst=TRUE;
while(1)
{
if(bEnd)
break
Sleep(5000);
m_prtcpPack->RecvRtcpInfo();

uint32_t m_gitter=m_prtp->m_RTPpack->GetGitter();
int m_npack=m_prtp->m_RTPpack->GetRtpNumPacket();
uint32_t m_nseq=m_prtp->m_RTPpack->GetNumSeq();
uint32_t m_SSRC=m_prtp->m_RTPpack->GetSSRC();
int m_expack=m_prtp->m_RTPpack->GetExNumpack();

m_prtcpPack->CreateRtcpPack (m_SSRC,m_expack,m_npack,m_nseq,m_gitter,bfirst,"11111");
bfirst=FALSE;
}
return 0;
}
g_jlin123 2011-04-21
  • 打赏
  • 举报
回复
int CRtcpPack::RecvRtcpInfo()
{
BYTE recbuf[2048]={0};

ZeroMemory(&m_Serveraddr,sizeof(struct sockaddr_in));
int nlen=sizeof(m_Serveraddr);

m_tc = RTPTime::CurrentTime();
int lret = recvfrom(m_Socket, (char *)recbuf, 2048,0, (struct sockaddr*)&m_Serveraddr, &nlen);

return lret;
}
g_jlin123 2011-04-21
  • 打赏
  • 举报
回复
这里附上部分rtcp代码

void CRtcpPack::FillRReportInfo(uint32_t ssrc,uint32_t expectpack,uint32_t getpack,uint32_t exthighestseq,uint32_t jitter,BOOL bfirst)
{
//prtcpreceiverReport 为RR包结构体
if(prtcpreceiverReport != NULL)
{
delete prtcpreceiverReport;
prtcpreceiverReport=NULL;
}
prtcpreceiverReport =(RTCPReceiverReport*)malloc(sizeof(struct RTCPReceiverReport));

prtcpreceiverReport->ssrc = ssrc;

double lost = (double)(expectpack-getpack);
double frac = lost/((double)expectpack);

if(expectpack < getpack)
prtcpreceiverReport->fractionlost = 0;
prtcpreceiverReport->fractionlost = (uint8_t)(frac*256.0);

prtcpreceiverReport->exthighseqnr = exthighestseq;

prtcpreceiverReport->jitter = jitter;

if(bfirst)
{
prtcpreceiverReport->lsr = 0;
prtcpreceiverReport->dlsr = 0;
}
else
{
RTPNTPTime srtime = m_tc.GetNTPTime(); //得到NTP时间 ,m_tc为 接受到SR包的时间
uint32_t m = (srtime.GetMSW()&0xFFFF);
uint32_t l = ((srtime.GetLSW()>>16)&0xFFFF);
prtcpreceiverReport->lsr = ((m<<16)|l);

RTPTime curtime = RTPTime::CurrentTime(); //当前时间
curtime -= m_tc.GetNTPTime();
double diff2 = curtime.GetDouble();
diff2 *= 65536.0;
prtcpreceiverReport->dlsr = (uint32_t)diff2;
}
}
yuanzhenhai 2011-04-21
  • 打赏
  • 举报
回复
分子怎么是2呢?我读协议的理解是,
两个RTCP包之间的时间里,实际收到RTP包的数/应该收到的RTP包的数 。
得到的是一个小数,小数*256 , 然后得到一个数,就可能用8位表示啦。
g_jlin123 2011-04-21
  • 打赏
  • 举报
回复
to yuanzhenhai
不好意思 第1点理解错了 ,但是这样的话 那么分子永远是2了? 那么丢包率这个变动可能会很大 ,因为2个包之间可能是连续的 也可能间隔很大 ,但是从会话开始计算的话 那么这个丢包率 可能会比较稳定
g_jlin123 2011-04-21
  • 打赏
  • 举报
回复
to yuanzhenhai
谢谢你的回复

对于第1点 如果是2个包之间的时间 那么丢失率 那么要么就是 0 ,50%,100%了?
对于第二点 我刚试了下 这样好像jitter 都是0了 因jitter 是一个无符号的32位整数。这里应该是时间戳单位吧 。
yuanzhenhai 2011-04-21
  • 打赏
  • 举报
回复
1
The loss fraction is defined as the number of packets lost in this reporting interval, divided by the number expected.
由此可见,应该是两个包之间的时间。
2、感觉有点问题。
问题在于 m_RTP_Header.ts , m_ts ! 如果 m_RTP_Header.ts等于打包这个RTP包这一刻的时间*90000 ,我想应该等式如下:
jitter = ( 15*jitter + abs( (curtime - m_RTP_Header.ts/90000) - (m_arrts - m_ts/90000) ) )/16
3、
它有个原则:发送这个RTCP包的带宽应该等于这个绘话带宽的5%。
如果 收到SR包之后 立马发送RR包 , 或每5秒发送一次,就不能遵守这个原则了。不遵守这个原则应该也可以,只是效率问题。
如果要做到%5 ,那就很多东西咯。

我以前看过一阵子RTCP,太烦了,后来就不看了。欢迎加我的Q讨论一下,309肆肆1473。

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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