JsSIP 播放远程音频

问题描述 投票:0回答:2

我在我的项目中使用带有 Asterisk 的 jsSIP。问题是我不知道如何在我的浏览器中播放来自 Asterisk 的音频答案。现在我正在尝试这个

myPhone.on('newRTCSession', function(data){
    var session = data.session;
        session.on('peerconnection', function(e){
            remoteAudio.src = window.URL.createObjectURL(e.stream);
            remoteAudio.play();
        });
    });

但是事件没有被触发,我也尝试了事件“addstream”,但据我所知,它在我当前的 JsSIP 版本 (3.2.4) 中被删除了

连接到 Asterisk 没问题。我开始通话,收到应答,然后 Asterisk 必须播放音频文件,然后终止通话。连接 8 秒后终止,但不播放音频。 答案在

RTCSession.connection.remoteDescription.sdp

v=0
o=- 857805013 857805013 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS
m=audio 19006 RTP/SAVPF 0 8 126
c=IN IP4 95.47.143.134
a=rtcp:19007 IN IP4 95.47.143.134
a=candidate:Hc0a80068 1 udp 2130706431 192.168.0.104 19006 typ host generation 0
a=candidate:S5f2f8f86 1 udp 1694498815 95.47.143.134 19006 typ srflx raddr 192.168.0.104 rport 19006 generation 0
a=candidate:Hc0a80068 2 udp 2130706430 192.168.0.104 19007 typ host generation 0
a=candidate:S5f2f8f86 2 udp 1694498814 95.47.143.134 19007 typ srflx raddr 192.168.0.104 rport 19007 generation 0
a=ice-ufrag:218863545319313f5ed15c9b0503a7f1
a=ice-pwd:5e1dc0457efadffe13b44666585eecb9
a=fingerprint:sha-256 56:EE:4C:B8:78:88:AB:A4:C2:72:84:94:15:BE:7C:6E:D4:BD:2F:21:F1:F6:6D:68:E8:91:14:DC:94:72:75:0C
a=setup:active
a=mid:audio
a=sendrecv
a=rtcp-mux
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:150
a=ptime:20
javascript asterisk sip voip jssip
2个回答
5
投票

有一个名为

connection
的属性,它在
RTCPeerConnection
实例中包含
RTCSession
实例。据我了解,它代表远程/其他部分。

所以这里有一个代码示例,展示了如何添加一个事件监听器来捕获远程部分的媒体流并使用它。

session.connection.addEventListener('addstream', function (e) {
  // set remote audio stream
  const remoteAudio = document.createElement('audio');
  remoteAudio.src = window.URL.createObjectURL(e.stream);
  remoteAudio.play();
});

对于来电,

session.connection
不会立即实例化。因此,您需要附加另一个事件侦听器
peerconnection
,以捕捉您在问题中提到的事件。包括那部分,它应该如下所示;

session.on('peerconnection', function(data) {
  data.peerconnection.addEventListener('addstream', function (e) {
    // set remote audio stream
    const remoteAudio = document.createElement('audio');
    remoteAudio.src = window.URL.createObjectURL(e.stream);
    remoteAudio.play();
  });
});

这里有一些链接可以帮助您更好地理解它;

  1. JsSIP.RTCSession.connection
  2. RTCPeerConnection.onaddstream

0
投票

addstream
事件现已弃用。您应该改为使用
track
事件。示例实现:

attachRemoteStream(session) {
  // Fetch the existing audio element or create a new one
  const remoteAudio = document.getElementById('remoteAudio')

  session.connection.ontrack = (event) => {
    if (event.track.kind === 'audio') {
      if (event.streams.length > 0) {
        remoteAudio.srcObject = event.streams[0];
      } else {
        const stream = new MediaStream([event.track]);
        remoteAudio.srcObject = stream;
      }
    }
  };
}

然后对于来电,调用

peerconnection
上的函数:

session.on('peerconnection', (e) => {
  attachRemoteStream(session);
});
© www.soinside.com 2019 - 2024. All rights reserved.