使用PJSIP的Android VoIP应用中的语音质量问题

时间:2015-01-09 13:59:07

标签: android c++11 voip rtp pjsip

我们正在使用PJSIP开发VoIP应用程序。内部核心模块使用C ++ 11,外部UI使用Java。以下是C ++ 11线程的创建:

  1. 主线
  2. 观察者线程,每3分钟唤醒一次并快速进入 睡
  3. SSL读取+写入线程(SSL读取套接字通过Internet连接到服务器)
  4. 对RESTful API处于活动/非活动状态的兼职TCP线程 (在9100上创建套接字)
  5. 与PJSIP连接的SIP线程(在5060上创建套接字)
  6. 每次调用2个RTP线程(创建套接字对,例如40000,40001)
  7. iOS / MAC应用程序中也存在相同的C ++ 11模块,它可以正常工作。 Android应用也运行良好,但语音质量并不总是很好 [注意:我们排除了内置的Android SIP堆栈,因为它不支持3G。]

    我怀疑C ++ 11(共8个)主题是罪魁祸首并且还发布了一个问题:
    c++11 multithreading issues with Android where some threads are not scheduled properly
    但这对我来说似乎是一个遥远的可能性,因为在语音通话中,只有4个线程主要是活跃的:
    2 SSL + 2 RTP(此外,它在iOS.MacOS中工作正常)。

    现在我怀疑是PJSIP,因为,如果我们打电话:

    1. App to App然后语音质量是70 +%时间好
    2. 应用到GSM,然后App端的语音质量总是很好,但总是在GSM侧晃动
    3. 任何帮助都将非常感激,如果它解决了问题,赏金将得到回报。 (我已经在1月12日左右开始获得赏金,但在此期间没有回复/评论)

1 个答案:

答案 0 :(得分:0)

此问题可能不是由于PJSIP或Android中的多线程。实际上我们用来连接移动设备和服务器的TLS隧道是TCP,这对于发送RTP数据来说是个不错的选择。
但是,我不知道iOS和Mac如何设法产生如此好的音质。

说了这些,下面的选项确实有助于降低语音质量问题:

const int optionValue = 1;  // `int` is preferred
(void) ::setsockopt(m_ID, IPPROTO_TCP, TCP_NODELAY, &optionValue, sizeof(optionValue));

this article中了解有关TCP_NODELAY标志的更多信息。