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