android - 使用 PJSIP 的 Android VoIP 应用程序中的语音质量问题

标签 android c++11 voip rtp pjsip

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

  1. 主线程
  2. Observer 线程,每 3 分钟唤醒一次,并迅速转到 sleep
  3. SSL 读+写线程(SSL 读套接字通过互联网连接到服务器)
  4. 为 RESTful API 激活/不激活的兼职 TCP 线程 (在 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 个线程主要处于 Activity 状态:
2 SSL + 2 RTP(此外,它在 iOS 和 MacOS 中运行良好)。

现在我怀疑 PJSIP,因为,如果我们从以下位置调用电话:

  1. App 到 App 然后语音质量是 70+% 次
  2. 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/

相关文章:

android - 使用 TAG `android:switcher: + R.id.ot_pag_main + :0` 查找 fragment 是否安全?

c++ - GCC constexpr constexpr 函数中的 lambdas 和编译时的评估

c++ - 将 bind1st 和 bind2nd 与转换一起使用时出现问题

voip - SIP 和 H.323 的区别

ios - 办理电话: links in voip app

android - 旋转时未调用 fragment onCreateView 和 onActivityCreated

java - 创建相对于当前实时时间的倒计时器?

android - 获得 Looper 的最佳做法是什么?

c++ - 指针和 {l,r} 值引用的通用名称?

android - 屏幕锁定时如何显示来电屏幕?