@denis-chenykh

Почему не передается звук в jssip?

Вот весь код связанный с 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;
}
  • Вопрос задан
  • 245 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы