谈一谈 live555 server 发送缓冲区 作用和流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/engineer_james/article/details/81901288

前言

live555 有个重要的参数 发送缓冲区

////////// OutPacketBuffer //////////
unsigned OutPacketBuffer::maxSize = 60000; // by default

默认是60000 字节,但是还要看实际设置
在 MultiFramedRTPSink 初始化的时候通过setPacketSizes 重新设置发送缓冲区

setPacketSizes((RTP_PAYLOAD_PREFERRED_SIZE), (RTP_PAYLOAD_MAX_SIZE));

#define RTP_PAYLOAD_MAX_SIZE 1456
      // Default max packet size (1500, minus allowance for IP, UDP, UMTP headers)
      // (Also, make it a multiple of 4 bytes, just in case that matters.)
#define RTP_PAYLOAD_PREFERRED_SIZE ((RTP_PAYLOAD_MAX_SIZE) < 1000 ? (RTP_PAYLOAD_MAX_SIZE) : 1000)

RTP_PAYLOAD_MAX_SIZE 是通过计算得来的,默认可以达到1500 个字节,但是还要减去 IP UDP UMTP的头,还有多路复用的情况,需要4个字节,最后就是1456 之前用了44个字节

RTP_PAYLOAD_PREFERRED_SIZE 是根据RTP_PAYLOAD_MAX_SIZE 大小决定的,小于1000用RTP_PAYLOAD_MAX_SIZE ,反之就是1456个字节

void MultiFramedRTPSink::setPacketSizes(unsigned preferredPacketSize,
                    unsigned maxPacketSize) {
  fOutBuf = new OutPacketBuffer(preferredPacketSize, maxPacketSize); //创建一个带缓冲区的buffer
  fOurMaxPacketSize = maxPacketSize; // save value, in case subclasses need it
}
OutPacketBuffer::OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize, unsigned maxBufferSize): fPreferred(preferredPacketSize), fMax(maxPacketSize),fOverflowDataSize(0) {
  if (maxBufferSize == 0) maxBufferSize = maxSize;  
  unsigned maxNumPackets = (maxBufferSize + (maxPacketSize-1))/maxPacketSize;
  fLimit = maxNumPackets*maxPacketSize;
  fBuf = new unsigned char[fLimit];
  resetPacketStart();
  resetOffset();
  resetOverflowData();
}
  • 计算 可以缓冲最大RTP包的数目
    在初始化 发送缓冲区的时候,maxBufferSize = 0,所以使用默认的OutPacketBuffer::maxSize = 60000 ,所以计算得最大的包数 (maxBufferSize + (maxPacketSize-1))/maxPacketSize = (60000+(1456-1))/1456 = 42个包,所以一下子可以缓冲 42个RTP包

  • 计算buffer 的最终大小
    可以计算出 fLimit = maxNumPackets*maxPacketSize; = 42*1456 = 61152 个字节

发送缓冲区size的调整可以调整服务器性能

后面可能还想了解多路复用是怎么操作的

猜你喜欢

转载自blog.csdn.net/engineer_james/article/details/81901288