Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Для анализа исходного кода возьмем версию модуля config.js, которая находится здесь и доступна в сборке 1.0.1.36

1. Получение конфигурации комнаты

getRoomConfig() code

Code Block
languagejs
themeRDark
const getRoomConfig = function(config) {
    let roomConfig = {
        url: config.url || "ws://127.0.0.1:8080",
        roomName: config.name || "ROOM1",
        pin: config.pin || "1234",
        nickname: config.nickName || "User1"        
    };
    return roomConfig;
}

2. Получение списка видео потоков с доступом к локальным медиа устройствам

getVideoStreams() code

Code Block
languagejs
themeRDark
const getVideoStreams = async function(config) {
    let streams = [];
    if (config.media && config.media.video && config.media.video.tracks) {
        streams = await getStreams(config.media.video.tracks);
    }
    return streams;
}

3. Получение списка аудио потоков с доступом к локальным медиа устройствам

getAudioStreams) code

Code Block
languagejs
themeRDark
const getAudioStreams = async function(config) {
    let streams = [];
    if (config.media && config.media.audio && config.media.audio.tracks) {
        streams = await getStreams(config.media.audio.tracks);
    }
    return streams;
}

4. Получение доступа к медиа устройствам и добавление потока в список

getStreams() code

Code Block
languagejs
themeRDark
const getStreams = async function(tracks) {
    let streams = [];
    for (let track of tracks) {
        let stream = await getMedia(track);
        if (stream) {
            streams.push({
                stream: stream,
                encodings: track.encodings,
                source: track.source
            });
        }
    }
    return streams;
}

...

5.1. Настройка ограничений аудио

getMedia() code

Code Block
languagejs
themeRDark
const getMedia = async function(track) {
    //convert to constraints
    ...
    const constraints= {};
    if (track.source === "mic") {
        //audio
        constraints.audio = {};
        if (track.constraints) {
            constraints.audio = track.constraints;
        }
        if (track.channels && track.channels === 2) {
            constraints.audio.echoCancellation = false;
            constraints.audio.googEchoCancellation = false;
        }
    } else if (track.source === "camera") {
        ...
    } else if (track.source === "screen") {
        ...
    }
    ...
    return stream;
}

5.2. Настройка ограничений видео

getMedia() code

Code Block
languagejs
themeRDark
const getMedia = async function(track) {
    //convert to constraints
    ...
    const constraints= {};
    if (track.source === "mic") {
        ...
    } else if (track.source === "camera") {
        constraints.video = {};
        if (track.constraints) {
            constraints.video = track.constraints;
        }
        constraints.video.width = track.width;
        constraints.video.height = track.height;
    } else if (track.source === "screen") {
        ...
    }
    ...
    return stream;
}

5.3. Настройка ограничений для захвата экрана

getMedia() code

Code Block
languagejs
themeRDark
const getMedia = async function(track) {
    //convert to constraints
    let screen = false;
    const constraints= {};
    if (track.source === "mic") {
        ...
    } else if (track.source === "camera") {
        ...
    } else if (track.source === "screen") {
        constraints.video = {};
        if (track.constraints) {
            constraints.video = track.constraints;
        }
        constraints.video.width = track.width;
        constraints.video.height = track.height;
        screen = true;
    }
    ...
    return stream;
}

5.4. Получение доступа к локальным медиа устройствам

getMedia() code

Code Block
languagejs
themeRDark
const getMedia = async function(track) {
    //convert to constraints
    let screen = false;
    const constraints= {};
    if (track.source === "mic") {
        ...
    } else if (track.source === "camera") {
        ...
    } else if (track.source === "screen") {
        ...
        screen = true;
    }

    //get access to a/v
    let stream;
    if (screen) {
        stream = await navigator.mediaDevices.getDisplayMedia(constraints);
    } else {
        stream = await navigator.mediaDevices.getUserMedia(constraints);
    }
    return stream;
}

...