通过 udp 实现 VOIP,当播放器无法处理接收数据包的速度时,采取什么方法

Implementing VOIP over udp, what is the approach to take when the player cannot cope up with received packet's speed

我正在 android 上实现 p2p 语音 IP,使用 UDP、openSL 和一些音频压缩。 2个peer连接时语音聊天效果很好,延迟稳定在100ms左右。 当第三个对等点连接时,一个或多个对等点逐渐累积滞后,在某些情况下达到 15+ 秒。

我的猜测是由于某种原因处理速度跟不上接收速度(数据包在音频缓冲区中累积)。 在这种情况下,正确的做法是什么? 我是否应该丢弃一些数据包以使延迟恢复到较小的值?

我认为我的应用程序实现没有问题,我有一个线程用于 UDP 接收(没有睡眠,只有 I/O)和排队播放音频,一个用于录音和 UDP 传输(没有睡眠,只有 I/O)和其他一些做不相关事情的线程。 这是VOIP中的普遍情况,还是这个设计有问题?

编辑: 我以前是用OpenSL混合声音,但现在我切换到更简单的android API这似乎减轻了问题但没有解决问题。

这给出了我正在采取的相关步骤的图像:

// setup
private AudioTrack track[] = new AudioTrack[MAX_CHANNELS];

for( int i=0; i<MAX_CHANNELS; i++ ) {
        track[i] = new AudioTrack(AudioManager.STREAM_VOICE_CALL, SAMPLING_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, outBufferSize, AudioTrack.MODE_STREAM);
        track[i].play();
}

// [...]
// -- RECEIVE THREAD --
DatagramPacket datagram = socket.receiveMessage();
// ... determine channel by ip
track[channel].write(datagram.getData(), datagram.getOffset(), datagram.getLength());

由于 AudioTrack.write 正在阻塞,您应该确保您正在写入的每个通道都有一个线程,这样写调用就不会卡住等待其他通道完成。