Вот весь код связанный с jssip, брался из примера github и немного добавлялся.
Сейчас данный код отрабатывает отлично, в момент звонка нет ошибок и сам звонок можно принять, но звука в нем нет. Проверял так же отдельно с работу микрофона, если взять с него звуки сразу же воспроизвести, то все работает.
Отдельно проверял работу через MicroSIP, если звонить на внутреннее номера, звук есть, можно разговаривать, а вот через jssip не работает.
Отслеживал трафик через Wireshark, при звонке через microsip идет много rtp и звук передается, а через jssip, не одного rtp нет.
Вот сам код
console.log("on login");
const socket = new JsSIP.WebSocketInterface("wss://"),
_ua = new JsSIP.UA(
{
uri: ``,
password: '',
display_name: `8089`,
authorization_user: '8089',
sockets: [socket],
register: true
})
//JsSIP.debug.enable('JsSIP:*')
// соединяемся с астером
_ua.on('connecting', () => {
console.log("UA connecting");
})
// соединились с астером
_ua.on('connected', () => {
console.log("UA connected");
})
// астер нас зарегал, теперь можно звонить и принимать звонки
_ua.on('registered', () => {
console.log("UA registered");
})
// астер про нас больше не знает
_ua.on('unregistered', () => {
console.log("UA unregistered");
})
// астер не зарегал нас, что то не то, скорее всего неверный логин или пароль
_ua.on('registrationFailed', (data) => {
//console.error("UA registrationFailed", data.cause);
})
// заводим шарманку
_ua.start()
console.log('----------------------')
let number = `201`, // 'sip:+38269725198@call.hitno.com'
_localClonedStream = ''
// Делаем ИСХОДЯЩИЙ звонок
// Принимать звонки этот код не умеет!
const session = await _ua.call(number, {
pcConfig: {
hackStripTcp: true, // Важно для хрома, чтоб он не тупил при звонке
rtcpMuxPolicy: 'negotiate', // Важно для хрома, чтоб работал multiplexing. Эту штуку обязательно нужно включить на астере.
iceTransportPolicy: "all",
iceServers: [
]
},
extraHeaders: [
'X-Foo: foo',
'X-Bar: bar'
],
mediaConstraints: {
audio: true, // Поддерживаем только аудио
video: false
},
rtcOfferConstraints: {
offerToReceiveAudio: 1, // Принимаем только аудио
offerToReceiveVideo: 0
},
});
const userMedia = await navigator.mediaDevices.getUserMedia({audio : true, video : false});
const audioTrack = userMedia.getAudioTracks()[0];
session.connection.addTrack(audioTrack)
// Это нужно для входящего звонка, пока не используем
_ua.on('newRTCSession', (data) => {
console.log('newRTCSession')
const { session } = data;
session.connection.addEventListener('addstream', (event) => {
const audioElement = document.createElement('audio');
audioElement.srcObject = event.stream;
audioElement.play();
document.body.appendChild(audioElement);
});
session.on('ended', () => {
console.log('Звонок завершен');
});
session.on('failed', () => {
console.log('Звонок не удался');
});
session.answer({
mediaConstraints: { audio: true, video: false },
});
/*
let session = data.session, // outgoing call session here
dtmfSender
session.on("confirmed",function(){
//the call has connected, and audio is playing
let localStream = session.connection.getLocalStreams()[0];
dtmfSender = session.connection.createDTMFSender(localStream.getAudioTracks()[0])
});
session.on("ended",function(){
//the call has ended
});
session.on("failed",function(){
// unable to establish the call
});
session.on('addstream', function(e){
console.log('!!!!!!!!!!')
console.log('addstream', e.stream)
// set remote audio stream (to listen to remote audio)
// remoteAudio is <audio> element on page
document.getElementById('remoteAudio').src = window.URL.createObjectURL(e.stream);
document.getElementById('remoteAudio').play();
});
//play a DTMF tone (session has method `sendDTMF` too but it doesn't work with Catapult server right)
dtmfSender.insertDTMF("1");
dtmfSender.insertDTMF("#");
//mute call
session.mute({audio: true});
//unmute call
session.unmute({audio: true});
//to hangup the call
session.terminate();
*/
/*
session.on("ended",function(){
console.log('End call');
});
session.on("failed",function(){
console.log('Error call')
});
session.on('addstream', function(e){
console.log('addstream')
const audioElement = document.createElement('audio');
audioElement.srcObject = e.stream;
audioElement.play();
document.body.appendChild(audioElement);
// set remote audio stream (to listen to remote audio)
// remoteAudio is <audio> element on page
document.getElementById('remoteAudio').src = window.URL.createObjectURL(e.stream);
document.getElementById('remoteAudio').play();
});
session.answer({
mediaConstraints: {
audio: true,
video: false
},
});
//to hangup the call
//session.terminate();
*/
})
// Астер нас соединил с абонентом
session.on('connecting', () => {
console.log("UA session connecting");
playSound("ringback.ogg", true);
// Тут мы подключаемся к микрофону и цепляем к нему поток, который пойдёт в астер
let peerconnection = session.connection;
let localStream = peerconnection.getLocalStreams()[0];
// Handle local stream
if (localStream) {
// Clone local stream
_localClonedStream = localStream.clone();
console.log('UA set local stream');
let localAudioControl = document.getElementById("localAudio");
localAudioControl.srcObject = _localClonedStream;
localAudioControl.play()
console.log(_localClonedStream)
}
// Как только астер отдаст нам поток абонента, мы его засунем к себе в наушники
peerconnection.addEventListener('addstream', (event) => {
console.log("UA session addstream");
let remoteAudioControl = document.getElementById("remoteAudio");
remoteAudioControl.srcObject = event.stream;
remoteAudioControl.play()
});
})
// В процессе дозвона
session.on('progress', (data) => {
console.log("UA session progress");
playSound("ringback.ogg", true);
});
// Дозвон завершился неудачно, например, абонент сбросил звонок
session.on('failed', (data) => {
console.log("UA session failed");
stopSound("ringback.ogg");
playSound("rejected.mp3", false);
})
// Поговорили, разбежались
session.on('ended', () => {
console.log("UA session ended");
playSound("rejected.mp3", false);
JsSIP.Utils.closeMediaStream(_localClonedStream);
})
// Звонок принят, моно начинать говорить
session.on('accepted', () => {
console.log("UA session accepted");
stopSound("ringback.ogg");
playSound("answered.mp3", false);
})
// Завершает звонок
document.getElementById('endCall').addEventListener('click', () => {
session.terminate()
});
}
function playSound(soundName, loop) {
const sounds = document.getElementById("sounds")
sounds.pause();
sounds.currentTime = 0.0;
sounds.src = "http://localhost/sounds/" + soundName
sounds.loop = loop;
sounds.play();
}
function stopSound() {
const sounds = document.getElementById("sounds")
sounds.pause();
sounds.currentTime = 0.0;
}