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,提问作者אנונימי




