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;

  }