1. 程式人生 > >live555的一點bug修改(客戶端和伺服器)

live555的一點bug修改(客戶端和伺服器)

客戶端主要出錯資訊:
MultiFramedRTPSource error: Hit limit when reading incoming packet over TCP. Increase \"MAX_PACKET_SIZE\"
RTCPInstance error: Hit limit [1450,1450] when reading incoming packet over TCP. Increase "maxRTCPPacketSize"

live555原始碼修改記錄
伺服器端:
針對1080P高清H264位元速率過大,需要修改live/mediaServer/DynamicRTSPServer.cpp檔案中第117行
OutPacketBuffer::maxSize = 1024*1024; // allow for some possibly large H.264 frames
maxSize的值,具體大小可根據實際播放畫面質量和伺服器列印的出錯資訊修改


針對伺服器傳送的RTP包出錯,傳送時超出系統TCP buffer大小,需修改:live/liveMedia/RTPInterface.cpp  sendDataOverTCP()函式
修改為
makeSocketBlocking(socketNum);
int sendSuccess = loopsend(socketNum,data,dataSize);
makeSocketNonBlocking(socketNum);
if(sendSuccess == dataSize) 
{
return True;
}

else 
{
printf("send false...........\n");
return False;
}
需新增loopsend()函式
int loopsend(int sock, u_int8_t const* buf, unsigned int sndsize)
{
int remian = sndsize;
int sendlen = 0;
int ret = 0;
while(remian > 0)
{
ret=send(sock,buf+sendlen,remian,0);
if(ret <= 0)
{
printf("ret = %d\n",ret);
return ret;
}
sendlen += ret;
remian -= ret;
}
return sndsize;
}

客戶端程式碼健壯性加強
修改live/liveMedia/RTPInterface.cpp 中tcpReadHandler1()函式
在case AWAITING_SIZE2:中
unsigned short size = (fSizeByte1<<8)|c;後新增RTP和RTCP包的大小判斷
新增程式碼如下:
 if(fStreamChannelId == 0x00)
     if(size > 20000) //lcy add    20000為"MAX_PACKET_SIZE"值的大小(RTP包的最大值)
 {
fTCPReadingState = AWAITING_DOLLAR;
 break;
 }
 if(fStreamChannelId == 0x01)      
     if(size > 1450) //lcy add     1450為"maxRTCPPacketSize"值的大小(RTCP包的大小)
{
   fTCPReadingState = AWAITING_DOLLAR;
break;
}