【发布时间】:2020-11-13 00:19:31
【问题描述】:
我们在尝试重新邀请通话时遇到问题。
案例 1 - 工作:当 A 呼叫 B,B 接听电话,然后 A 暂停 - 在 B 侧播放 pjsip 音乐,在 A 取消暂停呼叫后,音频是双向传输——通话正常。
案例 2 - 不工作: A 呼叫 B,B 接听电话,然后如果 B 保持通话,则 A 侧不会播放 pjsip 音乐以通知用户通话暂停。此外,当 B 决定取消保持通话时,有一种方式从 A -> B 传输音频,例如 ptt(A 听不到 B)。
搁置后,我们得到了几个相同的错误,如下所示,不像取消搁置后我们不断收到每个传输包的错误,例如:srtp0x55a4c04d70 Failed to unprotect SRTP, pkt size=49, err=authentication failure
所以,我检查了日志,如果 B 在接听后立即将呼叫置于保持状态然后取消保持 - 他正在发送包裹,但 A 方没有收到它。 (通话结束时登录)
我们使用的是 pjsip 2.10。 (最新),opus 1.3.1(最新),openSSL 1.1.1g,还有 TLS over UDP。我们尝试在没有 opus 的情况下构建 pjsip lib,我们在互联网上找到了一些 pjsip 构建,但出现了同样的问题。我们不能禁用 TLS,因为它是连接到服务器(Asterisk 13.14.0)的强制性要求。 在 GSM @8kHz 上建立呼叫。如果我们在服务器上为某些用户启用 opus 并在 opus 编解码器上建立呼叫,我们会遇到相同的 PTT(单向音频)行为。 实现是在 Flutter 移动应用程序中,但 pjsip 部分是在本机 Java 端完成的。 PjsipPlugin.java
public void holdCall() {
CallOpParam prm = new CallOpParam(true);
mFirstCall.setHold(prm);
}
public void unHoldCall() {
CallOpParam prm = new CallOpParam(true);
prm.getOpt().setFlag(pjsua_call_flag.PJSUA_CALL_UNHOLD);
prm.getOpt().setAudioCount(1);
mFirstCall.reinvite(prm);
}
MyCall.java
@Override
public void onCallMediaState(OnCallMediaStateParam prm)
{
CallInfo callInfo;
try
{
callInfo = getInfo();
} catch (Exception e)
{
Log.e(TAG,"Exception occurred in onCallMediaState: getInfo: " + e.getMessage());
return;
}
CallMediaInfoVector mediaInfoVector = callInfo.getMedia();
for (int i = 0; i < mediaInfoVector.size(); i++)
{
CallMediaInfo mediaInfo = mediaInfoVector.get(i);
int type = mediaInfo.getType();
int status = mediaInfo.getStatus();
if (type == pjmedia_type.PJMEDIA_TYPE_AUDIO
&& (status == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE
|| status == pjsua_call_media_status.PJSUA_CALL_MEDIA_REMOTE_HOLD))
{
try
{
Media media = getAudioMedia(i);//getMedia(i);
AudioMedia am = AudioMedia.typecastFromMedia(media);
PjSipManager.mEndPoint.audDevManager().getCaptureDevMedia().startTransmit(am);
am.startTransmit(PjSipManager.mEndPoint.audDevManager().getPlaybackDevMedia());
} catch (Exception e)
{
// e.printStackTrace();
Log.e(TAG,"Exception occurred in onCallMediaState: " + e.getMessage());
}
}
}
PjSipManager.observer.notifyCallMediaState(this);}
【问题讨论】:
-
错误“无法取消保护SRTP..”表明存在SRTP问题(但不一定是主要原因),也许您可以尝试应用github.com/pjsip/pjproject/pull/2531的补丁
标签: java android openssl pjsip opus