我们正在使用 PJSIP 开发一个 VoIP 应用程序。内部核心模块使用 C++11,外部 UI 使用 Java。创建了以下 C++11 线程:
- 主线程
- Observer 线程,每 3 分钟唤醒一次,并迅速转到 sleep
- SSL 读+写线程(SSL 读套接字通过互联网连接到服务器)
- 为 RESTful API 激活/不激活的兼职 TCP 线程 (在 9100 上创建套接字)
- 与 PJSIP 连接的 SIP 线程(在 5060 上创建套接字)
- 每次调用 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 个线程主要处于 Activity 状态:
2 SSL + 2 RTP(此外,它在 iOS 和 MacOS 中运行良好)。
现在我怀疑 PJSIP,因为,如果我们从以下位置调用电话:
- App 到 App 然后语音质量是 70+% 次
- App到GSM然后App端语音质量一直很好,但是GSM端一直抖
任何帮助将不胜感激,如果它解决了问题,我们将给予赏金。 (我已经在 1 月 12 日左右开始赏金,但在那期间没有回复/评论)
最佳答案
这个问题可能不是由 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 标志的更多信息.
关于android - 使用 PJSIP 的 Android VoIP 应用程序中的语音质量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862199/