通过udp实现VOIP,当玩家无法应对收到的数据包速度时采取的方法是什么

时间:2015-06-05 07:57:00

标签: android audio udp voip rtp

我正在使用UDP,openSL和一些音频压缩在Android上实现p2p语音IP。 当2个对等体连接时,语音聊天效果很好,并且滞后稳定在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());

1 个答案:

答案 0 :(得分:0)

由于AudioTrack.write是阻塞的,你应该确保你所写的每个频道都有一个线程,这样写呼叫就不会等待其他频道完成。