使用 Android.net.rtp 开始发送 Voip 延迟几秒

Some seconds delay on starting sending Voip with Android.net.rtp

我通过 Android.net.rtp 库实现了一个使用 Voip 的 Android 应用程序。 它只是从设备麦克风获取语音并通过 Voip 发送(发送到另一个 Android 或 PC 接收器)。 问题是在某些设备上,voip 传输会在 2-3 秒后开始。我不是说在传递数据包时有 2-3 秒的延迟,我的意思是前 2-3 秒的语音没有发送。在那 2-3 秒之后,一切正常。 奇怪的是,它只发生在某些 android 设备上,而不是设备性能或 Android 版本的问题。例如,它发生在一台非常旧的设备和一台新设备上,而它不会发生在另一台非常旧的设备和另一台新设备上…… 我想到了一些 Android service/functionality 会延迟麦克风捕获,但我目前没有发现任何东西......

下面是我发Voip的代码,是经典代码:

myAudioStream = new AudioStream(myIPAddress);
myAudioStream.setCodec(AudioCodec.PCMU);
myAudioGroup = new AudioGroup();
myAudioManager = (AudioManager) myContext.getSystemService(Context.AUDIO_SERVICE);

myAudioGroup.setMode(RtpStream.MODE_SEND_ONLY);
myAudioStream.join(null);
myAudioStream.setMode(RtpStream.MODE_SEND_ONLY);
myAudioStream.associate(ipAddress_Receiver, port_Receiver);
myAudioStream.join(myAudioGroup);
myAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
myAudioManager.setSpeakerphoneOn(false);
myAudioManager.setMicrophoneMute(false);

检查是否可以在 Android.net.rtp 中禁用 ICE and/or STUN。这些通常是媒体设置延迟的原因。

经过一些调试后,我发现 AudioManager 在 setMode 调用中引入了延迟:

myAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION))

奇怪的是它取决于设备。对于某些设备,它也可以引入 2-3 秒,而对于其他设备则不会引入延迟。

查看类似答案: Is there any significant delay in initializing AudioTrack on Android?

最后我找到了这个解决方案,设置:

myAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

在我的 class 的构造函数中,然后只有一次。当我还没有启动语音 TX 时,我在启动我的应用程序时调用构造函数。 这样,当我不得不发言时,我就不必浪费那几秒钟了...

希望对其他人有用。