使用android.net.rtp工具时,RTP媒体出现严重延迟

ats*_*dis 5 media android voip rtp

我正在为Android构建VOIP应用程序,并使用内置的RTP工具android.net.rtp。除以下问题外,一切工作正常:

  • 在传入的RTP流中,存在很大的延迟(大约在0.5-1秒钟之前,我听到对方的声音)-请注意,传出的流会立即到达对方
  • 在传出的RTP流中,有少量中断。

请记住,对于AudioStream,我正在使用PCMU编解码器,而远程方也是如此。

以下是一些关键代码:

初始化音频设施(一次):

public class SoundManager implements AudioManager.OnAudioFocusChangeListener {
    Context appContext;
    AudioManager audio;
    AudioStream audioStream;
    AudioGroup audioGroup;
    InetAddress localAddress;
    private static final String TAG = "SoundManager";

    public SoundManager(Context appContext, String ip){
        this.appContext = appContext;
        audio = (AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE);
        try {
            localAddress = InetAddress.getByName(ip);
            audioGroup = new AudioGroup();
            audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

初始化AudioSession(在每次通话开始之前一次)

public int setupAudioStream() {
    Log.i(TAG, "Setting up Audio Stream");
    try {
        audioStream = new AudioStream(localAddress);
        audioStream.setCodec(AudioCodec.PCMU);
        audioStream.setMode(RtpStream.MODE_NORMAL);
    }
    catch (SocketException e) {
        e.printStackTrace();
    }

    return audioStream.getLocalPort();
}
Run Code Online (Sandbox Code Playgroud)

开始流式传输(在每次通话开始时一次)

public void startStreaming(int remoteRtpPort, String remoteIp) {
    audio.setMode(AudioManager.MODE_IN_COMMUNICATION);

    // Request audio focus for playback
    int result = audio.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);

    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        try {
            audioStream.associate(
                    InetAddress.getByName(remoteIp),
                    remoteRtpPort);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }

        try {
            audioStream.join(audioGroup);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
    else {
        Log.e(TAG, "Cannot receive audio focus; media stream not setup");
    }
}
Run Code Online (Sandbox Code Playgroud)

停止流式传输(在每次通话结束时一次)

public void stopStreaming() {
    try {
        audioStream.join(null);
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

    audioGroup.clear();
    if (audioStream.isBusy()) {
        Log.i(TAG, "AudioStream is busy");
    }
    audioStream = null;
    audio.setMode(AudioManager.MODE_NORMAL);

    // Abandon audio focus when playback complete
    audio.abandonAudioFocus(this);
}
Run Code Online (Sandbox Code Playgroud)

最后,请注意,在Android控制台(logcat)中,我看到了以下内容:

D/AudioGroup? latency: output 400, input 64'
D/AudioGroup? stream[56] is configured as PCMU 8kHz 20ms mode 0
D/AudioGroup? stream[67] is configured as RAW 8kHz 32ms mode 0
Run Code Online (Sandbox Code Playgroud)

似乎其中一个流具有相当大的延迟,加上其中之一似乎配置为RAW。虽然不确定我是否正确解释了它们

有人目睹过类似的行为吗?

最好的问候,安东尼