如何在Linphone iOS SDK中发送DTMF?sendDtmf报invalid call错误如何解决
Linphone iOS SDK V5 SendDTMF功能失效问题原因及解决方案
问题原因
- call实例状态异常:日志输出
invalid call说明你当前持有call实例不是有效活跃通话对象,只有处于LinphoneCallStateStreamsRunning(流运行中)状态的通话才能调用发送DTMF接口,若通话处于连接中、挂起、即将挂断状态,调用接口都会报错。 - call实例归属Core不匹配:你的代码中同时初始化了
coreManager1和coreManager2两个独立的Linphone Core实例,若call实例不是从当前正在运行迭代的Core中获取的,跨Core调用方法会直接判定为无效call。 - DTMF协商配置异常:若SIP协商阶段未成功协商RFC2833的
telephone-event载荷,且Linphone Core未开启带内DTMF支持,调用发送DTMF接口也会返回错误。
解决方案
- 发送DTMF前先校验当前活跃通话状态,确保使用的是最新的有效call实例:
@IBAction func btnsAppend(_ sender: UIButton) { let digit = sender.currentTitle! let cchar = (digit.cString(using: .utf8)?[0])! // 从全局唯一Core中获取当前活跃通话 guard let activeCall = lc?.calls.first, activeCall.state == .streamsRunning else { print("无有效活跃通话,无法发送DTMF") return } do { try activeCall.sendDtmf(dtmf: cchar) } catch { print("DTMF发送失败:\(error)") } }
- 全局仅保留一个Linphone Core实例,删除多余的Core实例(你的代码中
coreManager1和coreManager2保留一个即可),避免状态错乱。 - Core初始化阶段配置DTMF相关参数,适配你的服务端要求:
// Core初始化完成后配置 lc?.useRfc2833Dtmf = true // 优先使用RFC2833 DTMF,兼容性最好 lc?.useInBandDtmf = true // 开启带内DTMF作为兜底,RFC2833协商失败时使用 lc?.sendDtmfViaSipInfo = false // 不需要通过SIP INFO发送DTMF时关闭,按需调整
内容的提问来源于stack exchange,提问作者Ajoy Karmakar
相关产品推荐
相关产品推荐

