Electron中为所有Browser View替换默认摄像头的方案求助
问题:Electron中切换摄像头后同步所有Browser View设备失效
当前需求是切换摄像头时同步修改所有Browser View的摄像头设备。目前已能正确识别摄像头设备并将目标deviceId传递至Browser View,但仅本地预览会切换设备,发起视频通话时仍使用默认摄像头。
尝试过两种解决思路但未找到可行实现方法:
- 在加载Browser View前修改默认媒体设备
- 移除多余媒体设备仅保留目标设备(尝试过
select-hid-device方法无效)
相关代码
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) })
内容的提问来源于stack exchange,提问作者Alexei Romanov
相关产品推荐
相关产品推荐

