在笔者早期的文章里,没有对早期媒体进行处理,选择了本地的媒体进行播放,在当时看来还可以接受,但是目前来看,体验很差,所以笔者花费了很长时间搜集关于sip.js回铃音的相关文档,甚至一度打算改用jssip去实现此功能(笔者自己写了个测试demo,效果还可以),后来考虑到可能需要修改的业务代码比较多,就放弃了.官方的github上对于此话题的讨论热度很高,具体地址 Support for early media (with 100rel or not) for InviteClientContext,在这里可以找到解决方案(果然牛人还是很多).在讲述解决方案之前,先推荐两个比较好的地址,基本上可以解决绝大多数问题
笔者选择的sip.js的版本为sip-0.13.8.js,(目前最新版本为0.15.x,许多API进行了更改,官方说明此版本最新的API是支持早期媒体的,新的API还在主库维护,感兴趣的可以自己测试一下,0.15.x官方API地址)
<param name="enable-100rel" value="true"/>
此处是重中之重,一定要确保此参数是开启的
根据sip.js官方给出的说明,我们需要设置以下两个参数
rel100: SIP.C.supported.REQUIRED
# 此参数会在sip头中添加一个参数 Require: 100rel,
inviteWithoutSdp:true
# 使用此参数会发送一个没有sdp的请求,但是freeswitch不能处理这个请求,所以笔者按照SIPJS官方的建议设置此参数时,
# 呼叫不可达,折腾了半天,实在无法解决.自认 没有能力解决(本人是freeswith入门小白).后来呼叫时未设置此参数,卡线是
#可以听到回铃音的,中继线路需要读者自己去测试
所以我们仅需要设置第一个参数即可.
rel100: SIP.C.supported.REQUIRED
var remoteVideo = document.getElementById('remoteVideo');
var localVideo = document.getElementById('localVideo');
session.on('trackAdded', function() {
console.error(this);
var pc = this.sessionDescriptionHandler.peerConnection;
var remoteStream;
if (pc.getReceivers) {
remoteStream = new window.MediaStream();
pc.getReceivers().forEach(function (receiver) {
var track = receiver.track;
if (track) {
remoteStream.addTrack(track);
}
});
} else {
remoteStream = pc.getRemoteStreams()[0];
}
remoteVideo.srcObject = remoteStream;
var localStream_1;
if (pc.getSenders) {
localStream_1 = new window.MediaStream();
pc.getSenders().forEach(function (sender) {
var track = sender.track;
if (track && track.kind === "video") {
localStream_1.addTrack(track);
}
});
}
else {
localStream_1 = pc.getLocalStreams()[0];
}
localVideo.srcObject = localStream_1;
});