传入的蜂窝呼叫在我的iOS应用程序中中断VoIP呼叫

时间:2014-05-04 08:36:44

标签: ios objective-c voip pjsip

我正在使用PJSIP(在PJSUA的帮助下)在我的应用程序中实现一些VoIP功能。 当我的应用程序中的VoIP呼叫正在进行中时,我可以轻松地保持呼叫,然后完全没有问题,一切都很好。 我已经使用CoreTelephony来识别进入的蜂窝(正常)呼叫,当呼叫到来时我在applicationWillResignActive中保持我的VoIP呼叫,当结束时我在applicationDidBecomeActive中取消(重新发起)我的VoIP呼叫。一切似乎工作正常(因为我几乎到处都有日志)但是从蜂窝电话回来后我的电话已经不再有任何媒体传输,所以电话正在进行,但我听不到任何声音。 30秒后我断开连接(我配置了30秒超时,因为我的服务器上没有媒体,这里会调用它。)。我真的很感激任何可能的信息或者我可能缺少的东西。提前谢谢大家。

3 个答案:

答案 0 :(得分:7)

正如这个维基:

http://trac.pjsip.org/repos/wiki/Getting-Started/iPhone?format=pdf

pjsip解释说,从iOS7开始,pjsua正在使用AVAudioSession的高级API来管理声音流的打开和关闭,这不允许在GSM呼叫(或任何其他声音)之后(自动)重新连接媒体流的旧方法)中断。 因此,要使其工作,您需要执行以下操作:

  • 您的应用程序应配置为接收中断事件,如果您使用声音或VOIP作为UIBackgroundModes,则已经是这种情况。如果没有,请使用以下内容接收中断:

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

  • 在中断开始时强制关闭声音设备。 使用pjsua_set_no_snd_dev()表示pjsua,AudDevManager.setNoDev()表示pjsua2

  • 当中断结束时,将AVAudioSession设置为活动状态,然后重新启动声音设备 使用pjsua_set_snd_dev()表示pjsua,或AudDevManager.setPlaybackDev()+setCaptureDev()表示pjsua2

可以使用pjsua_get_snd_dev()方法提取发送到pjsua_set_snd_dev()所需的参数。

要记住的一件事是,一旦你强行关闭设备,它就不会自动启动(即使新的呼叫开始),除非你调用pjsua_set_snd_dev()重新启动它

答案 1 :(得分:0)

我和inActive中的应用程序一样 - 我调用set hold和pjsua_set_no_snd_dev

我想这样可行。

但是当应用程序再次变为活动状态时,我会调用re-invite和pjsua_set_snd_dev(0,0)

这里有问题,那就是如何使用pjsua_get_snd_dev(int * capture_dev,int * playback_dev)函数。

我收到可能重新注册相同线程的错误

答案 2 :(得分:0)

对于Android开发者:我们说,您正在进行SIP通话,并且您会收到GSM通话。你必须创建自己的接收器,它将听取电话呼叫状态。一个人应该在接收的GSM上保持SIP呼叫并在断开连接时发送SIP重新邀请。在您保持通话之前,您应该使用AudDevManager.setNoDev()关闭音频。当您准备好发送SIP重新邀请时,您应该拨打AudDevManager.setPlaybackDev()然后AudDevManager.setCaptureDev()。这应该解决音频问题。