JRTPLIB 获得RR包

      终于可以不做网页了,经历了半年的折磨,网站的一期结束了,可以腾出时间准备下论文了。

      可以传输视频还不够,我想根据网络状态实现自适应编码传输,但是不知道怎样获得反馈数据。上网查了查,发现有两种方法。

      第一种是重载OnRTCPCompoundPacke(RTCPCompoundPacket *pack, const RTPTime &receivetime, const RTPAddress *senderaddress)函数,还给出了代码如下:

void RtpReceiver::OnRTCPCompoundPacket(RTCPCompoundPacket *pack,
                                    const RTPTime &receivetime,
                                    const RTPAddress *senderaddress)
{
RTCPPacket *rtcppack;
pack->GotoFirstPacket();
  while ((rtcppack = pack->GetNextPacket()) != 0)
  {
printf("get rtcppack /n");

    if (rtcppack->IsKnownFormat())
     {
      switch (rtcppack->GetPacketType())
      {
            case RTCPPacket::SR:
           {
          RTCPSRPacket *p = (RTCPSRPacket *)rtcppack;
          uint32_t senderssrc = p->GetSenderSSRC();

        std::cout << " SR Info:" << std::endl;
        std::cout << " NTP timestamp: " << p->GetNTPTimestamp().GetMSW() << ":" << p->GetNTPTimestamp().GetLSW() << std::endl;
        std::cout << " RTP timestamp: " << p->GetRTPTimestamp() << std::endl;
        std::cout << " Packet count: " << p->GetSenderPacketCount() << std::endl;
        std::cout << " Octet count: " << p->GetSenderOctetCount() << std::endl;
        // std::cout << " Receive time: " << p->GetReceiveTime().GetSeconds() << std::endl;

               }

    break;


    }
      }

  }
}

      但我试了试,总是报段错误。代码实际上与JLIBRTP源代码中的ProcessRawPacket()和ProcessRTCPCompoundPacket()类似,但是需要给 OnRTCPCompoundPacke()传参数---RTCPCompoundPacket 的地址, RTCPCompoundPacket 是从 rawpack包获得的,需要 rawpack指针,但是rawpack指针是执行Create()时创建的,是内部的私有变量,无法获得,即使我把Create()的代码复制出来也不行,所以总是会报段错误。应该是 rawpack指针有问题。

    第二种方法:只获取RR包。利用GetCurrentSourceInfo()函数获取 RTPSourceData指针,进而用RR_HasInfo()获取RR包信息。代码如下:

void RtpSender::RevRTCP_RR()
{
   RTPTime  *RRTime;
   sess.BeginDataAccess();
   if (sess.GotoFirstSource() ) 
   {   
    do
    { 
        RTPPacket* packet;
       RTPSourceData *srcdat;
       //RTPTime *time
      if( (srcdat = sess.GetCurrentSourceInfo()) != 0)
      {
  

         if(srcdat->RR_HasInfo()) //如果有收到rr包
         {  
         *RRTime= srcdat->RR_GetReceiveTime();
         printf( "GetJitter= %u, GetLastSRTimestamp= %u, GetDelaySinceLastSR= %u,ReceiveTime_Second= %u,ReceiveTime_MicroSeconds = %u/n , FractionLost=%f, GetPacketsLost=%d, GetExtendedHighestSequenceNumber=%u /n",
        srcdat->RR_GetJitter(),
            srcdat->RR_GetLastSRTimestamp(),
        srcdat->RR_GetDelaySinceLastSR(), 
        //srcdat->RR_GetReceiveTime(),
                RRTime->GetSeconds(), 
                RRTime->GetMicroSeconds(),                         
        srcdat->RR_GetFractionLost() ,
        srcdat->RR_GetPacketsLost(),
        srcdat->RR_GetExtendedHighestSequenceNumber()
         );
                   
         }
         srcdat-> FlushPackets();
    
      }
           //  sess.DeletePacket(packet);// 删除RTP数据报
              
             //RTPTime::Wait(RTPTime(0,1000));
         

      } while (sess.GotoNextSource());   //接收另一个packet
   }//end if
  sess.EndDataAccess();       
}

    这也是从网上找到的代码,这是发送端,接收端可以用类似代码接收SR包。别搞错了,我开始在接收端接收RR包发现怎么都收不到,这种错误太低级了。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值