Ошибка переключения экрана и трансляции видео в агоре - PullRequest
0 голосов
/ 05 мая 2020

Итак, я работал над проектом, который использует веб-SDK от Агоры. Я в основном хочу беспрепятственно переключаться между демонстрацией экрана и трансляцией видео, аудио используется в обоих случаях.

Вот что я закодировал:

const localPlay = {
    screen: {
        playing: false,
        initialised: false
    },
    video: {
        playing: false,
        initialised: false
    }
};


// Initialise two clients and two streams, with the following stream specs
 const screenStreamSpec = {
                streamID: uid,
                audio: false,
                video: false,
                screen: true,
            };

const videoStreamSpec = {
                streamID: uid,
                audio: true,
                video: true,
                screen: false,
            };

// ...

document.getElementById("Screen-share").addEventListener("click", function() {

    if(!localPlay.screen.initialised) {
        return
    } else {
        if(!localPlay.screen.playing && !localPlay.video.playing) {
            screenStream.play("Screen");
            rtc.client.screenClient.publish(screenStream);
            localPlay.screen.playing = true;                        
            return;
        }

        if(localPlay.screen.playing) {
            return;
        }

        videoStream.stop();
        localPlay.screen.playing = false;
        screenStream.play("Screen");
        localPlay.video.playing = true;

        let newTrack = videoStream.getVideoTrack();
        screenStream.replaceTrack(newTrack);
    }
});


document.getElementById("Video-share").addEventListener("click", function() {

    if(!localPlay.video.initialised) {
        return
    } else {
        if(!localPlay.video.playing && !localPlay.screen.playing) {
            videoStream.play("Screen");
            rtc.client.videoClient.publish(videoStream);
            localPlay.video.playing = true;
            return;
        }

        if(localPlay.video.playing) {
            return;
        }

        screenStream.stop();
        localPlay.video.playing = false;
        videoStream.play("Screen");
        localPlay.screen.playing = true;

        let newTrack = screenStream.getVideoTrack();
        videoStream.replaceTrack(newTrack);
    }
});

Код соответствует это (решение 3).

Ошибка в том, что при первой попытке сделать то и другое они работают. Но, скажем, если я начал с совместного использования экрана и переключился на видеотрансляцию, камера выключится, совместное использование экрана отключится, а экран, который я показывал, поворачивается и отображается в div Screen. Если я попытаюсь переключиться еще раз, div станет полностью черным.

Где я ошибся?

1 Ответ

0 голосов
/ 09 мая 2020

Вам действительно не следует использовать заменяющую дорожку, поскольку она не поддерживается всеми браузерами и является относительно новой функцией.

Для более стабильного решения я бы предложил использовать 2 клиента, один для камеры и отдельный для совместного использования экрана. У меня есть пример: https://github.com/digitallysavvy/group-video-chat

Если вы хотите быстро переключаться между ними, вы можете использовать события muteVideo для переключения между потоками.

...