Замена стандартной камеры в electron для всех browser view
Есть задача - менять камеры во всех browser view при смене камеры в browser view. Сейчас я корректно определяю камеры и пробрасываю в browser view нужные deviceId.
Проблема в том что в таком случае меняется только при показе для самого пользователя, но если позвонить кому-то по видеосвязи то останется стандартная вебка.
Вижу два решения:
- Изменить дефолтное медиа устройства до загрузки browser view
- Удалить все ненужные медиа девайсы, чтобы осталось только 1 устройство нужное.
Ни то ни то решение я не смог найти. Прошу помощи у вас :)
render:
const [devices, setDevices] = useState([])
const [currentDevice, setCurrentDevice] = useState({audio: '', video: ''})
const initDevices = () => {
navigator.mediaDevices.getUserMedia({audio: true, video: true})
.then(() => navigator.mediaDevices.enumerateDevices())
.then((deviceInfo) => {
setDevices(deviceInfo.map(item => ({
kind: item.kind,
label: item.label,
deviceId: item.deviceId
})))
}).catch(console.error)
}
useEffect(() => {
initDevices()
}, [])
const onChangeHandler = ({e, type}) => {
setCurrentDevice((prev) => ({...prev, [type]: e.target.value}))
electron.setMediaDevices(e.target.value)
}
main.js
for (const item in browserViewList) {
if (!browserViewList[item]) continue
browserViewList[item].forEach((item) => {
item.browserView.webContents.send(events.setMediaDevices, params)
})
}
preload.js
ipcRenderer.on(events.setMediaDevices, (e, device) => {
navigator.mediaDevices.enumerateDevices().then((devicesInfo) => {
const audio = devicesInfo.find(item => item.label === device)?.deviceId
const video = devicesInfo.find(item => item.label === device)?.deviceId
return navigator.mediaDevices.getUserMedia({
audio: {deviceId: audio ? {exact: audio} : undefined},
video: {deviceId: video ? {exact: video} : undefined}
})
}).then(stream => {
const video = document.querySelector('#video_video')
if (!video) return
video.srcObject = stream
video.play()
}).catch(console.error)
})