[英]Incoming cellular call interrupting a VoIP call in my iOS App
我正在使用PJSIP(在PJSUA的帮助下)在我的应用程序中实现一些VoIP功能。 当我的应用程序中的VoIP呼叫正在进行中时,我可以轻松地保持呼叫,然后完全没有问题,一切都很好。 我已经使用CoreTelephony识别的话蜂窝(正常)调用,当有电话打进来我认为我的VoIP呼叫在applicationWillResignActive
和时结束我取消保留(重新邀请)在我的VoIP呼叫applicationDidBecomeActive
。 一切似乎工作正常(因为我几乎到处都有日志)但是从蜂窝电话回来后我的电话已经不再有任何媒体传输,所以电话正在进行,但我听不到任何声音。 30秒后我断开连接(我配置了30秒超时,因为我的服务器上没有媒体,这里会调用它。)。 我真的很感激任何可能的信息或者我可能缺少的东西。 谢谢大家。
作为这个维基:
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重启声音设备,或者为pjsua2使用AudDevManager.setPlaybackDev()+setCaptureDev()
可以使用方法pjsua_get_snd_dev()
提取发送到pjsua_set_snd_dev()所需的参数。
这里要记住的一件事是,一旦你强行关闭设备它就不会自动启动(即使新的呼叫开始),除非你再次调用pjsua_set_snd_dev()重新启动它
我和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)函数。
我得到可能重新注册相同线程的错误
对于Android开发者:我们说,您正在进行SIP呼叫并且您接收GSM呼叫。 你必须创建自己的接收器,它将听取电话呼叫状态。 一个人应该在接收的GSM上保持SIP呼叫并在断开连接时发送SIP重新邀请。 在您保持呼叫之前,您应该使用AudDevManager.setNoDev()
关闭音频。 当您准备发送SIP重新邀请时,您应该调用AudDevManager.setPlaybackDev()
,然后AudDevManager.setCaptureDev()
。 这应该解决音频问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.