首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JsSIP中处理音频流?

如何在JsSIP中处理音频流?
EN

Stack Overflow用户
提问于 2017-05-25 14:43:11
回答 2查看 7.6K关注 0票数 3

我正在创建使用JsSIP库来响应通过VoIP SIP发出的调用的React应用程序。

我已经创建了一个有两个按钮的页面(接受和拒绝)。成功地在SIP服务器上注册了SIP客户端.它也成功地接到了电话,我可以接听。但我接电话的时候什么都没听到。

注册JsSIP客户端(在willReceiveProps中,因为我有道具更改后连接的信息):

代码语言:javascript
复制
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()

方法处理应答按钮,单击:

代码语言:javascript
复制
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,
    })
}

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-26 05:34:19

我解决了问题。

问题出在this.audioElement.play()线的位置。

我将其移到addstream事件的回调中:

代码语言:javascript
复制
this.state.callSession.connection.addEventListener('addstream', (event: any) => {
    console.log(event)
    this.audioElement.srcObject = event.stream
    this.audioElement.play()
})

现在它很好用。希望你也发现它有用。

票数 11
EN

Stack Overflow用户

发布于 2017-08-19 17:05:39

您可以使用react-sip npm库,它简化了在React应用程序中的jssip的使用:https://www.npmjs.com/package/react-sip

您只需要将连接设置作为道具传递给<SipProvider/>,它将位于您的响应树顶部附近的某个位置。这将允许您执行基本的开始/停止/应答操作,并在上下文中查看调用的状态!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44183387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档