TypeScript使我无法将正确的约束传递给getUserMedia

jogvjijk  于 2022-11-26  发布在  TypeScript
关注(0)|答案(2)|浏览(132)

我正在尝试让一个屏幕流到我的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
}
vktxenjb

vktxenjb1#

@Scuba Kay我可以给你一个变通的建议。你可以只更换

navigator.mediaDevices.getUserMedia(constraints)

(<any> navigator.mediaDevices).getUserMedia(constraints)

它会起作用的。

g0czyy6m

g0czyy6m2#

要添加更多有关@Manthan Makani解决方案的内容,请查看:https://github.com/microsoft/TypeScript/issues/22897
TS遵循最新的WebRTC规范。由于WebRTC规范还不是官方标准,每个浏览器的API可能会有差异。
Chrome似乎仍然遵循一个偏离的标准。所以可以通过将mediaDevices定义为'any'并定义与Chrome实现一致的您自己的方法来解决这个问题。这将满足Typescript编译器。注意:我们特别遵循Chrome的实现,因为Electron在Chromium浏览器上运行。

const mediaDevices = navigator.mediaDevices as any;
mediaDevices.getUserMedia({
    audio: false,
    video: {
        mandatory: {
            chromeMediaSource: 'desktop',
            chromeMediaSourceId: source.id,
            minWidth: 1280,
            maxWidth: 1280,
            minHeight: 720,
            maxHeight: 720
        }
    }
}).then((stream: MediaStream) => {
    // do stuff
    stream.getTracks()[0].stop();
});

相关问题