Перейти к содержанию

config.js - конфигурация комнаты и доступ к локальному медиа

В модуль config.js  вынесены функции для конфигурации комнаты и доступа к локальным медиа устройствам в соответствии с файлом конфигурации. Пример файла конфигурации:

{
  "room": {
    "url": "ws://127.0.0.1:8080",
    "name": "ROOM1",
    "pin": "1234",
    "nickName": "User1"
  },
  "media": {
    "audio": {
      "tracks": [{
        "source": "mic",
        "channels": 2
      }]
    },
    "video": {
      "tracks": [
        {
          "source": "camera",
          "width": 1280,
          "height": 720,
          "codec": "H264",
          "constraints": {
            "frameRate": 25
          },
          "encodings": [
            { "rid": "720p", "active": true, "maxBitrate": 900000 },
            { "rid": "360p", "active": true, "maxBitrate": 500000, "scaleResolutionDownBy": 2 },
            { "rid": "180p", "active": true, "maxBitrate": 200000, "scaleResolutionDownBy": 4 }
          ]
        }        
      ]
    }
  }
}

Анализ исходного кода

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

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

getRoomConfig() code

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

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

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

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. Получение доступа к медиа устройствам в соответствии с заданными ограничениями

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

getMedia() code

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

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

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

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;
}