From d1ffe6cd439266e973fe82580ed882b864507a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Fri, 22 May 2020 00:20:15 +0200 Subject: [PATCH] Adding frame rate option to videos. Make resolution and frame rate of screen sharing configurable. --- app/public/config/config.example.js | 23 +- app/src/RoomClient.js | 237 ++++++++++-------- app/src/actions/settingsActions.js | 18 ++ app/src/components/Containers/Me.js | 4 +- .../components/Controls/ButtonControlBar.js | 2 +- app/src/components/Settings/MediaSettings.js | 84 +++++++ app/src/reducers/settings.js | 66 +++-- app/src/translations/cn.json | 3 + app/src/translations/cs.json | 3 + app/src/translations/de.json | 3 + app/src/translations/dk.json | 3 + app/src/translations/el.json | 3 + app/src/translations/en.json | 3 + app/src/translations/es.json | 3 + app/src/translations/fr.json | 3 + app/src/translations/hr.json | 3 + app/src/translations/hu.json | 3 + app/src/translations/it.json | 3 + app/src/translations/lv.json | 3 + app/src/translations/nb.json | 3 + app/src/translations/pl.json | 3 + app/src/translations/pt.json | 3 + app/src/translations/ro.json | 3 + app/src/translations/tr.json | 3 + app/src/translations/tw.json | 3 + app/src/translations/uk.json | 3 + 26 files changed, 361 insertions(+), 130 deletions(-) diff --git a/app/public/config/config.example.js b/app/public/config/config.example.js index a1dd008..61fb774 100644 --- a/app/public/config/config.example.js +++ b/app/public/config/config.example.js @@ -27,20 +27,33 @@ var config = }, /** - * If defaultResolution is set, it will override user settings when joining: + * Resolutions: + * * low ~ 320x240 * medium ~ 640x480 * high ~ 1280x720 * veryhigh ~ 1920x1080 * ultra ~ 3840x2560 + * **/ - defaultResolution : 'medium', + + /** + * Frame rates: + * + * 1, 5, 10, 15, 20, 25, 30 + * + **/ + + defaultResolution : 'medium', + defaultFrameRate : 15, + defaultScreenResolution : 'veryhigh', + defaultScreenSharingFrameRate : 5, // Enable or disable simulcast for webcam video - simulcast : true, + simulcast : true, // Enable or disable simulcast for screen sharing video - simulcastSharing : false, + simulcastSharing : false, // Simulcast encoding layers and levels - simulcastEncodings : + simulcastEncodings : [ { scaleResolutionDownBy: 4 }, { scaleResolutionDownBy: 2 }, diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index f112863..99032fc 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1192,17 +1192,19 @@ export default class RoomClient sampleSize } = store.getState().settings; - if (restart || !this._micProducer) + if (restart) { this.disconnectLocalHark(); + store.dispatch(settingsActions.setSelectedAudioDevice(deviceId)); + if (this._micProducer) await this.disableMic(); const stream = await navigator.mediaDevices.getUserMedia( { audio : { - deviceId : { ideal: device.deviceId }, + deviceId : { ideal: deviceId }, sampleRate, channelCount, volume, @@ -1264,7 +1266,7 @@ export default class RoomClient this.connectLocalHark(track); } - else + else if (this._micProducer) { ({ track } = this._micProducer); @@ -1318,13 +1320,19 @@ export default class RoomClient store.dispatch(meActions.setAudioInProgress(false)); } - async updateWebcam({ restart = false, newDeviceId = null, newResolution = null } = {}) + async updateWebcam({ + restart = false, + newDeviceId = null, + newResolution = null, + newFrameRate = null + } = {}) { logger.debug( - 'updateWebcam() [restart:"%s", newDeviceId:"%s", newResolution:"%s"]', + 'updateWebcam() [restart:"%s", newDeviceId:"%s", newResolution:"%s", newFrameRate:"%s"]', restart, newDeviceId, - newResolution + newResolution, + newFrameRate ); let track; @@ -1343,6 +1351,9 @@ export default class RoomClient if (newResolution) store.dispatch(settingsActions.setVideoResolution(newResolution)); + if (newFrameRate) + store.dispatch(settingsActions.setVideoFrameRate(newFrameRate)); + store.dispatch(meActions.setWebcamInProgress(true)); const deviceId = await this._getWebcamDeviceId(); @@ -1351,10 +1362,15 @@ export default class RoomClient if (!device) throw new Error('no webcam devices'); - const { resolution } = store.getState().settings; + const { + resolution, + frameRate + } = store.getState().settings; - if (restart || !this._webcamProducer) + if (restart) { + store.dispatch(settingsActions.setSelectedWebcamDevice(deviceId)); + if (this._webcamProducer) await this.disableWebcam(); @@ -1362,8 +1378,9 @@ export default class RoomClient { video : { - deviceId : { ideal: device.deviceId }, - ...VIDEO_CONSTRAINS[resolution] + deviceId : { ideal: deviceId }, + ...VIDEO_CONSTRAINS[resolution], + frameRate } }); @@ -1441,13 +1458,14 @@ export default class RoomClient this.disableWebcam(); }); } - else + else if (this._webcamProducer) { ({ track } = this._webcamProducer); await track.applyConstraints( { - ...VIDEO_CONSTRAINS[resolution] + ...VIDEO_CONSTRAINS[resolution], + frameRate } ); @@ -1458,13 +1476,12 @@ export default class RoomClient await track.applyConstraints( { - ...VIDEO_CONSTRAINS[resolution] + ...VIDEO_CONSTRAINS[resolution], + frameRate } ); } } - - await this._updateWebcams(); } catch (error) { @@ -3559,24 +3576,16 @@ export default class RoomClient store.dispatch(meActions.setAudioInProgress(false)); } - async enableScreenSharing() + async updateScreenSharing({ + restart = false, + newResolution = null, + newFrameRate = null + } = {}) { - logger.debug('enableScreenSharing()'); - - if (this._screenSharingProducer) - return; - - if (!this._mediasoupDevice.canProduce('video')) - { - logger.error('enableScreenSharing() | cannot produce video'); - - return; - } + logger.debug('updateScreenSharing() [restart:"%s"]', restart); let track; - store.dispatch(meActions.setScreenShareInProgress(true)); - try { const available = this._screenSharing.isScreenShareAvailable(); @@ -3584,100 +3593,126 @@ export default class RoomClient if (!available) throw new Error('screen sharing not available'); - const stream = await this._screenSharing.start({ - width : 1920, - height : 1080, - frameRate : 5 - }); + if (!this._mediasoupDevice.canProduce('video')) + throw new Error('cannot produce video'); - ([ track ] = stream.getVideoTracks()); + if (newResolution) + store.dispatch(settingsActions.setScreenSharingResolution(newResolution)); - if (this._useSharingSimulcast) + if (newFrameRate) + store.dispatch(settingsActions.setScreenSharingFrameRate(newFrameRate)); + + store.dispatch(meActions.setScreenShareInProgress(true)); + + const { + screenSharingResolution, + screenSharingFrameRate + } = store.getState().settings; + + if (restart) { - // If VP9 is the only available video codec then use SVC. - const firstVideoCodec = this._mediasoupDevice - .rtpCapabilities - .codecs - .find((c) => c.kind === 'video'); + const stream = await this._screenSharing.start({ + ...VIDEO_CONSTRAINS[screenSharingResolution], + frameRate : screenSharingFrameRate + }); - let encodings; + ([ track ] = stream.getVideoTracks()); - if (firstVideoCodec.mimeType.toLowerCase() === 'video/vp9') + if (this._useSharingSimulcast) { - encodings = VIDEO_SVC_ENCODINGS; - } - else if ('simulcastEncodings' in window.config) - { - encodings = window.config.simulcastEncodings - .map((encoding) => ({ ...encoding, dtx: true })); + // If VP9 is the only available video codec then use SVC. + const firstVideoCodec = this._mediasoupDevice + .rtpCapabilities + .codecs + .find((c) => c.kind === 'video'); + + let encodings; + + if (firstVideoCodec.mimeType.toLowerCase() === 'video/vp9') + { + encodings = VIDEO_SVC_ENCODINGS; + } + else if ('simulcastEncodings' in window.config) + { + encodings = window.config.simulcastEncodings + .map((encoding) => ({ ...encoding, dtx: true })); + } + else + { + encodings = VIDEO_SIMULCAST_ENCODINGS + .map((encoding) => ({ ...encoding, dtx: true })); + } + + this._screenSharingProducer = await this._sendTransport.produce( + { + track, + encodings, + codecOptions : + { + videoGoogleStartBitrate : 1000 + }, + appData : + { + source : 'screen' + } + }); } else { - encodings = VIDEO_SIMULCAST_ENCODINGS - .map((encoding) => ({ ...encoding, dtx: true })); - } - - this._screenSharingProducer = await this._sendTransport.produce( - { + this._screenSharingProducer = await this._sendTransport.produce({ track, - encodings, - codecOptions : - { - videoGoogleStartBitrate : 1000 - }, appData : { source : 'screen' } }); - } - else - { - this._screenSharingProducer = await this._sendTransport.produce({ - track, - appData : + } + + store.dispatch(producerActions.addProducer( { - source : 'screen' - } - }); - } - - store.dispatch(producerActions.addProducer( - { - id : this._screenSharingProducer.id, - deviceLabel : 'screen', - source : 'screen', - paused : this._screenSharingProducer.paused, - track : this._screenSharingProducer.track, - rtpParameters : this._screenSharingProducer.rtpParameters, - codec : this._screenSharingProducer.rtpParameters.codecs[0].mimeType.split('/')[1] - })); - - this._screenSharingProducer.on('transportclose', () => - { - this._screenSharingProducer = null; - }); - - this._screenSharingProducer.on('trackended', () => - { - store.dispatch(requestActions.notify( - { - type : 'error', - text : intl.formatMessage({ - id : 'devices.screenSharingDisconnected', - defaultMessage : 'Screen sharing disconnected' - }) + id : this._screenSharingProducer.id, + deviceLabel : 'screen', + source : 'screen', + paused : this._screenSharingProducer.paused, + track : this._screenSharingProducer.track, + rtpParameters : this._screenSharingProducer.rtpParameters, + codec : this._screenSharingProducer.rtpParameters.codecs[0].mimeType.split('/')[1] })); - this.disableScreenSharing() - .catch(() => {}); - }); + this._screenSharingProducer.on('transportclose', () => + { + this._screenSharingProducer = null; + }); - logger.debug('enableScreenSharing() succeeded'); + this._screenSharingProducer.on('trackended', () => + { + store.dispatch(requestActions.notify( + { + type : 'error', + text : intl.formatMessage({ + id : 'devices.screenSharingDisconnected', + defaultMessage : 'Screen sharing disconnected' + }) + })); + + this.disableScreenSharing(); + }); + } + else if (this._screenSharingProducer) + { + ({ track } = this._screenSharingProducer); + + await track.applyConstraints( + { + ...VIDEO_CONSTRAINS[screenSharingResolution], + frameRate : screenSharingFrameRate + } + ); + } } catch (error) { - logger.error('enableScreenSharing() [error:"%o"]', error); + logger.error('updateScreenSharing() [error:"%o"]', error); store.dispatch(requestActions.notify( { diff --git a/app/src/actions/settingsActions.js b/app/src/actions/settingsActions.js index 0a4d626..46be0e8 100644 --- a/app/src/actions/settingsActions.js +++ b/app/src/actions/settingsActions.js @@ -22,6 +22,24 @@ export const setVideoResolution = (resolution) => payload : { resolution } }); +export const setVideoFrameRate = (frameRate) => + ({ + type : 'SET_VIDEO_FRAME_RATE', + payload : { frameRate } + }); + +export const setScreenSharingResolution = (screenSharingResolution) => + ({ + type : 'SET_SCREEN_SHARING_RESOLUTION', + payload : { screenSharingResolution } + }); + +export const setScreenSharingFrameRate = (screenSharingFrameRate) => + ({ + type : 'SET_SCREEN_SHARING_FRAME_RATE', + payload : { screenSharingFrameRate } + }); + export const setDisplayName = (displayName) => ({ type : 'SET_DISPLAY_NAME', diff --git a/app/src/components/Containers/Me.js b/app/src/components/Containers/Me.js index 84f6387..450dd96 100644 --- a/app/src/components/Containers/Me.js +++ b/app/src/components/Containers/Me.js @@ -599,7 +599,7 @@ const Me = (props) => onClick={() => { if (screenState === 'off') - roomClient.enableScreenSharing(); + roomClient.updateScreenSharing({ restart: true }); else if (screenState === 'on') roomClient.disableScreenSharing(); }} @@ -631,7 +631,7 @@ const Me = (props) => onClick={() => { if (screenState === 'off') - roomClient.enableScreenSharing(); + roomClient.updateScreenSharing({ restart: true }); else if (screenState === 'on') roomClient.disableScreenSharing(); }} diff --git a/app/src/components/Controls/ButtonControlBar.js b/app/src/components/Controls/ButtonControlBar.js index f38e2fb..2ba9efa 100644 --- a/app/src/components/Controls/ButtonControlBar.js +++ b/app/src/components/Controls/ButtonControlBar.js @@ -243,7 +243,7 @@ const ButtonControlBar = (props) => onClick={() => { if (screenState === 'off') - roomClient.enableScreenSharing(); + roomClient.updateScreenSharing({ restart: true }); else if (screenState === 'on') roomClient.disableScreenSharing(); }} diff --git a/app/src/components/Settings/MediaSettings.js b/app/src/components/Settings/MediaSettings.js index 59da889..a41d14a 100644 --- a/app/src/components/Settings/MediaSettings.js +++ b/app/src/components/Settings/MediaSettings.js @@ -233,6 +233,90 @@ const MediaSettings = ({ /> + + + + + + + + + + + + + + + + + +
diff --git a/app/src/reducers/settings.js b/app/src/reducers/settings.js index fcd80d4..b148d8a 100644 --- a/app/src/reducers/settings.js +++ b/app/src/reducers/settings.js @@ -1,27 +1,30 @@ const initialState = { - displayName : 'Guest', - selectedWebcam : null, - selectedAudioDevice : null, - advancedMode : false, - sampleRate : 48000, - channelCount : 1, - volume : 1.0, - autoGainControl : false, - echoCancellation : true, - noiseSuppression : true, - voiceActivatedUnmute : false, - noiseThreshold : -50, - sampleSize : 16, + displayName : 'Guest', + selectedWebcam : null, + selectedAudioDevice : null, + advancedMode : false, + sampleRate : 48000, + channelCount : 1, + volume : 1.0, + autoGainControl : false, + echoCancellation : true, + noiseSuppression : true, + voiceActivatedUnmute : false, + noiseThreshold : -50, + sampleSize : 16, // low, medium, high, veryhigh, ultra - resolution : window.config.defaultResolution || 'medium', - lastN : 4, - permanentTopBar : true, - hiddenControls : false, - showNotifications : true, - notificationSounds : true, - buttonControlBar : window.config.buttonControlBar || false, - drawerOverlayed : window.config.drawerOverlayed || true, + resolution : window.config.defaultResolution || 'medium', + frameRate : window.config.defaultFrameRate || 15, + screenSharingResolution : window.config.defaultScreenResolution || 'veryhigh', + screenSharingFrameRate : window.config.defaultScreenSharingFrameRate || 5, + lastN : 4, + permanentTopBar : true, + hiddenControls : false, + showNotifications : true, + notificationSounds : true, + buttonControlBar : window.config.buttonControlBar || false, + drawerOverlayed : window.config.drawerOverlayed || true, ...window.config.defaultAudio }; @@ -184,6 +187,27 @@ const settings = (state = initialState, action) => return { ...state, resolution }; } + case 'SET_VIDEO_FRAME_RATE': + { + const { frameRate } = action.payload; + + return { ...state, frameRate }; + } + + case 'SET_SCREEN_SHARING_RESOLUTION': + { + const { screenSharingResolution } = action.payload; + + return { ...state, screenSharingResolution }; + } + + case 'SET_SCREEN_SHARING_FRAME_RATE': + { + const { screenSharingFrameRate } = action.payload; + + return { ...state, screenSharingFrameRate }; + } + default: return state; } diff --git a/app/src/translations/cn.json b/app/src/translations/cn.json index edaf1a5..658763b 100644 --- a/app/src/translations/cn.json +++ b/app/src/translations/cn.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "选择音频输出设备", "settings.cantSelectAudioOutput": "无法选择音频输出设备", "settings.resolution": "选择视频分辨率", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "房间布局", "settings.selectRoomLayout": "选择房间布局", "settings.advancedMode": "高级模式", diff --git a/app/src/translations/cs.json b/app/src/translations/cs.json index 0612fdd..83ee049 100644 --- a/app/src/translations/cs.json +++ b/app/src/translations/cs.json @@ -131,6 +131,9 @@ "settings.selectAudioOutput": "Vyberte audio output zařízení", "settings.cantSelectAudioOutput": "Není možno vybrat audio output zařízení", "settings.resolution": "Vyberte rozlišení vašeho videa", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Rozvržení místnosti", "settings.selectRoomLayout": "Vyberte rozvržení místnosti", "settings.advancedMode": "Pokočilý mód", diff --git a/app/src/translations/de.json b/app/src/translations/de.json index 6be8802..2b56a64 100644 --- a/app/src/translations/de.json +++ b/app/src/translations/de.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Wähle ein Audioausgabegerät", "settings.cantSelectAudioOutput": "Kann Audioausgabegerät nicht aktivieren", "settings.resolution": "Wähle eine Auflösung", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Raumlayout", "settings.selectRoomLayout": "Wähle ein Raumlayout", "settings.advancedMode": "Erweiterter Modus", diff --git a/app/src/translations/dk.json b/app/src/translations/dk.json index c6aabbc..d1067af 100644 --- a/app/src/translations/dk.json +++ b/app/src/translations/dk.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Vælg lydudgangsenhed", "settings.cantSelectAudioOutput": "Kan ikke vælge lydoutputenhed", "settings.resolution": "Vælg din videoopløsning", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Møde visning", "settings.selectRoomLayout": "Vælg møde visning", "settings.advancedMode": "Avanceret tilstand", diff --git a/app/src/translations/el.json b/app/src/translations/el.json index 7cb72ec..447e43f 100644 --- a/app/src/translations/el.json +++ b/app/src/translations/el.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Επιλέξτε συσκευή εξόδου ήχου", "settings.cantSelectAudioOutput": "Δεν είναι δυνατή η επιλογή συσκευής εξόδου ήχου", "settings.resolution": "Επιλέξτε την ανάλυση του video", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Περιβάλλον δωματίου", "settings.selectRoomLayout": "Επιλογή περιβάλλοντος δωματίου", "settings.advancedMode": "Προηγμένη λειτουργία", diff --git a/app/src/translations/en.json b/app/src/translations/en.json index f3e0c8e..367c99c 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Select audio output device", "settings.cantSelectAudioOutput": "Unable to select audio output device", "settings.resolution": "Select your video resolution", + "settings.frameRate": "Select your video frame rate", + "settings.screenSharingResolution": "Select your screen sharing resolution", + "settings.screenSharingFrameRate": "Select your screen sharing frame rate", "settings.layout": "Room layout", "settings.selectRoomLayout": "Select room layout", "settings.advancedMode": "Advanced mode", diff --git a/app/src/translations/es.json b/app/src/translations/es.json index 51e3838..0238430 100644 --- a/app/src/translations/es.json +++ b/app/src/translations/es.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Seleccionar dispositivo de salida de audio", "settings.cantSelectAudioOutput": "No se puede seleccionar el dispositivo de salida de audio", "settings.resolution": "Seleccione su resolución de imagen", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Disposición de la sala", "settings.selectRoomLayout": "Seleccione la disposición de la sala", "settings.advancedMode": "Modo avanzado", diff --git a/app/src/translations/fr.json b/app/src/translations/fr.json index ceb71f9..3557a71 100644 --- a/app/src/translations/fr.json +++ b/app/src/translations/fr.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Sélectionnez le périphérique de sortie audio", "settings.cantSelectAudioOutput": "Impossible de sélectionner le périphérique de sortie audio", "settings.resolution": "Sélectionnez votre résolution", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Mode d'affichage de la salle", "settings.selectRoomLayout": "Sélectionnez la présentation de la salle", "settings.advancedMode": "Mode avancé", diff --git a/app/src/translations/hr.json b/app/src/translations/hr.json index 8fcc484..ac7afa1 100644 --- a/app/src/translations/hr.json +++ b/app/src/translations/hr.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Odaberite izlazni uređaj za zvuk", "settings.cantSelectAudioOutput": "Nije moguće odabrati izlazni uređaj za zvuk", "settings.resolution": "Odaberi video rezoluciju", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Način prikaza", "settings.selectRoomLayout": "Odaberi način prikaza", "settings.advancedMode": "Napredne mogućnosti", diff --git a/app/src/translations/hu.json b/app/src/translations/hu.json index d7e08c8..eb07660 100644 --- a/app/src/translations/hu.json +++ b/app/src/translations/hu.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Válassz kimenti hangeszközt", "settings.cantSelectAudioOutput": "Nem sikerült a kimeneti hangeszközt kiválasztani", "settings.resolution": "Válaszd ki a videoeszközöd felbontását", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "A konferencia képkiosztása", "settings.selectRoomLayout": "Válaszd ki a konferencia képkiosztását", "settings.advancedMode": "Részletes információk", diff --git a/app/src/translations/it.json b/app/src/translations/it.json index 999683c..d771cb5 100644 --- a/app/src/translations/it.json +++ b/app/src/translations/it.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Seleziona il dispositivo di uscita audio", "settings.cantSelectAudioOutput": "Impossibile selezionare il dispositivo di uscita audio", "settings.resolution": "Seleziona risoluzione", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Aspetto stanza", "settings.selectRoomLayout": "Seleziona aspetto stanza", "settings.advancedMode": "Modalità avanzata", diff --git a/app/src/translations/lv.json b/app/src/translations/lv.json index fbd53a5..1d34640 100644 --- a/app/src/translations/lv.json +++ b/app/src/translations/lv.json @@ -126,6 +126,9 @@ "settings.selectAudio": "Izvēlieties skaņas ierīci", "settings.cantSelectAudio": "Nav iespējams lietot šo skaņas (audio) ierīci", "settings.resolution": "Iestatiet jūsu video izšķirtspēju", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Sapulces telpas izkārtojums", "settings.selectRoomLayout": "Iestatiet sapulces telpas izkārtojumu", "settings.advancedMode": "Advancētais režīms", diff --git a/app/src/translations/nb.json b/app/src/translations/nb.json index 92212c8..da3da4a 100644 --- a/app/src/translations/nb.json +++ b/app/src/translations/nb.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Velg lydutgangsenhet", "settings.cantSelectAudioOutput": "Kan ikke velge lydutgangsenhet", "settings.resolution": "Velg oppløsning", + "settings.frameRate": "Velg bildefrekvens", + "settings.screenSharingResolution": "Velg skjermdelingsoppløsning", + "settings.screenSharingFrameRate": "Velg skjermdelingsbildefrekvens", "settings.layout": "Møtelayout", "settings.selectRoomLayout": "Velg møtelayout", "settings.advancedMode": "Avansert modus", diff --git a/app/src/translations/pl.json b/app/src/translations/pl.json index 2e19540..da76b67 100644 --- a/app/src/translations/pl.json +++ b/app/src/translations/pl.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Wybierz urządzenie wyjściowe audio", "settings.cantSelectAudioOutput": "Nie można wybrać urządzenia wyjściowego audio", "settings.resolution": "Wybór rozdzielczości wideo", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Układ konferencji", "settings.selectRoomLayout": "Ustawienia układu konferencji", "settings.advancedMode": "Tryb zaawansowany", diff --git a/app/src/translations/pt.json b/app/src/translations/pt.json index 3bab3b7..0d1979d 100644 --- a/app/src/translations/pt.json +++ b/app/src/translations/pt.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Selecionar dispositivo de saída de áudio", "settings.cantSelectAudioOutput": "Não foi possível selecionar o dispositivo de saída de áudio", "settings.resolution": "Selecione a sua resolução de vídeo", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Disposição da sala", "settings.selectRoomLayout": "Seleccione a disposição da sala", "settings.advancedMode": "Modo avançado", diff --git a/app/src/translations/ro.json b/app/src/translations/ro.json index 2b22872..65481a9 100644 --- a/app/src/translations/ro.json +++ b/app/src/translations/ro.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Selectați dispozitivul de ieșire audio", "settings.cantSelectAudioOutput": "Imposibil de selectat dispozitivul de ieșire audio", "settings.resolution": "Selectează rezoluția video", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Aspectul camerei video", "settings.selectRoomLayout": "Selectează spectul camerei video", "settings.advancedMode": "Mod avansat", diff --git a/app/src/translations/tr.json b/app/src/translations/tr.json index f9264ad..c20a45a 100644 --- a/app/src/translations/tr.json +++ b/app/src/translations/tr.json @@ -129,6 +129,9 @@ "settings.selectAudio": "Ses aygıtını seç", "settings.cantSelectAudio": "Ses aygıtı seçilemiyor", "settings.resolution": "Video çözünürlüğü ayarla", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Oda düzeni", "settings.selectRoomLayout": "Oda düzeni seç", "settings.advancedMode": "Detaylı mod", diff --git a/app/src/translations/tw.json b/app/src/translations/tw.json index b4957e4..ce5392d 100644 --- a/app/src/translations/tw.json +++ b/app/src/translations/tw.json @@ -131,6 +131,9 @@ "settings.selectAudioOutput": "選擇音訊輸出設備", "settings.cantSelectAudioOutput": "無法選擇音訊輸出設備", "settings.resolution": "選擇視訊解析度", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "房間佈局", "settings.selectRoomLayout": "選擇房間佈局", "settings.advancedMode": "進階模式", diff --git a/app/src/translations/uk.json b/app/src/translations/uk.json index 2cc6249..8bd4a2c 100644 --- a/app/src/translations/uk.json +++ b/app/src/translations/uk.json @@ -132,6 +132,9 @@ "settings.selectAudioOutput": "Виберіть пристрій аудіовиходу", "settings.cantSelectAudioOutput": "Неможливо вибрати аудіо вихідний пристрій", "settings.resolution": "Виберіть роздільну здатність відео", + "settings.frameRate": null, + "settings.screenSharingResolution": null, + "settings.screenSharingFrameRate": null, "settings.layout": "Розміщення кімнати", "settings.selectRoomLayout": "Вибір розташування кімнати", "settings.advancedMode": "Розширений режим",