Adding frame rate option to videos. Make resolution and frame rate of screen sharing configurable.

auto_join_3.3
Håvar Aambø Fosstveit 2020-05-22 00:20:15 +02:00
parent b3ad0a44c2
commit d1ffe6cd43
26 changed files with 361 additions and 130 deletions

View File

@ -27,20 +27,33 @@ var config =
}, },
/** /**
* If defaultResolution is set, it will override user settings when joining: * Resolutions:
*
* low ~ 320x240 * low ~ 320x240
* medium ~ 640x480 * medium ~ 640x480
* high ~ 1280x720 * high ~ 1280x720
* veryhigh ~ 1920x1080 * veryhigh ~ 1920x1080
* ultra ~ 3840x2560 * 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 // Enable or disable simulcast for webcam video
simulcast : true, simulcast : true,
// Enable or disable simulcast for screen sharing video // Enable or disable simulcast for screen sharing video
simulcastSharing : false, simulcastSharing : false,
// Simulcast encoding layers and levels // Simulcast encoding layers and levels
simulcastEncodings : simulcastEncodings :
[ [
{ scaleResolutionDownBy: 4 }, { scaleResolutionDownBy: 4 },
{ scaleResolutionDownBy: 2 }, { scaleResolutionDownBy: 2 },

View File

@ -1192,17 +1192,19 @@ export default class RoomClient
sampleSize sampleSize
} = store.getState().settings; } = store.getState().settings;
if (restart || !this._micProducer) if (restart)
{ {
this.disconnectLocalHark(); this.disconnectLocalHark();
store.dispatch(settingsActions.setSelectedAudioDevice(deviceId));
if (this._micProducer) if (this._micProducer)
await this.disableMic(); await this.disableMic();
const stream = await navigator.mediaDevices.getUserMedia( const stream = await navigator.mediaDevices.getUserMedia(
{ {
audio : { audio : {
deviceId : { ideal: device.deviceId }, deviceId : { ideal: deviceId },
sampleRate, sampleRate,
channelCount, channelCount,
volume, volume,
@ -1264,7 +1266,7 @@ export default class RoomClient
this.connectLocalHark(track); this.connectLocalHark(track);
} }
else else if (this._micProducer)
{ {
({ track } = this._micProducer); ({ track } = this._micProducer);
@ -1318,13 +1320,19 @@ export default class RoomClient
store.dispatch(meActions.setAudioInProgress(false)); 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( logger.debug(
'updateWebcam() [restart:"%s", newDeviceId:"%s", newResolution:"%s"]', 'updateWebcam() [restart:"%s", newDeviceId:"%s", newResolution:"%s", newFrameRate:"%s"]',
restart, restart,
newDeviceId, newDeviceId,
newResolution newResolution,
newFrameRate
); );
let track; let track;
@ -1343,6 +1351,9 @@ export default class RoomClient
if (newResolution) if (newResolution)
store.dispatch(settingsActions.setVideoResolution(newResolution)); store.dispatch(settingsActions.setVideoResolution(newResolution));
if (newFrameRate)
store.dispatch(settingsActions.setVideoFrameRate(newFrameRate));
store.dispatch(meActions.setWebcamInProgress(true)); store.dispatch(meActions.setWebcamInProgress(true));
const deviceId = await this._getWebcamDeviceId(); const deviceId = await this._getWebcamDeviceId();
@ -1351,10 +1362,15 @@ export default class RoomClient
if (!device) if (!device)
throw new Error('no webcam devices'); 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) if (this._webcamProducer)
await this.disableWebcam(); await this.disableWebcam();
@ -1362,8 +1378,9 @@ export default class RoomClient
{ {
video : video :
{ {
deviceId : { ideal: device.deviceId }, deviceId : { ideal: deviceId },
...VIDEO_CONSTRAINS[resolution] ...VIDEO_CONSTRAINS[resolution],
frameRate
} }
}); });
@ -1441,13 +1458,14 @@ export default class RoomClient
this.disableWebcam(); this.disableWebcam();
}); });
} }
else else if (this._webcamProducer)
{ {
({ track } = this._webcamProducer); ({ track } = this._webcamProducer);
await track.applyConstraints( await track.applyConstraints(
{ {
...VIDEO_CONSTRAINS[resolution] ...VIDEO_CONSTRAINS[resolution],
frameRate
} }
); );
@ -1458,13 +1476,12 @@ export default class RoomClient
await track.applyConstraints( await track.applyConstraints(
{ {
...VIDEO_CONSTRAINS[resolution] ...VIDEO_CONSTRAINS[resolution],
frameRate
} }
); );
} }
} }
await this._updateWebcams();
} }
catch (error) catch (error)
{ {
@ -3559,24 +3576,16 @@ export default class RoomClient
store.dispatch(meActions.setAudioInProgress(false)); store.dispatch(meActions.setAudioInProgress(false));
} }
async enableScreenSharing() async updateScreenSharing({
restart = false,
newResolution = null,
newFrameRate = null
} = {})
{ {
logger.debug('enableScreenSharing()'); logger.debug('updateScreenSharing() [restart:"%s"]', restart);
if (this._screenSharingProducer)
return;
if (!this._mediasoupDevice.canProduce('video'))
{
logger.error('enableScreenSharing() | cannot produce video');
return;
}
let track; let track;
store.dispatch(meActions.setScreenShareInProgress(true));
try try
{ {
const available = this._screenSharing.isScreenShareAvailable(); const available = this._screenSharing.isScreenShareAvailable();
@ -3584,100 +3593,126 @@ export default class RoomClient
if (!available) if (!available)
throw new Error('screen sharing not available'); throw new Error('screen sharing not available');
const stream = await this._screenSharing.start({ if (!this._mediasoupDevice.canProduce('video'))
width : 1920, throw new Error('cannot produce video');
height : 1080,
frameRate : 5
});
([ 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 stream = await this._screenSharing.start({
const firstVideoCodec = this._mediasoupDevice ...VIDEO_CONSTRAINS[screenSharingResolution],
.rtpCapabilities frameRate : screenSharingFrameRate
.codecs });
.find((c) => c.kind === 'video');
let encodings; ([ track ] = stream.getVideoTracks());
if (firstVideoCodec.mimeType.toLowerCase() === 'video/vp9') if (this._useSharingSimulcast)
{ {
encodings = VIDEO_SVC_ENCODINGS; // If VP9 is the only available video codec then use SVC.
} const firstVideoCodec = this._mediasoupDevice
else if ('simulcastEncodings' in window.config) .rtpCapabilities
{ .codecs
encodings = window.config.simulcastEncodings .find((c) => c.kind === 'video');
.map((encoding) => ({ ...encoding, dtx: true }));
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 else
{ {
encodings = VIDEO_SIMULCAST_ENCODINGS this._screenSharingProducer = await this._sendTransport.produce({
.map((encoding) => ({ ...encoding, dtx: true }));
}
this._screenSharingProducer = await this._sendTransport.produce(
{
track, track,
encodings,
codecOptions :
{
videoGoogleStartBitrate : 1000
},
appData : appData :
{ {
source : 'screen' source : 'screen'
} }
}); });
} }
else
{ store.dispatch(producerActions.addProducer(
this._screenSharingProducer = await this._sendTransport.produce({
track,
appData :
{ {
source : 'screen' id : this._screenSharingProducer.id,
} deviceLabel : 'screen',
}); source : 'screen',
} paused : this._screenSharingProducer.paused,
track : this._screenSharingProducer.track,
store.dispatch(producerActions.addProducer( rtpParameters : this._screenSharingProducer.rtpParameters,
{ codec : this._screenSharingProducer.rtpParameters.codecs[0].mimeType.split('/')[1]
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'
})
})); }));
this.disableScreenSharing() this._screenSharingProducer.on('transportclose', () =>
.catch(() => {}); {
}); 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) catch (error)
{ {
logger.error('enableScreenSharing() [error:"%o"]', error); logger.error('updateScreenSharing() [error:"%o"]', error);
store.dispatch(requestActions.notify( store.dispatch(requestActions.notify(
{ {

View File

@ -22,6 +22,24 @@ export const setVideoResolution = (resolution) =>
payload : { 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) => export const setDisplayName = (displayName) =>
({ ({
type : 'SET_DISPLAY_NAME', type : 'SET_DISPLAY_NAME',

View File

@ -599,7 +599,7 @@ const Me = (props) =>
onClick={() => onClick={() =>
{ {
if (screenState === 'off') if (screenState === 'off')
roomClient.enableScreenSharing(); roomClient.updateScreenSharing({ restart: true });
else if (screenState === 'on') else if (screenState === 'on')
roomClient.disableScreenSharing(); roomClient.disableScreenSharing();
}} }}
@ -631,7 +631,7 @@ const Me = (props) =>
onClick={() => onClick={() =>
{ {
if (screenState === 'off') if (screenState === 'off')
roomClient.enableScreenSharing(); roomClient.updateScreenSharing({ restart: true });
else if (screenState === 'on') else if (screenState === 'on')
roomClient.disableScreenSharing(); roomClient.disableScreenSharing();
}} }}

View File

@ -243,7 +243,7 @@ const ButtonControlBar = (props) =>
onClick={() => onClick={() =>
{ {
if (screenState === 'off') if (screenState === 'off')
roomClient.enableScreenSharing(); roomClient.updateScreenSharing({ restart: true });
else if (screenState === 'on') else if (screenState === 'on')
roomClient.disableScreenSharing(); roomClient.disableScreenSharing();
}} }}

View File

@ -233,6 +233,90 @@ const MediaSettings = ({
/> />
</FormHelperText> </FormHelperText>
</FormControl> </FormControl>
<FormControl className={classes.formControl}>
<Select
value={settings.frameRate || ''}
onChange={(event) =>
{
if (event.target.value)
roomClient.updateWebcam({ newFrameRate: event.target.value });
}}
name='Frame rate'
autoWidth
className={classes.selectEmpty}
>
{ [ 1, 5, 10, 15, 20, 25, 30 ].map((frameRate) =>
{
return (
<MenuItem key={frameRate} value={frameRate}>
{frameRate}
</MenuItem>
);
})}
</Select>
<FormHelperText>
<FormattedMessage
id='settings.frameRate'
defaultMessage='Select your video frame rate'
/>
</FormHelperText>
</FormControl>
<FormControl className={classes.formControl}>
<Select
value={settings.screenSharingResolution || ''}
onChange={(event) =>
{
if (event.target.value)
roomClient.updateScreenSharing({ newResolution: event.target.value });
}}
name='Screen sharing resolution'
autoWidth
className={classes.selectEmpty}
>
{resolutions.map((resolution, index) =>
{
return (
<MenuItem key={index} value={resolution.value}>
{resolution.label}
</MenuItem>
);
})}
</Select>
<FormHelperText>
<FormattedMessage
id='settings.screenSharingResolution'
defaultMessage='Select your screen sharing resolution'
/>
</FormHelperText>
</FormControl>
<FormControl className={classes.formControl}>
<Select
value={settings.screenSharingFrameRate || ''}
onChange={(event) =>
{
if (event.target.value)
roomClient.updateScreenSharing({ newFrameRate: event.target.value });
}}
name='Frame rate'
autoWidth
className={classes.selectEmpty}
>
{ [ 1, 5, 10, 15, 20, 25, 30 ].map((screenSharingFrameRate) =>
{
return (
<MenuItem key={screenSharingFrameRate} value={screenSharingFrameRate}>
{screenSharingFrameRate}
</MenuItem>
);
})}
</Select>
<FormHelperText>
<FormattedMessage
id='settings.screenSharingFrameRate'
defaultMessage='Select your screen sharing frame rate'
/>
</FormHelperText>
</FormControl>
</form> </form>
<form className={classes.setting} autoComplete='off'> <form className={classes.setting} autoComplete='off'>
<FormControl className={classes.formControl}> <FormControl className={classes.formControl}>

View File

@ -1,27 +1,30 @@
const initialState = const initialState =
{ {
displayName : 'Guest', displayName : 'Guest',
selectedWebcam : null, selectedWebcam : null,
selectedAudioDevice : null, selectedAudioDevice : null,
advancedMode : false, advancedMode : false,
sampleRate : 48000, sampleRate : 48000,
channelCount : 1, channelCount : 1,
volume : 1.0, volume : 1.0,
autoGainControl : false, autoGainControl : false,
echoCancellation : true, echoCancellation : true,
noiseSuppression : true, noiseSuppression : true,
voiceActivatedUnmute : false, voiceActivatedUnmute : false,
noiseThreshold : -50, noiseThreshold : -50,
sampleSize : 16, sampleSize : 16,
// low, medium, high, veryhigh, ultra // low, medium, high, veryhigh, ultra
resolution : window.config.defaultResolution || 'medium', resolution : window.config.defaultResolution || 'medium',
lastN : 4, frameRate : window.config.defaultFrameRate || 15,
permanentTopBar : true, screenSharingResolution : window.config.defaultScreenResolution || 'veryhigh',
hiddenControls : false, screenSharingFrameRate : window.config.defaultScreenSharingFrameRate || 5,
showNotifications : true, lastN : 4,
notificationSounds : true, permanentTopBar : true,
buttonControlBar : window.config.buttonControlBar || false, hiddenControls : false,
drawerOverlayed : window.config.drawerOverlayed || true, showNotifications : true,
notificationSounds : true,
buttonControlBar : window.config.buttonControlBar || false,
drawerOverlayed : window.config.drawerOverlayed || true,
...window.config.defaultAudio ...window.config.defaultAudio
}; };
@ -184,6 +187,27 @@ const settings = (state = initialState, action) =>
return { ...state, resolution }; 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: default:
return state; return state;
} }

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "选择音频输出设备", "settings.selectAudioOutput": "选择音频输出设备",
"settings.cantSelectAudioOutput": "无法选择音频输出设备", "settings.cantSelectAudioOutput": "无法选择音频输出设备",
"settings.resolution": "选择视频分辨率", "settings.resolution": "选择视频分辨率",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "房间布局", "settings.layout": "房间布局",
"settings.selectRoomLayout": "选择房间布局", "settings.selectRoomLayout": "选择房间布局",
"settings.advancedMode": "高级模式", "settings.advancedMode": "高级模式",

View File

@ -131,6 +131,9 @@
"settings.selectAudioOutput": "Vyberte audio output zařízení", "settings.selectAudioOutput": "Vyberte audio output zařízení",
"settings.cantSelectAudioOutput": "Není možno vybrat audio output zařízení", "settings.cantSelectAudioOutput": "Není možno vybrat audio output zařízení",
"settings.resolution": "Vyberte rozlišení vašeho videa", "settings.resolution": "Vyberte rozlišení vašeho videa",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Rozvržení místnosti", "settings.layout": "Rozvržení místnosti",
"settings.selectRoomLayout": "Vyberte rozvržení místnosti", "settings.selectRoomLayout": "Vyberte rozvržení místnosti",
"settings.advancedMode": "Pokočilý mód", "settings.advancedMode": "Pokočilý mód",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Wähle ein Audioausgabegerät", "settings.selectAudioOutput": "Wähle ein Audioausgabegerät",
"settings.cantSelectAudioOutput": "Kann Audioausgabegerät nicht aktivieren", "settings.cantSelectAudioOutput": "Kann Audioausgabegerät nicht aktivieren",
"settings.resolution": "Wähle eine Auflösung", "settings.resolution": "Wähle eine Auflösung",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Raumlayout", "settings.layout": "Raumlayout",
"settings.selectRoomLayout": "Wähle ein Raumlayout", "settings.selectRoomLayout": "Wähle ein Raumlayout",
"settings.advancedMode": "Erweiterter Modus", "settings.advancedMode": "Erweiterter Modus",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Vælg lydudgangsenhed", "settings.selectAudioOutput": "Vælg lydudgangsenhed",
"settings.cantSelectAudioOutput": "Kan ikke vælge lydoutputenhed", "settings.cantSelectAudioOutput": "Kan ikke vælge lydoutputenhed",
"settings.resolution": "Vælg din videoopløsning", "settings.resolution": "Vælg din videoopløsning",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Møde visning", "settings.layout": "Møde visning",
"settings.selectRoomLayout": "Vælg møde visning", "settings.selectRoomLayout": "Vælg møde visning",
"settings.advancedMode": "Avanceret tilstand", "settings.advancedMode": "Avanceret tilstand",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Επιλέξτε συσκευή εξόδου ήχου", "settings.selectAudioOutput": "Επιλέξτε συσκευή εξόδου ήχου",
"settings.cantSelectAudioOutput": "Δεν είναι δυνατή η επιλογή συσκευής εξόδου ήχου", "settings.cantSelectAudioOutput": "Δεν είναι δυνατή η επιλογή συσκευής εξόδου ήχου",
"settings.resolution": "Επιλέξτε την ανάλυση του video", "settings.resolution": "Επιλέξτε την ανάλυση του video",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Περιβάλλον δωματίου", "settings.layout": "Περιβάλλον δωματίου",
"settings.selectRoomLayout": "Επιλογή περιβάλλοντος δωματίου", "settings.selectRoomLayout": "Επιλογή περιβάλλοντος δωματίου",
"settings.advancedMode": "Προηγμένη λειτουργία", "settings.advancedMode": "Προηγμένη λειτουργία",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Select audio output device", "settings.selectAudioOutput": "Select audio output device",
"settings.cantSelectAudioOutput": "Unable to select audio output device", "settings.cantSelectAudioOutput": "Unable to select audio output device",
"settings.resolution": "Select your video resolution", "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.layout": "Room layout",
"settings.selectRoomLayout": "Select room layout", "settings.selectRoomLayout": "Select room layout",
"settings.advancedMode": "Advanced mode", "settings.advancedMode": "Advanced mode",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Seleccionar dispositivo de salida de audio", "settings.selectAudioOutput": "Seleccionar dispositivo de salida de audio",
"settings.cantSelectAudioOutput": "No se puede seleccionar el 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.resolution": "Seleccione su resolución de imagen",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Disposición de la sala", "settings.layout": "Disposición de la sala",
"settings.selectRoomLayout": "Seleccione la disposición de la sala", "settings.selectRoomLayout": "Seleccione la disposición de la sala",
"settings.advancedMode": "Modo avanzado", "settings.advancedMode": "Modo avanzado",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Sélectionnez le périphérique de sortie audio", "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.cantSelectAudioOutput": "Impossible de sélectionner le périphérique de sortie audio",
"settings.resolution": "Sélectionnez votre résolution", "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.layout": "Mode d'affichage de la salle",
"settings.selectRoomLayout": "Sélectionnez la présentation de la salle", "settings.selectRoomLayout": "Sélectionnez la présentation de la salle",
"settings.advancedMode": "Mode avancé", "settings.advancedMode": "Mode avancé",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Odaberite izlazni uređaj za zvuk", "settings.selectAudioOutput": "Odaberite izlazni uređaj za zvuk",
"settings.cantSelectAudioOutput": "Nije moguće odabrati izlazni uređaj za zvuk", "settings.cantSelectAudioOutput": "Nije moguće odabrati izlazni uređaj za zvuk",
"settings.resolution": "Odaberi video rezoluciju", "settings.resolution": "Odaberi video rezoluciju",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Način prikaza", "settings.layout": "Način prikaza",
"settings.selectRoomLayout": "Odaberi način prikaza", "settings.selectRoomLayout": "Odaberi način prikaza",
"settings.advancedMode": "Napredne mogućnosti", "settings.advancedMode": "Napredne mogućnosti",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Válassz kimenti hangeszközt", "settings.selectAudioOutput": "Válassz kimenti hangeszközt",
"settings.cantSelectAudioOutput": "Nem sikerült a kimeneti hangeszközt kiválasztani", "settings.cantSelectAudioOutput": "Nem sikerült a kimeneti hangeszközt kiválasztani",
"settings.resolution": "Válaszd ki a videoeszközöd felbontását", "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.layout": "A konferencia képkiosztása",
"settings.selectRoomLayout": "Válaszd ki a konferencia képkiosztását", "settings.selectRoomLayout": "Válaszd ki a konferencia képkiosztását",
"settings.advancedMode": "Részletes információk", "settings.advancedMode": "Részletes információk",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Seleziona il dispositivo di uscita audio", "settings.selectAudioOutput": "Seleziona il dispositivo di uscita audio",
"settings.cantSelectAudioOutput": "Impossibile selezionare il dispositivo di uscita audio", "settings.cantSelectAudioOutput": "Impossibile selezionare il dispositivo di uscita audio",
"settings.resolution": "Seleziona risoluzione", "settings.resolution": "Seleziona risoluzione",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Aspetto stanza", "settings.layout": "Aspetto stanza",
"settings.selectRoomLayout": "Seleziona aspetto stanza", "settings.selectRoomLayout": "Seleziona aspetto stanza",
"settings.advancedMode": "Modalità avanzata", "settings.advancedMode": "Modalità avanzata",

View File

@ -126,6 +126,9 @@
"settings.selectAudio": "Izvēlieties skaņas ierīci", "settings.selectAudio": "Izvēlieties skaņas ierīci",
"settings.cantSelectAudio": "Nav iespējams lietot šo skaņas (audio) ierīci", "settings.cantSelectAudio": "Nav iespējams lietot šo skaņas (audio) ierīci",
"settings.resolution": "Iestatiet jūsu video izšķirtspēju", "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.layout": "Sapulces telpas izkārtojums",
"settings.selectRoomLayout": "Iestatiet sapulces telpas izkārtojumu", "settings.selectRoomLayout": "Iestatiet sapulces telpas izkārtojumu",
"settings.advancedMode": "Advancētais režīms", "settings.advancedMode": "Advancētais režīms",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Velg lydutgangsenhet", "settings.selectAudioOutput": "Velg lydutgangsenhet",
"settings.cantSelectAudioOutput": "Kan ikke velge lydutgangsenhet", "settings.cantSelectAudioOutput": "Kan ikke velge lydutgangsenhet",
"settings.resolution": "Velg oppløsning", "settings.resolution": "Velg oppløsning",
"settings.frameRate": "Velg bildefrekvens",
"settings.screenSharingResolution": "Velg skjermdelingsoppløsning",
"settings.screenSharingFrameRate": "Velg skjermdelingsbildefrekvens",
"settings.layout": "Møtelayout", "settings.layout": "Møtelayout",
"settings.selectRoomLayout": "Velg møtelayout", "settings.selectRoomLayout": "Velg møtelayout",
"settings.advancedMode": "Avansert modus", "settings.advancedMode": "Avansert modus",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Wybierz urządzenie wyjściowe audio", "settings.selectAudioOutput": "Wybierz urządzenie wyjściowe audio",
"settings.cantSelectAudioOutput": "Nie można wybrać urządzenia wyjściowego audio", "settings.cantSelectAudioOutput": "Nie można wybrać urządzenia wyjściowego audio",
"settings.resolution": "Wybór rozdzielczości wideo", "settings.resolution": "Wybór rozdzielczości wideo",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Układ konferencji", "settings.layout": "Układ konferencji",
"settings.selectRoomLayout": "Ustawienia układu konferencji", "settings.selectRoomLayout": "Ustawienia układu konferencji",
"settings.advancedMode": "Tryb zaawansowany", "settings.advancedMode": "Tryb zaawansowany",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Selecionar dispositivo de saída de áudio", "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.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.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.layout": "Disposição da sala",
"settings.selectRoomLayout": "Seleccione a disposição da sala", "settings.selectRoomLayout": "Seleccione a disposição da sala",
"settings.advancedMode": "Modo avançado", "settings.advancedMode": "Modo avançado",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Selectați dispozitivul de ieșire audio", "settings.selectAudioOutput": "Selectați dispozitivul de ieșire audio",
"settings.cantSelectAudioOutput": "Imposibil de selectat dispozitivul de ieșire audio", "settings.cantSelectAudioOutput": "Imposibil de selectat dispozitivul de ieșire audio",
"settings.resolution": "Selectează rezoluția video", "settings.resolution": "Selectează rezoluția video",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Aspectul camerei video", "settings.layout": "Aspectul camerei video",
"settings.selectRoomLayout": "Selectează spectul camerei video", "settings.selectRoomLayout": "Selectează spectul camerei video",
"settings.advancedMode": "Mod avansat", "settings.advancedMode": "Mod avansat",

View File

@ -129,6 +129,9 @@
"settings.selectAudio": "Ses aygıtını seç", "settings.selectAudio": "Ses aygıtını seç",
"settings.cantSelectAudio": "Ses aygıtı seçilemiyor", "settings.cantSelectAudio": "Ses aygıtı seçilemiyor",
"settings.resolution": "Video çözünürlüğü ayarla", "settings.resolution": "Video çözünürlüğü ayarla",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Oda düzeni", "settings.layout": "Oda düzeni",
"settings.selectRoomLayout": "Oda düzeni seç", "settings.selectRoomLayout": "Oda düzeni seç",
"settings.advancedMode": "Detaylı mod", "settings.advancedMode": "Detaylı mod",

View File

@ -131,6 +131,9 @@
"settings.selectAudioOutput": "選擇音訊輸出設備", "settings.selectAudioOutput": "選擇音訊輸出設備",
"settings.cantSelectAudioOutput": "無法選擇音訊輸出設備", "settings.cantSelectAudioOutput": "無法選擇音訊輸出設備",
"settings.resolution": "選擇視訊解析度", "settings.resolution": "選擇視訊解析度",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "房間佈局", "settings.layout": "房間佈局",
"settings.selectRoomLayout": "選擇房間佈局", "settings.selectRoomLayout": "選擇房間佈局",
"settings.advancedMode": "進階模式", "settings.advancedMode": "進階模式",

View File

@ -132,6 +132,9 @@
"settings.selectAudioOutput": "Виберіть пристрій аудіовиходу", "settings.selectAudioOutput": "Виберіть пристрій аудіовиходу",
"settings.cantSelectAudioOutput": "Неможливо вибрати аудіо вихідний пристрій", "settings.cantSelectAudioOutput": "Неможливо вибрати аудіо вихідний пристрій",
"settings.resolution": "Виберіть роздільну здатність відео", "settings.resolution": "Виберіть роздільну здатність відео",
"settings.frameRate": null,
"settings.screenSharingResolution": null,
"settings.screenSharingFrameRate": null,
"settings.layout": "Розміщення кімнати", "settings.layout": "Розміщення кімнати",
"settings.selectRoomLayout": "Вибір розташування кімнати", "settings.selectRoomLayout": "Вибір розташування кімнати",
"settings.advancedMode": "Розширений режим", "settings.advancedMode": "Розширений режим",