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

Voice quality issue in Android VoIP app with PJSIP

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

  1. 主线程
  2. Observer线程,每3分钟唤醒一次,快速去 睡觉
  3. SSL 读+写线程(SSL 读套接字通过互联网连接到服务器)
  4. 兼职 TCP 线程 active/inactive for RESTful API (在 9100 上创建套接字)
  5. 与 PJSIP 连接的 SIP 线程(在 5060 上创建套接字)
  6. 每次调用 2 个 RTP 线程(创建套接字对,例如 40000、40001)

相同的 C++11 模块也出现在 iOS/MAC 应用程序中,它工作得很好。 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 到 App 然后语音质量是 70+% 时间好
  2. App转GSM然后App端语音质量一直很好,但GSM端总是抖动

任何帮助将不胜感激,如果它解决了问题,我们将奖励赏金。 (我已经在 1 月 12 日左右开始赏金,但在那期间没有 reply/comment)

这个问题可能不是由 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 标志的更多信息。