终于可以不做网页了,经历了半年的折磨,网站的一期结束了,可以腾出时间准备下论文了。
可以传输视频还不够,我想根据网络状态实现自适应编码传输,但是不知道怎样获得反馈数据。上网查了查,发现有两种方法。
第一种是重载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包发现怎么都收不到,这种错误太低级了。