You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jsSIP 3.2.4对接Asterisk:浏览器无法播放远端音频求助

解决jsSIP 3.2.4与Asterisk对接时浏览器无法播放应答音频的问题

我来帮你搞定这个jsSIP和Asterisk对接时的音频播放问题,结合你用的3.2.4版本,咱们一步步调整:

一、替换废弃的事件监听(核心问题)

你提到的addstream事件在jsSIP 3.x里确实被移除了,而且peerconnection事件也不是获取远程音频的正确时机。咱们换成3.x版本推荐的方式:

方案1:监听track事件(推荐)

这个事件会在远程媒体轨道添加时触发,是替代addstream的官方方案:

myPhone.on('newRTCSession', function(data) {
  const session = data.session;

  // 监听远程媒体轨道添加事件
  session.on('track', function(e) {
    // 只处理音频轨道
    if (e.track.kind === 'audio') {
      // 创建媒体流并绑定到audio元素
      const remoteStream = new MediaStream();
      remoteStream.addTrack(e.track);
      remoteAudio.srcObject = remoteStream;
      
      // 处理浏览器自动播放限制(后面会讲)
      tryPlayAudio(remoteAudio);
    }
  });
});

方案2:在会话确认后获取流

当会话进入confirmed状态(也就是通话建立完成),可以直接从peerConnection中获取远程流:

myPhone.on('newRTCSession', function(data) {
  const session = data.session;

  session.on('confirmed', function() {
    const remoteStreams = session.peerConnection.getRemoteStreams();
    if (remoteStreams.length > 0) {
      remoteAudio.srcObject = remoteStreams[0];
      tryPlayAudio(remoteAudio);
    }
  });
});

二、处理浏览器自动播放限制

现在几乎所有现代浏览器都禁止无用户交互的自动音频播放,这是很多人忽略的坑。咱们加个辅助函数来处理这个问题:

function tryPlayAudio(audioElement) {
  // 先尝试直接播放
  audioElement.play().catch(err => {
    // 播放失败时,监听用户交互事件(点击/触摸)
    const handleUserAction = () => {
      audioElement.play();
      // 完成后移除监听,避免重复触发
      document.removeEventListener('click', handleUserAction);
      document.removeEventListener('touchend', handleUserAction);
    };
    document.addEventListener('click', handleUserAction);
    document.addEventListener('touchend', handleUserAction);
    console.log('需要用户交互才能播放音频,请点击页面任意位置');
  });
}

三、验证Asterisk的媒体配置

如果上面的代码调整后还是没声音,得检查Asterisk的配置:

  • 确保SIP分机/ trunk的配置里开启了常用音频编码,比如allow=ulaw,alaw(和jsSIP的编码配置保持一致)
  • 检查Asterisk的RTP端口范围(默认是10000-20000)是否开放,没有被防火墙/安全组阻挡
  • 在Asterisk控制台执行rtp set debug on,查看是否有RTP媒体流发送到你的浏览器IP和端口,确认媒体传输正常

四、补充jsSIP初始化配置检查

确保你初始化jsSIP时开启了音频支持:

const config = {
  sockets: [new jsSIP.WebSocketInterface('wss://你的Asterisk地址:8089/ws')],
  uri: 'sip:你的用户名@你的域名',
  password: '你的密码',
  media: {
    audio: true, // 必须开启音频
    video: false
  }
};

const myPhone = new jsSIP.UA(config);

内容的提问来源于stack exchange,提问作者Игорь Быстревский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:51:23