IOS Swift WebRtc insertDtmf 问题

如何解决IOS Swift WebRtc insertDtmf 问题

我正在构建一个通过 websocket 和 webrtc 与 janus 网关配合使用的应用程序。一切正常,我可以成功发送和接收语音电话,但 insertDtmf 方法不会将我的 dtmf 发送到其他对等方。 android中相同的帐户和相同的代码工作正常。 这里是我准备webrtc的地方

private func prepareWebRtc( callbacks:PluginHandleWebRTCCallbacksDelegate) {

    if (pc != nil) {

        if (callbacks.getJsep() == nil) {
          
            createSdpInternal(callbacks: callbacks,isOffer: isOffer)
        } else {
         

            let jsep = callbacks.getJsep()!
                let sdpString:String = jsep["sdp"] as! String
            let type:RTCSdpType = RTCSessionDescription.type(for: jsep["type"] as! String)
            let sdp:RTCSessionDescription =  RTCSessionDescription.init(type: type,sdp: sdpString)
     
            pc.setRemoteDescription(sdp) { (err) in}



            }
    } else {

        trickle = callbacks.getTrickle() != nil ? callbacks.getTrickle()! : false

        streamsDone(webRTCCallbacks: callbacks)


    }
}


private func streamsDone(webRTCCallbacks:PluginHandleWebRTCCallbacksDelegate) {


    let rtcConfig =  RTCConfiguration.init()
    rtcConfig.iceServers = server.iceServers
    rtcConfig.bundlePolicy = RTCBundlePolicy.maxBundle
    rtcConfig.rtcpMuxPolicy = RTCRtcpMuxPolicy.require
    rtcConfig.continualGatheringPolicy = RTCContinualGatheringPolicy.gatherContinually
    rtcConfig.sdpSemantics = .planB


    let source :RTCAudioSource = sessionFactory.audioSource(with: audioConstraints)
    
    let audioTrack:RTCAudioTrack? = sessionFactory.audioTrack(with: source,trackId: AUdio_TRACK_ID)

    let stream:RTcmediaStream?  = sessionFactory.mediaStream(withStreamId: LOCAL_MEDIA_ID)
    
    if (audioTrack != nil){
        stream!.addAudioTrack(audioTrack!)
    myStream = stream
    }
           
    if (stream != nil){
        onLocalStream(stream: stream!)
    }
            

       // pc.addTrack(audioTrack,mediaStreamLabels);


    pc = sessionFactory.peerConnection(with: rtcConfig,constraints: audioConstraints,delegate: nil)

    if (myStream != nil){
        pc.add(myStream)
    }
    
    
    if  let obj:[String:Any] = webRTCCallbacks.getJsep(){
        
        let sdp:String = obj["sdp"] as! String
        
        let type:RTCSdpType = RTCSessionDescription.type(for: obj["type"] as! String)
        
        let sessionDescription:RTCSessionDescription =  RTCSessionDescription(type: type,sdp: sdp)

            print("  STREAMS DONE  JSEP NULL  DEĞİL")
        
         //   pc.setRemoteDescription(WebRtcObserver(webRTCCallbacks),sessionDescription);
        
         pc.setRemoteDescription(sessionDescription) { (err) in

        }
    }else{
        createSdpInternal(callbacks: webRTCCallbacks,isOffer: isOffer)
        print("  STREAMS DONE  JSEP NULL ");
    }
    

      
       /* } catch (Exception ex) {
            webRTCCallbacks.onCallbackerror(ex.getMessage());
        }*/
  
}

在这里我尝试发送 dtmf

public func insertDTMF(_ tone:String){
    if(pc != nil){
      

        if let dtmfSender = pc.senders.first?.dtmfSender{
                dtmfSender.insertDtmf(tone,duration: 200,interToneGap: 70)
            }
           //Here the timers are in ms
     
    }
}

解决方法

就我而言,这就是我处理插入 DTMF 功能的方式。

a - 首先过滤掉音频 RTCRtpSender 轨道:

var audioSender: RTCRtpSender?

for rtpSender in pc.senders {   
  if rtpSender.track?.kind == "audio" {    
    audioSender = rtpSender   
  } 
}

b - 然后使用相同的过滤后的 audioSender 对象使用 OperationQueue 插入音调

if let audioSender = audioSender {
   let queue = OperationQueue()
   queue.addOperation({
     audioSender.dtmfSender?.insertDtmf(dtmfTone,duration: TimeInterval(0.1),interToneGap: TimeInterval(0.5))
   })
}

注意:您可以根据需要修改持续时间和 interToneGap。

希望这个解决方案也适用于您。

可以在此处找到原始答案:https://stackoverflow.com/a/60148372/4515269

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?