【问题标题】:Incoming cellular call interrupting a VoIP call in my iOS App在我的 iOS 应用程序中来电打断 VoIP 通话
【发布时间】:2014-06-20 16:14:08
【问题描述】:

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

【问题讨论】:

  • 持有并重新邀请您的意思是...您是否保持套接字打开并暂停您的媒体?或者你真的重新打开了套接字?
  • @Daij-Djan: 嗯,我正在使用 PJSUA,它给了我两种方法 pjsua_call_set_hold(pjsua_call_id call_id, const pjsua_msg_data *msg_data);pjsua_call_reinvite(pjsua_call_id call_id, unsigned options, const pjsua_msg_data *msg_data);
  • 不知道 pjsua - 抱歉
  • @Daij-Djan:无论如何感谢您的回复。 ;)
  • @Mepla 你是如何解决这个问题的,对我来说目前也面临同样的问题,你找到任何解决方案,如果有请告诉我,谢谢!

标签: ios objective-c voip pjsip


【解决方案1】:

作为这个维基:

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

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

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

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

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

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

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

【讨论】:

  • 非常感谢,这实际上解决了我当时的问题,但是由于工作量大,我无法在此处添加它作为答案,再次感谢您您的回复,我希望其他使用 PJSIP 的人可以从中受益。
  • 就我而言,在中断结束后,我必须等待大约 2 秒才能将音频会话设置为活动状态。
  • 如何实现这个,我不太明白,能否请你提供更多关于这个的信息,目前我正面临这个中断。谢谢!
【解决方案2】:

每当应用程序处于 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) 函数。

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

【讨论】:

  • 我每次拨打电话时都会调用 pjsua_set_snd_dev(0,0),是否有问题?谢谢
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多