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

4
我们正在使用PJSIP开发一款VoIP应用程序。内部核心模块采用C++11编写,外部UI采用Java编写。以下是创建的C++11线程:
  1. 主线程
  2. 观察者线程,每3分钟唤醒一次,然后快速休眠
  3. SSL读写线程(SSL读取套接字通过互联网连接到服务器)
  4. 兼职TCP线程,用于RESTful API的活动/非活动状态(在9100上创建套接字)
  5. SIP线程,与PJSIP连接(在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. 应用程序到应用程序,则语音质量70+%的时间都很好
  2. 应用程序到GSM,则语音质量始终在应用程序端良好,但在GSM端始终会出现抖动
非常感谢任何帮助,并且如果解决了该问题,将奖励赏金。(我已经在1月12日左右开始了一项赏金,但当时没有回复/评论)
1个回答

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));

阅读有关此文章中TCP_NODELAY标志的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接