【问题标题】:Remote Audio not connecting: iOS, PJSIP 2.6, CallKit, PJSUA2远程音频未连接:iOS、PJSIP 2.6、CallKit、PJSUA2
【发布时间】:2017-06-26 18:47:36
【问题描述】:

我正在更新现有的 iOS VOIP 应用程序以将 CallKit 与 PJSIP 2.6 和 PJSUA2 一起使用。

经过一番努力,CallKit 实现似乎按预期工作。来电可以被接受或拒绝,如果被接受,将通过应用内的活动呼叫视图控制器进行连接和控制。

但是,音频在 pjsip 端似乎没有正确连接。没有音频从远程呼叫者传入或传出。麦克风音频似乎被路由回 iPhone 扬声器。

SIP 音频端口应该在回调函数 onCallMediaState 中连接:

虚空 onCallMediaState(OnCallMediaStateParam &prm) {

    CallInfo ci = getInfo();
    AudioMedia* audio_media = 0;
    for (unsigned i = 0; i < ci.media.size(); i++) {
        if (ci.media[i].type==PJMEDIA_TYPE_AUDIO && ( ci.media[i].status == PJSUA_CALL_MEDIA_ACTIVE ||
            ci.media[i].status ==PJSUA_CALL_MEDIA_REMOTE_HOLD)) {
            try {
                audio_media = static_cast<AudioMedia*>(getMedia(i));
                if(audio_media != 0)
                {    
                    Endpoint::instance().audDevManager().getCaptureDevMedia().startTransmit(*audio_media);
                    audio_media->startTransmit(Endpoint::instance().audDevManager().getPlaybackDevMedia());
                }
            } catch (std::exception ex) {
                continue;
            }
        }
    }
}

如 Ticket#1941 中所述: https://trac.pjsip.org/repos/ticket/1941:

  1. 我使用以下方式设置音频设备:

    ep->audDevManager().setNullDev();

在 Endpoint 类 (ep-&gt;libInit(epConfig);) 初始化之后,然后:

  1. 我尝试在 CXProvider 的 didActivate 函数中使用 pjsua_set_snd_dev() 设置设备,如下所示:

-(void) setSipSoundDevices {

    pj_status_t status;
    int captDev, playDev;
    pjsua_get_snd_dev(&captDev, &playDev);
    Endpoint::instance().audDevManager().setPlaybackDev(playDev);
    Endpoint::instance().audDevManager().setCaptureDev(captDev);
}

pjsua_get_snd_dev(&captDev, &playDev) 返回 -99, -99 且音频未连接。

我的问题是这样的。如何在使用 PJSIP 2.6 和 CallKit 的来电中正确连接远程音频源或端口?

2.5.5 在这方面会更好吗?

感谢任何见解。

【问题讨论】:

  • 您找到解决此问题的方法了吗?我现在也遇到了同样的问题。接听来电后,两端无音频。
  • 我在为来电和去电连接音频方面取得了更好的成功。没有简单的答案,但我做了一些帮助的事情。 1) 我构建并重建了 PJSIP 2.6 库。 PJSUA 根本不应该处理 AudioSession(ala PJSIP 和 CallKit 文档)。然而,这在 CallKit 示例代码中引入了与音频相关的崩溃和故障。 2)我安装了“pjsip”吊舱,并用一些与音频相关的库(想到了 webrtc)替换了我自己构建的库。 3) 在音频开始连接之前,我重新排列了很多 CallKit 代码。
  • 我仍然面临 1) 应用程序启动后第一次来电音频未连接,而去电连接正常的问题。 2) 在没有“呼叫失败”屏幕的情况下未断开拨出电话,以及 3) 在“保持并接受”后中断运营商呼叫后音频未重新连接。
  • 如何在用户单击呼叫套件屏幕上的接听按钮时启动音频。你能解释一下吗?在我的情况下,callkit 正在作为另一个应用程序工作.. 在参加通话时,我的应用程序已进入后台。然后用户点击回答按钮,音频无法正常工作,因为我的应用程序已进入后台。
  • 在我的情况下,拨出电话工作正常,bcoz 我使用单独的视图控制器。我刚刚在 info.plist 文件中添加了麦克风权限。对于保持和取消保持,pjsip 中有方法。请验证并更正。

标签: ios iphone pjsip avaudiosession callkit


【解决方案1】:

渐渐地,我的来电音频工作正常。问题的症结在于,即使 Apple 和 SIP 的文档都说必须在 iOS 端处理音频,您仍然必须在提供商委托的 SIP 层中设置 SIP 音频设备“didActivate”和'didDeactivate' 功能。因为我使用 PJSUA C++ 层,所以我不得不深入研究 objc-c++ 桥接层来提供此功能。即。

-(void) activateSipSoundDevices {
    pj_status_t status = pjsua_set_snd_dev(0, 0);
}

-(void) deactivateSipSoundDevices {
    pj_status_t status = pjsua_set_null_snd_dev();
}

在初始化 SIP 账号时,一定要设置空声音设备,如:

ep->audDevManager().setNullDev();

希望这会有所帮助。

【讨论】:

  • 嗨,你能告诉我当应用程序被杀死时你是如何接到来电的。应用程序是否收到任何信号(不是推送),我们可以在 callkit 传入委托方法中捕获它吗?
  • 据我所知,在应用程序终止时接听来电的唯一方法是推送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多