如何正确使用通用Speex抖动缓冲区?

时间:2019-11-26 13:20:00

标签: buffer opus speex jitter

我正在尝试将通用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);
}

0 个答案:

没有答案