electron-webrtc iceServers вказати сервер Turn


0

У своєму main.js у мене є обробка веб-сокетів нових з'єднань, що відкриває нове вікно браузера, завантажуючи мій rendering.js, який використовує desktopCapturer для обробки потоку та налаштування з'єднання webrtc.

Мені потрібно використовувати сервер повороту, але я не впевнений, як визначити це як спроби поки що не вдалися. Додаток буде побудовано за допомогою докера, а відкриття 10-портових udp-портів або перехід на хост-мережу недоцільно.

Я спробував визначити сервер повороту, як

myPeerConnection = new RTCPeerConnection({
  iceServers: [
    {
      urls: ["turns:turnserver.example.org", "turn:turnserver.example.org"],
      username: "webrtc",
      credential: "turnpassword"
    }
  ]
});

renderer.js

const {desktopCapturer} = require('electron')
const EventEmitter = require('events');
const {ipcRenderer} = require('electron')
const fs = require('fs')
var socketId = null;
var windowId = null;
var otherConfig;
var windowStreamer;
socketId = require('electron').remote.getCurrentWindow().getTitle();
windowId = socketId;

class WindowStreamer extends EventEmitter {
    constructor(windowId) {
        super();    
        this.offerOptions = {
            offerToReceiveAudio: 1,
            offerToReceiveVideo: 1
        }
        this.peer = new RTCPeerConnection(null); // This is where I think I should define the turn server??? but it did not work.
        this.sdp = null;
        this.icecandidates = [];
        let that = this;
        desktopCapturer.getSources({types: ['window', 'screen']}, (error, sources) => {
            if (error) {
                throw error
            } else {
                for (let i = 0; i < sources.length; ++i) {
                    if (sources[i].name === windowId) {
                        navigator.mediaDevices.getUserMedia({
                            audio: false,                  
                            video: {
                                mandatory: {
                                    chromeMediaSource: 'desktop',
                                    chromeMediaSourceId: sources[i].id,
                                    minWidth: 800,
                                    maxWidth: 1921,
                                    minHeight: 600,
                                    maxHeight: 1081
                                }
                            }
                        })
                        .then(stream => that.handleStream(stream))
                        .catch(e => ipcRenderer.send('async',JSON.stringify("Error while trying to access window " + windowId + " video source. " + e)))
                    }
                }
            }
        })
    }
    handleStream(stream) {
        this.peer.addStream(stream);
        this.peer.onicecandidate = e => this.icecandidates.push(e.candidate);
        let that = this;
        this.peer.createOffer(this.offerOptions).then(desc=> {
            that.sdp = desc;
            that.peer.setLocalDescription(desc);
            setTimeout(that.monitorGatheringState, 100);
        }, e => ipcRenderer.send('async',JSON.stringify("Error while creating RTC offer: " + e)));
    }
    setClientConfig (config) {
        config = JSON.parse(config);
        let that = this;
        this.peer.setRemoteDescription(config.sdp);
        config.icecandidates.forEach(candidate => {
            if(candidate != null || candidate != undefined) {
                let rtcicecandidate = new RTCIceCandidate(candidate);
                that.peer.addIceCandidate(rtcicecandidate)
                .then(s => {}, e => ipcRenderer.send('async', JSON.stringify('Error whileadding RTCIceCandidate ' + e)))

            }
        })
        let message = { 
            socketId: socketId
        }
    }
    monitorGatheringState() {
        if(windowStreamer.peer.iceGatheringState == "complete") {
            windowStreamer.emit("ice-gathering-completed", windowStreamer.sdp, windowStreamer.icecandidates);
            let message = { 
                socketId: socketId,
                config: {
                    sdp: windowStreamer.sdp, 
                    icecandidates: windowStreamer.icecandidates
                }
            }
        } else {
            setTimeout(windowStreamer.monitorGatheringState, 100);
        }
    }
}

ipcRenderer.on('client-webrtc-config', (event, data) => {
    otherConfig = data;
    windowStreamer.setClientConfig(otherConfig);
})

windowStreamer = new WindowStreamer(windowId);

Як я можу визначити свій сервер TURN?


Схоже, ви могли створити кілька облікових записів випадково. Перегляньте наш посібник зі з’єднання ваших облікових записів, щоб вирішити цю проблему: superuser.com/help/merging-accounts
music2myear
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.