JRTPLIB 获得RR包

来源:互联网 发布:caj阅读软件打开 编辑:程序博客网 时间:2024/04/29 02:56

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

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

      第一种是重载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包发现怎么都收不到,这种错误太低级了。

  

原创粉丝点击