我正在创建使用JsSIP库来应答通过VoIP SIP提供程序进行的呼叫的React应用程序。
我已经创建了一个具有两个按钮(接受和拒绝)的页面。它在SIP服务器上成功注册了SIP客户端。它也成功接听电话,我可以接听。但是接听电话时我什么都没听到。
注册JsSIP客户端(willReceiveProps因为在更改道具后我有连接信息):
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, }) }
我做错什么了?
我解决了问题。
问题在于this.audioElement.play()生产线的位置。
this.audioElement.play()
我将其移至addstream事件的回调中:
addstream
this.state.callSession.connection.addEventListener('addstream', (event: any) => { console.log(event) this.audioElement.srcObject = event.stream this.audioElement.play() })
现在工作正常。希望您也觉得它有用。