You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript开发SIP通话应用:麦克风静音(对方听不到己方)功能实现求助

解决SIP通话应用的麦克风静音问题

我来帮你搞定这个麦克风静音的需求——你要的是本地麦克风静音(对方听不到你,但你能正常听到对方),之前的两种方法都没找对核心对象,所以方向错了。

为什么之前的方法无效?

  • 第一种方法:你自己调用navigator.getUserMedia获取的流,和SIP.js的SimpleUser会话中用来发送给对方的流不是同一个,修改这个流的轨道根本不会影响通话音频的发送。而且你还加了track.stop(),这会直接关闭麦克风,不是临时静音,恢复起来还要重新获取流,完全没必要。
  • 第二种方法:remoteVideoElement.muted=true是把你听到对方声音的音频元素静音了,刚好和你的需求相反,自然不符合要求。

正确实现思路

SIP.js的SimpleUser已经帮你管理了通话中的媒体流,我们只需要通过它提供的API拿到本地发送的媒体流,然后切换音频轨道的enabled属性即可:

  • 将轨道enabled设为false:麦克风静音,对方听不到你,你依然能听到对方
  • 将轨道enabled设为true:恢复麦克风,对方能重新听到你

具体代码实现

首先在你的JS代码里添加静音状态变量和修改后的mute函数:

let isMuted = false; // 记录当前静音状态

function mute() {
  // 确保SimpleUser实例已创建且媒体会话已建立
  if (!simple || !simple.mediaHandler) {
    console.warn("还未建立媒体会话,暂时无法操作静音");
    return;
  }

  // 获取SimpleUser管理的本地媒体流
  const localStream = simple.mediaHandler.getLocalStreams()[0];
  if (!localStream) {
    console.warn("未找到本地媒体流");
    return;
  }

  // 切换所有本地音频轨道的启用状态
  const audioTracks = localStream.getAudioTracks();
  audioTracks.forEach(track => {
    track.enabled = !track.enabled;
  });

  // 更新静音状态和按钮图标(对应你的img标签)
  isMuted = !isMuted;
  const muteImg = document.querySelector('.mute-btn img');
  muteImg.src = isMuted ? "//webrtc.phone.do/call/getMutedImg" : "//webrtc.phone.do/call/getMuteImg";
}

额外注意事项

  • 要确保在通话建立之后再调用mute函数,比如可以监听SimpleUser的call事件或者connected事件,避免因为会话未初始化导致拿不到mediaHandler
  • 如果需要更严谨的状态管理,可以在SimpleUser的trackAdded事件中提前获取本地流并保存,避免每次静音都重新查找。

内容的提问来源于stack exchange,提问作者אנונימי

火山引擎 最新活动