我正在尝试让一个屏幕流到我的Angular 5电子应用程序。我正在使用由电子提供的desktopCapturer。这是我的代码:
loadCurrentScreensource() {
desktopCapturer.getSources({
types: [
'window',
'screen'
]
}, (error, sources) => {
if (error) {
throw error;
}
console.log('Finding screen: ' + this.selectedScreenSource);
console.log(sources);
for (let i = 0; i < sources.length; ++i) {
if (sources[i].id === this.selectedScreenSource.id) {
console.log('Found screen');
const constraints = {
audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: sources[i].id,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720
}
}
};
navigator.mediaDevices.getUserMedia(constraints)
.then((stream) => this.handleStream(stream))
.catch((e) => this.handleError(e));
return;
}
}
}
);
}
根据文档here,我需要使用强制部分的约束,以获得正确的流。然而,TypeScript给我的错误,属性'video'的类型是不兼容的。如果我输入以下约束,我有时会得到我的网络摄像头的流:
{ width: 1280, height: 720 }
mozzilla.org的文档从来没有提到强制部分,所以我想我忽略了一些导入或让getUserMedia接受我的约束的东西。或者,也许getUserMedia已经被修改了,但文档没有?
我哪里做错了?
**[编辑]
此外,MediaTrackConstraints的文档没有强制属性,也没有chromeMediaSourceId属性。但是,这与Electron链接到的文档相同。
[编辑2]
我发现了deviceId约束,这是我以前忽略的。当我使用以下约束时,我仍然得到网络摄像头流。
video: {
width: 1280,
height: 720,
deviceId: this.selectedScreenSource.id
}
2条答案
按热度按时间vktxenjb1#
@Scuba Kay我可以给你一个变通的建议。你可以只更换
与
它会起作用的。
g0czyy6m2#
要添加更多有关@Manthan Makani解决方案的内容,请查看:https://github.com/microsoft/TypeScript/issues/22897
TS遵循最新的WebRTC规范。由于WebRTC规范还不是官方标准,每个浏览器的API可能会有差异。
Chrome似乎仍然遵循一个偏离的标准。所以可以通过将
mediaDevices
定义为'any'并定义与Chrome实现一致的您自己的方法来解决这个问题。这将满足Typescript编译器。注意:我们特别遵循Chrome的实现,因为Electron在Chromium浏览器上运行。