2017-05-25 923 views
1

我創建的React應用程序使用JsSIP庫來應答通過VoIP SIP提供程序進行的呼叫。如何在JsSIP中處理音頻流?

我已經創建了一個有兩個按鈕(Accept和Reject)的頁面。它在SIP服務器上成功註冊SIP客戶端。它也成功接聽電話,我可以回答。但我在接聽電話時沒有聽到任何消息。

註冊JsSIP客戶端(在willReceiveProps因爲我有信息,道具變更後連接):

const socketHost = 'wss://' + contactCenter.host + ':' + contactCenter.port 
const socket = new JsSIP.WebSocketInterface(socketHost) 
const configuration = { 
    sockets: [socket], 
    uri: 'sip:' + contactCenter.login + '@' + contactCenter.host, 
    password: contactCenter.password, 
    socketHost: socketHost, 
} 

const coolPhone = new JsSIP.UA(configuration) 

coolPhone.on('connected', (e: any) => { 
    const messages = ServiceContainer.get<MessageManagerInterface>(ServiceTypes.Messages) 
    messages.addSuccess('SIP connected') 
}) 

coolPhone.on('newRTCSession', (e: any) => { 
    const messages = ServiceContainer.get<MessageManagerInterface>(ServiceTypes.Messages) 
    messages.addAlert('New call') 

    const session = e.session 

    session.on('failed', this.resetLocalState) 
    session.on('ended', this.resetLocalState) 

    const numberRegexp = /\"(\d+)\"/ 
    const fromNumber = (numberRegexp.exec(e.request.headers.From[0].raw))[1] 
    const toNumber = (numberRegexp.exec(e.request.headers.Contact[0].raw))[1].slice(1) 

    this.setState({ 
     callReceived: true, 
     callSession: session, 
     fromNumber: fromNumber, 
     toNumber: toNumber, 
    }) 
}) 

coolPhone.start() 

方法來處理應答按鈕點擊:

private answerCall =() => { 
    const messages = ServiceContainer.get<MessageManagerInterface>(ServiceTypes.Messages) 
    messages.addSuccess('Call answered') 

    const callOptions = { 
     mediaConstraints: { 
      audio: true, // only audio calls 
      video: false 
     }, 
     pcConfig: { 
      iceServers: [ 
       { urls: ["stun:stun.l.google.com:19302"] } 
      ], 
      iceTransportPolicy: "all", 
      rtcpMuxPolicy: "negotiate" 
     } 
    } 

    this.state.callSession.answer(callOptions) 

    this.state.callSession.connection.addEventListener('addstream', (event: any) => { 
     console.log(event) 
     this.audioElement.srcObject = event.stream 
    }) 

    this.audioElement.play() 

    this.setState({ 
     callAnswered: true, 
     callReceived: false, 
    }) 
} 

我做了什麼錯?

回答

2

我解決了這個問題。

問題出在this.audioElement.play()的位置。

我把它移到回調上addstream事件:

this.state.callSession.connection.addEventListener('addstream', (event: any) => { 
    console.log(event) 
    this.audioElement.srcObject = event.stream 
    this.audioElement.play() 
}) 

現在它工作正常。希望你也發現它很有用。

1

你可以用它簡化jssip的使用內作出反應的應用程序react-sip NPM庫: https://www.npmjs.com/package/react-sip

你只需要道具來傳遞你的連接設置<SipProvider/>,這將是靠近你的褡反應樹。 這將允許您執行基本的開始/停止/應答操作並在上下文中查看您的呼叫狀態!