viksnamax
@viksnamax
Aliens is here!

Как перезапустить захват экрана в уже созданной сессии (WebRTC)?

Если владелец комнаты включает демонстрацию экрана до подключения гостей к комнате, тогда всё работает нормально и демонстрация владельца отображается у гостей, но если включить демонстрацию когда в комнате уже находятся гости, тогда демонстрация отображается только у владельца.
Поскольку использую библиотеку RTCMultiConnection, там есть демо версия именно демонстрации экрана(source code) и демонстрация экрана с веб-камерой (source code), у меня демки не работаю, смотрел код демок, там мало что понятно, пытался интегрировать в свой код, не заработало, вообще, никак. Смотрел в issues на GitHub, там нету схожей проблемы (посмотрел почти все проблемы связанные с screen share).
Событие onstream со стороны гостя не реагирует на включение демонстрации.

Запуск демонстрации:
screenShareOn() {
        let thisAdminVC = this.getInstance();

        this.connection.addStream({
            screen: true,
            oneway: true,
            data: true,
            streamCallback: function(stream) {
                thisAdminVC.connection.extra.streamID = stream.id;

                thisAdminVC.connection.updateExtraData();
                thisAdminVC.videoContainerLocal.screen.elementHTML.appendChild(stream);

                const videoTrack = stream.getVideoTracks()[1];
                videoTrack.onended = () => {
                    thisAdminVC.connection.resetTrack();
                }

                thisAdminVC.connection.getAllParticipants().forEach( participant =>
                    thisAdminVC.connection.replaceTrack(videoTrack, participant, true)
                );
            }
        });
     
        this.connection.renegotiate();
}


Выключение демонстрации:
screenShareOff() {
        this.connection.attachStreams.forEach(function(stream) {
            if (stream.idInstance.indexOf("isScreen") != -1) {
                stream.getTracks().forEach(track => track.stop());
                stream.getTracks().forEach(track => stream.removeTrack(track));
            }
        });
}
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
viksnamax
@viksnamax Автор вопроса
Aliens is here!
Вообщем, я нашёл для себя только такое рабочее решение, не знаю насколько оно правильное. Для того что бы при перезапуске screen share владельца комнаты у гостя тоже была видно, необходимо созданный stream скопировать во временную переменную, вставить временный stream, тогда всё работает и массив connection.streamEvents и connection.attachStream не переполняются.
screenShareOn() {

        let thisAdminVC = this.getInstance();

        this.connection.addStream({
            screen: true,
            oneway: true,
            data: true,
            streamCallback: function(stream) {

                for (let i = 0; i < thisAdminVC.connection.attachStreams.length; i++) {
                    if (thisAdminVC.connection.attachStreams[i].idInstance.indexOf("isScreen") != -1) {

                        let tmpStreamID = thisAdminVC.connection.attachStreams[i].id,
                        tmpStream = thisAdminVC.connection.streamEvents[tmpStreamID].stream;

                        thisAdminVC.connection.addStream(tmpStream);

                        thisAdminVC.connection.renegotiate();
                    }
                }

                thisAdminVC.connection.extra.streamID = stream.id;

                thisAdminVC.connection.updateExtraData();
                thisAdminVC.videoContainerLocal.screen.elementHTML.appendChild(tmpStream);                
            }
        });
        this.connection.renegotiate();
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы