我正在尝试将通用Speex Jitter Buffer
与Opus编解码器一起使用。我正在使用40ms Opus数据包,并且期望缓冲区中平均有4-5个可用数据包。但是,我看到在长时间通话期间该缓冲区不断增加,最高达到100,这意味着该缓冲区开始存储大约4秒的数据!
我关注了Speex jitterbuffers on mobile devices。我将控件JITTER_BUFFER_SET_MAX_LATE_RATE
设置为 15 ,将JITTER_BUFFER_SET_LATE_COST
设置为 10 。如果这些参数不正确,有人可以建议更好的参数吗?
经过上述调整后,问题仍然存在。我想限制缓冲区容纳少于 我认为300ms的数据也是缓冲区的目标,但由于某种原因,缓冲区无法正常工作。
按照我的理解,每次调用
buffer.tick()
时都会调用buffer.get()
吗?该功能部分的文档非常有限。
我面临的问题是泛型Speex jitter buffer
的大小增加太多。
使用Opus FEC生成新数据包时,我们是否调用buffer.tick()?
请检查以下伪代码。
while(...){
int err = speexJitter.SpeexJitter_get(speexbuf, arraysize, sequencebytes, timestamp, FRAME_SIZE, 0);
int size = convertToShort(arraysize);
short sequenceNumber = convertToShort(sequencebytes);
if (err == 1) {
... play silence as no data present in buffer
} else if (err == 0 || size != 0) {
int difference = sequenceNumber - previousSequenceNumber;
if (difference > 1) {
decoder.decode(Arrays.copyOf(speexbuf, size), decodedData, 1); //FEC data
FECBuffer.add(Conversions.shortToByte(decodedData));
//Should I tick the buffer here depending on the number of difference
//Am I supposed to set JITTER_BUFFER_GET_CONCEALMENT_SIZE depending on difference here?
decoder.decode(Arrays.copyOf(speexbuf, size), decodedData, 0); //Original
FECBuffer.add(Conversions.shortToByte(decodedData));
} else {
decoder.decode(Arrays.copyOf(speexbuf, size), decodedData, 0);
FECBuffer.add(Conversions.shortToByte(decodedData));
}
previousSequenceNumber = sequenceNumber;
} else {
Log.e("Speex", "Error No :" + err);
}
}
speexJitter.SpeexJitter_tick();
Play(FECBuffer);
}