前言
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的调整可以调整服务器性能
后面可能还想了解多路复用是怎么操作的