IOS Swift WebRtc проблема вставки Dtmf

Я создаю приложение, которое работает с шлюзом janus через websocket и webrtc. все работает нормально, я могу успешно отправлять и получать голосовые вызовы, но метод 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
     
    }
}

person Bilal Şimşek    schedule 29.06.2021    source источник


Ответы (1)


В моем случае именно так я обработал функцию вставки 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

person Krishna Kumar Thakur    schedule 05.07.2021
comment
Большое спасибо. Это решило мою проблему. - person Bilal Şimşek; 06.07.2021