2017-05-25 120 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/>,这将是靠近你的褡反应树。 这将允许您执行基本的开始/停止/应答操作并在上下文中查看您的呼叫状态!