- PVSM.RU - https://www.pvsm.ru -
Сегодня я раскажу про модуль Hardware в Voximplant Web SDK. Этот модуль пришел на смену старой системе управления аудио- и видеоустройствами. Но сначала – немного об управлении устройствами в WebRTC-стеке и зачем все это нужно.
Редко, но у конечных пользователей бывает несколько микрофонов. Или бывает несколько динамиков: например обычные динамики и bluetooth-наушники; или динамик телефона и громкая связь для смартфона.
А вот две камеры в современном мире бывают очень часто. На планшетах и телефонах: обычная и фронтальная. На ноутбуках: встроенная и получше внешняя. И так далее и тому подобное. Пользователь может сильно растроиться, если по дефолту будет выбран не тот набор устройств и он никак не сможет их изменить. Это первое применение управлению медиа в WebRTC.
Второе применение — это тонкие настройки аудио и видео. Всякие эхоподавления, шумоподавления, установка разрешения видео, фреймрейта, баланс белого и прочего, что конкретно ваш браузер поддерживает.
Раньше для управлениями устройствами мы предоставляли интерфейс constraints и разработчику нужно было прописывать все ограничения и параметры запроса медиа самостоятельно. Вот небольшой пример полностью настроенного запроса аудио и видео:
const myConstraints = {
audio:{
sampleSize: 16,
channelCount: 2,
noiseSuppression: true,
echoCancellation: false
},
video:{
width: { min: 640, ideal: 1920, max: 1920 },
height: { min: 400, ideal: 1080 },
aspectRatio: 1.777777778,
frameRate: { max: 30 },
facingMode: { exact: "user" }
}
};
Это дает неимоверную гибкость при настройке аудио и видео, однако всегда есть «НО». Как показала статистика опроса поддержки, клиенты в основном не пользовались этой опцией, так как мы дружелюбная платформа и сами приучаем пользователей к простоте. Те же, кто рискнул использовать это, нередко отстреливали себе все чуть выше колена, так как браузеры имеют в этой точке пространства легкую несовместимость.
Теперь ясно, как мы дошли до жизни такой. Пора перейти к делу: бегло осмотрим модуль; для детального прочтения я оставлю ссылку на документацию на нашем сайте [1].
Входной точкой в этот модуль является StreamManager [2]. Исторически сложилось [картинка со слоном.jpg], что многие части нашего Web SDK — синглтонгы, и этот класс не исключение: получить инстанс можно при помощи функции get() [3]. Для этого есть море причин, но об этом в другой раз, пожалуй.
const streamManager = VoxImplant.Hardware.StreamManager.get();
С помощью StreamManager можно включить или выключить локальное видео и
получить медиастримы для него – по сути, это всё. Входная точка не очень большая, если смотреть на внешние интерфейсы.
(async () => {
try{
console.log('[WebSDK] Включаем локальное видео');
await streamManager.showLocalVideo();
console.log('[WebSDK] Выключаем локальное видео');
await streamManager.hideLocalVideo();
console.log('[WebSDK] Операция по подмигиванию диодом успешно завершена!');
} catch(e){
console.log('[WebSDK] Что-то пошло не так. Возможно, никакой камеры не существует?!');
console.error(e);
}
})();
Интересный факт о локальном видео: локальное видео никак не передается собеседнику. Например, пользователю можно показать картинку в HD, а передавать 320*240 или наоборот, если локальное видео прячется в углу. Чуть ниже будет о том, как провернуть такой фокус.
В StreamManager есть 3 события:
Функцией getLocalMediaRenderers() [7] полезно получать ссылки на DOM-элементы с локальным видео, если вы не сохранили объект себе.
streamManager.getLocalMediaRenderers().forEach(renderer => {
cont elementOfDOM = renderer.element;
elementOfDOM.addEventListener('on42',doSomething,true);
});
Перейдем к настройкам видео (самое вкусное, следите за руками). Внезапно CameraManager [8]. Опять же, синглтон со скучной функцией get() [9]:
const cameraManager= VoxImplant.Hardware.CameraManager.get();
Какие настройки мы вообще можем установить? Давайте посмотрим на интерфейс CameraParams [10]:
const allMyDevices = await cameraManager.CameraManager.getInputDevices();
Еще 3 опции отвечают за размер видео:
Вернемся к CameraManager и применим настройки! Внутри есть 2 геттера и 2 сеттера настроек:
Все что с «Default» — настройки «по умолчанию», как не трудно догадаться. Они будут использоваться для получения локального видео, для новых входящих и исходящих звонков.
А теперь обещаный фокус:
console.log('[WebSDK] Позволим пользователю почувствовать легкую ностальгию без вреда для окружающих.');
await cameraManager.setDefaultVideoSettings({
frameWidth:320,
frameHeight:240,
frameRate:12
});
await streamManager.showLocalVideo();
cameraManager.setDefaultVideoSettings({
frameWidth:640,
frameHeight:480,
frameRate:25
});
const newCall = client.call('mySchoolFriendBoris');
Пара с Call в названии немного сложнее. Эти функции созданы, чтобы получать и устанавливать настройки в процессе звонка, который уже идет. При изменении настроек, возникнет событие CallEvents.Updated [24].
console.log('[WebSDK] Теперь очередь для ностальгии у Бориса.');
cameraManager.setCallVideoSettings(newCall,{
frameWidth:320,
frameHeight:240,
frameRate:12
});
newCall.on(VoxImplant.CallEvents.Updated,e => {
console.log('[WebSDK] Ностальгия Борису успешно доставлена.');
});
Осталось две функции CameraManager. Очень мощные, но сложные. В enum VideoQuality есть три интересных значения:
Закономерный вопрос: «Игорь! Если Web SDK знает лучшее, худшее и среднее качество, то почему нет метода для получения списка поддерживаемых веб-камерой разрешений?!» Цимес в том, что не знает.
И для того, чтобы узнать, нужно буквально перебрать все возможные разрешения. Что удалось получить — поддерживаются. Звучит довольно просто, но на деле это занимает до нескольких минут. Поэтому мы не можем сделать это в инициализации WebSDK, например. Чтобы вы могли сделать это в момент, максимально комфортный для пользователя – если вообще захотите это делать – и существует testResolutions [25]. Результат работы функции неплохо было бы сохранить в localStorage и позже грузить через loadResolutionTestResult [26] при перезагрузке страницы:
console.log('[WebSDK] Откинтесь на спинку кресла и отдохните, пока WebSDK опрашивает вашу камеру.');
const testResults = await cameraManager.testResolutions();
localStorage.setItem('defaultCameraResolutionTestResults',JSON.stringify(testResolutions));
И последнее по списку, но самое популярное: AudioDeviceManager [27]. Класс очень сильно похож на CameraManager. Только для звука свои настройки отражены в интерфейсе AudioParams [28]:
Автор: irbisadm
Источник [37]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/290634
Ссылки в тексте:
[1] документацию на нашем сайте: https://voximplant.com/docs/references/websdk/voximplant/hardware
[2] StreamManager: https://voximplant.com/docs/references/websdk/voximplant/hardware/streammanager
[3] get(): https://voximplant.com/docs/references/websdk/voximplant/hardware/streammanager#get
[4] DevicesUpdated: https://voximplant.com/docs/references/websdk/voximplant/hardware/hardwareevents#devicesupdated
[5] MediaRendererAdded: https://voximplant.com/docs/references/websdk/voximplant/hardware/hardwareevents#mediarendereradded
[6] MediaRendererRemoved: https://voximplant.com/docs/references/websdk/voximplant/hardware/hardwareevents#mediarendererremoved
[7] getLocalMediaRenderers(): https://voximplant.com/docs/references/websdk/voximplant/hardware/streammanager#getlocalmediarenderers
[8] CameraManager: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager
[9] get(): https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#get
[10] CameraParams: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams
[11] strict: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#strict
[12] cameraId: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#cameraid
[13] getInputDevices(): https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#getinputdevices
[14] frameRate: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#framerate
[15] facingMode: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#facingmode
[16] videoQuality: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#videoquality
[17] VideoQuality: https://voximplant.com/docs/references/websdk/voximplant/hardware/videoquality
[18] frameHeight: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#frameheight
[19] frameWidth: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameraparams#framewidth
[20] getDefaultVideoSettings: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#getdefaultvideosettings
[21] getCallVideoSettings: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#getcallvideosettings
[22] setDefaultVideoSettings: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#setdefaultvideosettings
[23] setCallVideoSettings: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#setcallvideosettings
[24] CallEvents.Updated: https://voximplant.com/docs/references/websdk/voximplant/callevents#updated
[25] testResolutions: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#testresolutions
[26] loadResolutionTestResult: https://voximplant.com/docs/references/websdk/voximplant/hardware/cameramanager#loadresolutiontestresult
[27] AudioDeviceManager: https://voximplant.com/docs/references/websdk/voximplant/hardware/audiodevicemanager
[28] AudioParams: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams
[29] strict: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#strict
[30] inputId: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#inputid
[31] AudioDeviceManager.getInputDevices: https://voximplant.com/docs/references/websdk/voximplant/hardware/audiodevicemanager#getinputdevices
[32] outputId: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#outputid
[33] getOutputDevices: https://voximplant.com/docs/references/websdk/voximplant/hardware/audiodevicemanager#getoutputdevices
[34] noiseSuppression: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#noisesuppression
[35] echoCancellation: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#echocancellation
[36] autoGainControl: https://voximplant.com/docs/references/websdk/voximplant/hardware/audioparams#autogaincontrol
[37] Источник: https://habr.com/post/421481/?utm_campaign=421481
Нажмите здесь для печати.