gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:02:03 24 4
gpt4 key购买 nike

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

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

我认为我的应用程序实现没有问题,我有一个线程用于 UDP 接收(无 sleep ,只有 I/O)和排队播放音频,一个用于录音和 UDP 传输(无 sleep ,只有 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 是阻塞的,你应该确保你正在写入的每个 channel 都有一个线程,这样 write 调用就不会在等待其他 channel 完成时卡住。

关于android - 通过udp实现VOIP,当播放器无法应对接收数据包的速度时采取什么方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30661287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com